目录

在Master里面有数据改变的时候,数据会记录到二进制日志里面,然后load dump线程会通知slave机器上面的I/O线程来取二进制日志,然后将数据放到relay log(中继日志)里面
与异步复制不一样的地方在于,半同步复制会在数据成功存入relay log以后给Master发送一个ACK确认包,Master收到以后才会进行事务的提交,同时,slave也成功将数据读取,执行,达到数据一致性,如果Master没有收到ACK确认包的话,会等待slave 10 s的时间,如果没有收到的话,就会开启异步复制模式
######################################################################
主要区别是,数据存入slave中继日志以后,会发送一个ACK确认包给master。master收到以后才会进行事务的提交
######################################################################
解决了异步复制模式里面两边可能会存在数据不一致的问题。
主库里面有数据,而从库里面没有接收到二进制日志,导致从库里面有数据,造成数据不一致。
######################################################################
Mysql官方文档里面有告诉我们该怎么进行半同步复制
- root@(none) 15:42 mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
- Query OK, 0 rows affected (0.01 sec)
######################################################################
- 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>
######################################################################
- 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)
-
######################################################################
- 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>
######################################################################
master:
- [mysqld]
- rpl_semi_sync_master_enabled=1
- rpl_semi_sync_master_timeout=1000 # 1 second
slave:
- [mysqld]
- rpl_semi_sync_slave_enabled=1
######################################################################
在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>
######################################################################
组复制是一种可用于实现容错系统的技术。复制组是一组服务器,每个服务器都有自己的完整数据副本(无共享复制方案),并通过消息传递相互交互。
复制组由多台服务器组成,组中的每台服务器都可以随时独立执行事务。但是,所有读写事务只有在得到组批准后才会提交。换句话说,对于任何读写事务,组需要决定它是否提交,因此提交操作不是来自原始服务器的单方面决定。只读事务不需要在组内协调并立即提交。
由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(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>