四十一、半同步复制

上文提到过半同步复制,看《mysql入门与提高实践》发现有这个的介绍,所以学习一下。

主从复制模式介绍

异步复制:主库将binlog的更新发给从库后,并不关心从库是否写入relaylog中。故可能会造成数据不一致问题。默认使用该模式。

全同步复制:主库将等待所有更新从库都写入relaylog后才将执行结果返回给用户。故受从库影响会造成一定的延时。需要借助第三方工具,如DRBD

半同步复制:主库等待至少一个从库接收更新并写入relaylog后才将结果返回给用户。故提高了数据的安全性,但也会造成一定的延迟,需要在低延时的节点中使用。

使用半同步复制是为了保证在主库出现故障时,至少有一台从库数据是完整的。

半同步复制原理

主从库会安装semisync插件实现半同步复制。
1、主库执行完一个事务,semisync插件会向从库发送该事务。
2、从库将收到的事务写入relaylog后,通过emisync插件告知主库。
3、主库收到从库的semisync插件的回复信息后告诉用户更新完毕。

注意:如果主从连接超时,默认为10s,这段时间过后仍收不到回复,就会自动转为异步复制状态。
MySQL5.5版本以后都支持半同步复制模式。

配置

1、主库配置如下

#安装semisync插件
$ cd /usr/local/mysql5.7/lib/plugin/
$ ls -l semi*
-rwxr-xr-x. 1 mysql mysql 708906 Apr 13  2019 semisync_master.so
-rwxr-xr-x. 1 mysql mysql 152309 Apr 13  2019 semisync_slave.so

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> set global rpl_semi_sync_master_enabled = ON;
mysql> set global rpl_semi_sync_master_timeout = 10000; #此处设置为超时时间10s,单位毫秒

#写入配置文件永久生效
$ vim /etc/my.cnf
[mysqld]
...
rpl_semi_sync_master_enabled = ON
global rpl_semi_sync_master_timeout = 10000

同时写入全局配置跟配置文件两种方式即可不重启数据库。
注意:为了避免延时建议根据实际情况改小超时时间,建议1-2s

2、从库配置如下

$ cd /usr/local/mysql5.7/lib/plugin/
$ install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
$ set global rpl_semi_sync_slave_enabled = ON;

$ vim /etc/my.cnf
[mysqld]
...
rpl_semi_sync_slave_enabled = ON

#需要重启slave
mysql> stop slave;
mysql> start slave;
mysql> show slave status G;

3、在主库上查看开启半同步复制的从库个数

#我这只开了1个,也可以作为配置成功与否的验证方式
mysql> show global status like '%semi%';
Rpl_semi_sync_master_clients               | 1  |

4、查看配置是否生效

mysql> show global variables like '%semi%';
mysql> select * from mysql.plugin;
mysql> show plugins;
mysql> show global status like '%semi%';

书中涉及到log_slave_updates参数,看了一下,是从库将日志写入到binlog中使用的参数,适用于级联同步,这里给个链接以后方便学习。
参考资料:log_slave_updates参数使用

参数说明

四十一、半同步复制
四十一、半同步复制
四十一、半同步复制

学习来自:《MySQL入门与提高实践》 第17章