【MySql】 mysql的组从复制

news2024/12/26 15:12:47

 mysql的组从复制

配置mastesr

[root@mysql-node10 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
log-bin=mysql-bin
server-id=1
[root@mysql-node10 ~]# /etc/init.d/mysqld restart
#进入数据库配置用户权限
[root@mysql-node10 ~]# mysql -plee
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.44-log Source distribution
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'lee'; ##生成专门用来做复制的用
户,此用户是用于slave端做认证用
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%'; ##对这个用户进行授权
mysql> SHOW MASTER STATUS; ##查看master的状态
+------------------+----------+--------------+------------------+----------------
---+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
Executed_Gtid_Set |
+------------------+----------+--------------+------------------+----------------
---+
| mysql-bin.000001 | 350 | | |
|
+------------------+----------+--------------+------------------+----------------
---+
1 row in set (0.00 sec)
[root@mysql-node10 ~]# cd /data/mysql/
[root@mysql-node10 mysql]# mysqlbinlog mysql-bin.000001 -vv ##查看二进制日志

修改主配置文件:修改之后再启动

进入数据库进行编写:

创建一个名为 repl 的用户,该用户可以从任何主机(% 表示任何主机)连接到MySQL服务器,并且设置其密码为 xia

在MySQL中,GRANT REPLICATION SLAVE 语句用于授权一个用户(在这个例子中是 repl)作为复制从服务器的权限。这个权限允许该用户连接到主服务器,并请求二进制日志事件,以便在从服务器上重放这些事件,从而实现数据复制。

你给出的命令 GRANT REPLICATION SLAVE ON *.* TO repl@'%'; 的含义是:

  • GRANT REPLICATION SLAVE:授予复制从服务器的权限。
  • ON *.*:这个权限适用于所有数据库(第一个 *)和所有表(第二个 *)。
  • TO repl@'%':这个权限被授予用户 repl,该用户可以从任何主机(% 表示任何主机)连接到MySQL服务器。

配置salve

编辑配置文件并重启:

进入数据库,与其master建立联系

 测试:

在master上建立数据库,在建表

在slave上查看:

如果出现则代表咱们的这个主复数据库依旧搭好,如果没有出现则反之

当有数据时添加slave2

创建新的mysql3:以上配置

在主的mysql中将上面编写的数据库传给MySQL3(slave2)

mysql3/(slave2)拉平数据库

配置好slave:

测试:

master写入:

mysql2:

mysql3:

延迟复制
延迟复制时用来控制 sql 线程的,和 i/o 线程无关
这个延迟复制不是 i/o 线程过段时间来复制, i/o 是正常工作的
是日志已经保存在 slave 端了,那个 sql 要等多久进行回放
#在slave端
mysql> STOP SLAVE SQL_THREAD;
mysql> CHANGE MASTER TO MASTER_DELAY=60;
mysql> START SLAVE SQL_THREAD;
mysql> SHOW SLAVE STATUS\G;
Master_Server_Id: 1
Master_UUID: db2d8c92-4dc2-11ef-b6b0-000c299355ea
Master_Info_File: /data/mysql/master.info
SQL_Delay: 60 ##延迟效果
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more
updates
Master_Retry_Count: 86400

测试:

master 中写入数据后过了延迟时间才能被查询到

我们在master中删除东西,查看slave2中,会发现延迟60s之后才会删除东西;

这样的作用是防止咱们重要文件数据被删除,可以其他的slave服务器中挽救减少损失

慢查询日志
慢查询,顾名思义,执行很慢的查询
当执行 SQL 超过 long_query_time 参数设定的时间阈值(默认 10s )时,就被认为是慢查询,这个
SQL 语句就是需要优化的
慢查询被记录在慢查询日志里
慢查询日志默认是不开启的
如果需要优化 SQL 语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的。

打开慢查询日志:

测试:

查看日志:

mysql 的并行复制
默认情况下 slave 中使用的是 sql 单线程回放
master 中时多用户读写,如果使用 sql 单线程回放那么会造成组从延迟严重
开启 MySQL 的多线程回放可以解决上述问题
在slaves中设定
[root@mysql-node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server-id=2
gtid_mode=ON
enforce-gtid-consistency=ON
slave-parallel-type=LOGICAL_CLOCK #基于组提交,
slave-parallel-workers=16 #开启线程数量
master_info_repository=TABLE #master信息在表中记录,默认记录
在/data/mysql//master.info
relay_log_info_repository=TABLE #回放日志信息在表中记录,默认记录
在/data/mysql/relay-log.info
relay_log_recovery=ON #日志回放恢复功能开启

slave2

编辑主文件:

测试结果:

此时 sql 线程转化为协调线程, 16 worker 负责处理 sql 协调线程发送过来的处理请求
MySQL 组提交( Group commit )是一个性能优化特性,它允许在一个事务日志同步操作中将多个
事务的日志记录一起写入。这样做可以减少磁盘 I/O 的次数,从而提高数据库的整体性能。

原理

三个线程
实际上主从同步的原理就是基于 binlog 进行数据同步的。在主从复制过程中,会基于 3 个线程来操作,一个主库线程,两个从库线程。
  • 二进制日志转储线程(Binlog dump thread)是一个主库线程。当从库线程连接的时候, 主库可以将二进制日志发送给从库,当主库读取事件(Event)的时候,会在 Binlog 上加锁,读取完成之后,再将锁释放掉。
  • 从库 I/O 线程会连接到主库,向主库发送请求更新 Binlog。这时从库的 I/O 线程就可以读取到主库的二进制日志转储线程发送的 Binlog 更新部分,并且拷贝到本地的中继日志 (Relay log)。
  • 从库 SQL 线程会读取从库中的中继日志,并且执行日志中的事件,将从库中的数据与主库保持同
复制三步骤
步骤 1 Master 将写操作记录到二进制日志( binlog )。
步骤 2 Slave Master binary log events 拷贝到它的中继日志( relay log );
步骤 3 Slave 重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL 复制是异步的且串行化的,而且重启后从接入点开始复制。
具体操作
1.slaves 端中设置了 master 端的 ip ,用户,日志,和日志的 Position ,通过这些信息取得 master 的认证及信息
2.master 端在设定好 binlog 启动后会开启 binlog dump 的线程
3.master 端的 binlog dump 把二进制的更新发送到 slave 端的
4.slave 端开启两个线程,一个是 I/O 线程,一个是 sql 线程,i/o线程用于接收 master 端的二进制日志,此线程会在本地打开 relaylog 中继日志,并且保存到本地磁盘 ,sql线程读取本地 relog 中继日志进行回放
5. 什么时候我们需要多个 slave
当读取的而操作远远高与写操作时。我们采用一主多从架构
数据库外层接入负载均衡层并搭配高可用机制
架构缺陷
  • 主从架构采用的是异步机制
  • master更新完成后直接发送二进制日志到slave,但是slaves是否真正保存了数据master端不会检测master端直接保存二进制日志到磁盘
  • master端到slave端的网络出现问题时或者master端直接挂掉,二进制日志可能根本没有到达slave
  • master出现问题slave端接管master,这个过程中数据就丢失了
  • 这样的问题出现就无法达到数据的强一致性,零数据丢失

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

方差稳定变换(Variance Stabilizing Transformation)介绍,专业生物学领域统计

介绍 方差稳定变换(Variance Stabilizing Transformation,VST)是一种统计方法,用于将一个具有异方差性的随机变量(即方差随着均值的变化而变化的变量)转换为方差相对稳定的变量。这种转换在数据分析和建模…

【网络】TCP协议详解(下)

上文介绍了TCP传输控制协议的报头,并且渗透了TCP保证可靠性的策略:如流量控制、按序到达、确认应答机制以及超时重传。本文继续讲解TCP剩下的协议,剩下俩个大话题,难度都比较麻烦。 本文将介绍TCP协议最常见的三次握手和四次挥手…

腾讯地图SDK Android版开发 7 覆盖物示例1

腾讯地图SDK Android版开发 7 覆盖物示例1 前言界面布局MapMarker类常量成员变量初始值Marker点击事件Marker拖拽事件创建覆盖物移除覆盖物设置属性 MapMarkerActivity类控件响应事件 运行效果图 前言 文本介绍Marker的常用属性、交互和碰撞示例。 示例功能如下: …

【计算机网络】认识端口号 认识传输层协议 认识网络字节序 认识socket套接字

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…

收银系统源码—千呼新零售【硬件篇】

连锁店收银系统源码—多商户平台入驻商城已上线-CSDN博客文章浏览阅读1k次。零售行业连锁店收银管理系统多商户入驻本地生活即时零售平台商城https://blog.csdn.net/V15850290240/article/details/141310629 详细介绍请查看上方文章↑↑↑ 详细介绍请查看上方文章↑↑↑ 详细…

[大模型]配置文件-Langchain-Chatchat-V0.3 (1)

文章目录 简述本地配置配置文件model_settings.yaml使用Ollama配置模型配置 使用Xinference配置模型配置修改默认使用的模型 对话基础对话知识库对话 简述 针对Langchain-Chatchat-V0.3版本,对配置文件与模型使用说明,本文建议使用Ollama配合Chatchat使…

用Python实现9大回归算法详解——09. 决策树回归算法

1. 决策树回归的基本概念 决策树回归(Decision Tree Regression)是一种树状结构的回归模型,通过对数据集进行递归分割,将数据分成更小的子集,并在每个子集上进行简单的线性回归。决策树的核心思想是通过选择特征及其阈…

centos7.9系统安装cloudpods并使用ceph存储(二)

1.ceph安装 1.1 环境准备 配置hosts: $ vim /etc/hosts 10.121.x.x node01设置ssh无密码登录: # ssh-keygen -t rsa # ssh-copy-id -i /root/.ssh/id_rsa node01关闭selinux、firewalld # setenforce 0 # sed -i "s#SELINUXenforcing#SELINUXd…

国自然研究热点、“C位出圈”的类器官研究离不开细胞因子

前 言: 目前,类器官已从基础研究发展至药物开发和精准治疗。在疾病建模、药物开发、肿瘤研究、再生医学、精准医学等领域发展迅速。类器官与体内器官在功能和结构上的高度相似,使其广泛用于发育生物学和疾病建模。传统的2D细胞模型和模式动物…

k8s之Pod对象多种调度方式

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Redis数据库一文入门

Redis 是一个用于存储和管理数据的开源内存数据结构存储系统。它以其高性能和丰富的数据结构支持而闻名,是构建高效、可扩展应用程序的理想选择。本文将带你入门 Redis,并探讨其基本概念、安装步骤和一些常见的使用场景。 什么是 Redis? Re…

疯感工牌的风还是吹到了L4级无人驾驶

俗话说得好,打工人哪有不疯的? 最近你是不是也被“发疯工牌梗”刷屏了 一张张看似情绪稳定的工牌 以独特的方式展现了属于打工人自己的个性 这不,疯感工牌的风也吹到了无人驾驶 无人车也有了属于自己的时尚单品 看看它们都是如何介绍自己的&a…

Wot Design Uni:一个高颜值、轻量化的uni-app组件库,uni-app生态的新宠

一、介绍 wot-design-uni组件库基于vue3Typescript构建,参照wot design的设计规范进行开发,提供70高质量组件,支持暗黑模式、国际化和自定义主题,旨在给开发者提供统一的UI交互,同时提高研发的开发效率。 特性&#x…

新的网络钓鱼方法针对 Android 和 iPhone 用户

关注公众号网络研究观获取更多内容。 ESET 研究人员发现了一种针对 Android 和 iPhone 用户的不常见网络钓鱼活动。 他们分析了一起针对捷克某知名银行客户的网络钓鱼案例。 网络钓鱼流程 这种技术值得注意,因为它会从第三方网站安装钓鱼应用程序,而无…

数据可视化大屏模板-美化图表

Axure作为一款强大的原型设计软件,不仅擅长构建交互式界面,更在数据可视化方面展现出了非凡的创意与实用性。今天,就让我们一起探索Axure设计的几款精美数据可视化大屏模板,感受数据之美。 立体图表的视觉冲击力 Axure的数据可视…

【大模型理论篇】基于3D可视化视角理解GPT

1. 背景介绍 先前我们通过多篇技术文章来分析大模型的原理,包括: 《Transformer原理及关键模块深入浅出》《GPT系列预训练模型原理讲解》、《大模型时代下Bert去哪啦》、《关于LLaMA 3.1 405B以及小模型的崛起》、《LLaMA3结构关键模块分析》、《强化学习…

JS基础进阶2-操作元素

目录 1.操作元素-修改DOM(文档对象模型)元素 1. 修改元素的文本内容 2. 修改元素的样式 3. 修改元素的属性 4. 修改元素的类名 5.修改body元素 2.修改自定义属性 2.1H5中设置自定义属性、 2.2使用JavaScript修改自定义属性 3.节点操作 3.1节点概…

不懂就问,换毛季猫咪疯狂掉毛怎么办?宠物浮毛该如何清理?

最近天气变热了,每天都30度以上,我家猫狂掉毛,床上、地板上堆积了不少。第一次养猫的我没见过这种阵仗,以为它生病了,连忙带它去看医生。医生告诉我,这是正常的猫咪换毛现象,我才放下心来。原来…

Python代码加密打包发布

本博客主要介绍: 1. 将python代码编译为so(win环境是pyd) 2.打包生成wheel文件,可以使用pip 进行安装 1. 项目结构 注意,__init__.py文件是必须的,内容可为空 2. example.py 里面是自己写的一些方法&am…

【hot100篇-python刷题记录】【滑动窗口最大值】

R6-子串篇 目录 Max Sort 单调队列法&#xff1a; Max 完了&#xff0c;我好像想到python的max class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:ret[]left,right0,kwhile right<len(nums):ret.append(max(nums[left:right]))ri…