十二、 Mysql - 主从复制 - 半同步复制
目录
知识点1:半同步复制
Mysql半同步复制原理
在Master里面有数据改变的时候,数据会记录到二进制日志里面,然后load dump线程会通知slave机器上面的I/O线程来取二进制日志,然后将数据放到relay log(中继日志)里面
与异步复制不一样的地方在于,半同步复制会在数据成功存入relay log以后给Master发送一个ACK确认包,Master收到以后才会进行事务的提交,同时,slave也成功将数据读取,执行,达到数据一致性,如果Master没有收到ACK确认包的话,会等待slave 10 s的时间,如果没有收到的话,就会开启异步复制模式
######################################################################
异步复制和半同步复制的区别?
主要区别是,数据存入slave中继日志以后,会发送一个ACK确认包给master。master收到以后才会进行事务的提交
######################################################################
半同步复制解决了什么问题?
解决了异步复制模式里面两边可能会存在数据不一致的问题。
主库里面有数据,而从库里面没有接收到二进制日志,导致从库里面有数据,造成数据不一致。
######################################################################
在Mysql里开启半同步复制
Mysql官方文档里面有告诉我们该怎么进行半同步复制
步骤:
1、首先在master上面安装插件
root@(none) 15:42 mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.01 sec)
######################################################################
2、设置master全局变量和超时时间
root@(none) 15:46 mysql>SET GLOBAL rpl_semi_sync_master_enabled = 1;
Query OK, 0 rows affected (0.00 sec)
root@(none) 15:47 mysql>
查看变量是否开启
root@(none) 15:47 mysql>show variables like "%semi_sync%";
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)
root@(none) 15:48 mysql>
######################################################################
3、在slave上面安装插件,设置全局变量
root@(none) 15:51 mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)
root@(none) 15:51 mysql>
root@(none) 15:52 mysql>SET GLOBAL rpl_semi_sync_slave_enabled = 1;
Query OK, 0 rows affected (0.00 sec)
######################################################################
4、停止slave上面的I/O线程,然后重启I/O线程
root@(none) 15:53 mysql>STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)
root@(none) 15:57 mysql>START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)
root@(none) 15:58 mysql>
######################################################################
5、也可以在配置文件里面配置半同步复制(永久开启)
master:
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1 second
slave:
[mysqld]
rpl_semi_sync_slave_enabled=1
######################################################################
6、测试数据一致性
在master上面新建数据库zhaojunjie
root@(none) 16:21 mysql>create database zhaojunjie;
Query OK, 1 row affected (1.01 sec)
root@(none) 16:21 mysql>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| liuhongjie |
| mysql |
| performance_schema |
| sanchuang |
| student |
| sys |
| test |
| ucar_cloud |
| wangsh |
| zhaojunjie |
+--------------------+
11 rows in set (0.00 sec)
root@(none) 16:22 mysql>use zhaojunjie;
Database changed
root@zhaojunjie 16:22 mysql>show tables;
Empty set (0.00 sec)
root@zhaojunjie 16:23 mysql>create table tt1(id int,name varchar(10));
Query OK, 0 rows affected (0.00 sec)
root@zhaojunjie 16:23 mysql>show tables;
+----------------------+
| Tables_in_zhaojunjie |
+----------------------+
| tt1 |
+----------------------+
1 row in set (0.00 sec)
root@zhaojunjie 16:23 mysql>
在slave上面:可以看到数据同步过来了,说明数据一致
root@(none) 16:21 mysql>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| liuhongjie |
| mysql |
| performance_schema |
| sanchuang |
| student |
| sys |
| test |
| ucar_cloud |
| wangsh |
| zhaojunjie |
+--------------------+
11 rows in set (0.00 sec)
root@(none) 16:22 mysql>use zhaojunjie;
Database changed
root@zhaojunjie 16:22 mysql>show tables;
Empty set (0.00 sec)
root@zhaojunjie 16:22 mysql>show tables;
+----------------------+
| Tables_in_zhaojunjie |
+----------------------+
| tt1 |
+----------------------+
1 row in set (0.00 sec)
root@zhaojunjie 16:23 mysql>
######################################################################
知识点2:同步复制
组复制以以下不同模式运行:
组复制是一种可用于实现容错系统的技术。复制组是一组服务器,每个服务器都有自己的完整数据副本(无共享复制方案),并通过消息传递相互交互。
复制组由多台服务器组成,组中的每台服务器都可以随时独立执行事务。但是,所有读写事务只有在得到组批准后才会提交。换句话说,对于任何读写事务,组需要决定它是否提交,因此提交操作不是来自原始服务器的单方面决定。只读事务不需要在组内协调并立即提交。
由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(N/2 + 1)决议并通过,如下图中,由三个节点组成一个复制组,Consensus层为一致性协议层,在事务提交过程中,发送组间通讯,由两个节点决议,通过这个事务,事务最终才能提交,并响应。
单主模式:
默认模式是单主模式。
不能以不同的模式部署组的成员,例如,一个配置为多主模式,而另一个配置为单主模式。要在模式之间切换,需要使用不同的操作配置重新启动组而不是服务器。
从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。
一主多从,再级联
但是当我们需要实现级联同步时,即以这样的一个模式,A>B>C实现三级同步时,AB库除了需要设置log-bin参数还需要添加一个参数:log-slave-updates
log-slave-updates参数默认时关闭的状态,如果不手动设置,那么bin-log只会记录直接在该库上执行的SQL语句,由replication机制的SQL线程读取relay-log而执行的SQL语句并不会记录到bin-log,那么就无法实现上述的三级级联同步。
######################################################################
多主模式
多主模式下所有数据库都是读写模式
######################################################################
主主复制
双主模式是指两台服务器互为主从,任何一台服务器数据变更,都会通过复制应用到另外一方的数据库中
可以是相同的库和表,也可以是不同的库和表
若主主双方都操作,最好设置auto-increment-offset 和 auto-increment-increment,以避免冲突。若只在其中一个库操作,可不需要设置
如果是相同的库和表,可以给写入的表设置不同的起始值,相同的偏移量
######################################################################
延迟备份
延迟备份用途:
防止用户在源上出错。DBA 可以将延迟的副本回滚到灾难发生前的时间。
测试存在滞后时系统的行为。例如,在应用程序中,延迟可能是由副本上的负载过重引起的。但是,生成此负载级别可能很困难。延迟复制可以模拟延迟,而无需模拟负载。它还可用于调试与滞后副本相关的条件。
检查数据库很久以前的样子,而无需重新加载备份。例如,如果延迟为一周,并且 DBA 需要查看数据库在最后几天的开发价值之前的样子,则可以检查延迟的副本。
设置延迟备份
在slave上面添加一条:
设置延迟时间:
CHANGE MASTER TO MASTER_DELAY = N;
从源接收到的事件直到在源上执行至少 N
几秒钟后才会执行。
root@(none) 16:37 mysql>stop slave;
Query OK, 0 rows affected (0.00 sec)
root@(none) 16:37 mysql>CHANGE MASTER TO MASTER_DELAY = 10;
Query OK, 0 rows affected (0.02 sec)
root@(none) 16:37 mysql>start slave;
Query OK, 0 rows affected (0.00 sec)
root@(none) 16:37 mysql>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了