四十一、半同步复制
上文提到过半同步复制,看《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章
今天的学习是为了以后的工作更加的轻松!