Mysql的半同步复制

Mysql5.5版本之后引入了半同步复制的功能,主从服务器必须同时安装半同步复制插件,才能开启该复制功能。在该功能下,只有当从库接受从主库传递的 binlog 内容已经写入到自己的中继日志 relay log 里面时,才会通知主库上面的等待线程,操作完毕。如果等待超时,超过 rpl_semi_sync_master_timeout 参数设置的时间,则关闭半同步复制,并自动转换为异步复制模式,直到至少有一台从库通知主库已经接收到binlog信息为止。

在Mysql5.7版本增加了参数 rpl_semi_sync_master_wait_point 参数,用来控制半同步模式下主库返回给 session 事务成功之前的事务提交方式。

该参数有两个值,分别是 after_commit ,after_sync。

其中 after_commit 是mysql5.6版本的默认值,即主库将每个事务写入 binlog ,并传递给从库刷新到 relay log 里面,同时主库提交事务。之后主库开始等待从库的反馈,只有收到从库的回复之后,主库才将 commit ok 的结果反馈给客户端。

after_sync 是mysql5.7版本的默认值,也是mysql5.7版本之后新增的。即主库将每个事务写入 binlog ,并传递给从库刷新到 relay log 里面,主库开始等待从库的反馈,接收到从库的回复后,再提交事务并且放回给客户端 commit ok。

在after_sync模式下,即使主库宕机,所有在主库上已经提交的事务都能保证已经同步到从库的中继日志里面,不会丢失任何数据。

半同步复制的搭建很简单,它是基于异步复制,安装半同步复制插件就可以了。

在已经搭建好异步复制的基础上,先在主库上安装半同步复制插件和开启半同步复制功能:

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

mysql> set global rpl_semi_sync_master_enabled=on;

mysql > show variables like '%semi%';

 

由上图可以看到,mysql5.7版本半同步复制的默认方式是 after_sync 模式。其中另一个很重要的参数是 rpl_semi_sync_master_timeout ,单位 ms 。表示如果主库等待从库回复消息的时间超过该值,就自动转换为异步复制模式。建议不要默认设置的10s.可以调整大一些,禁止向异步复制切换来保证数据复制的安全性。

可以通过下面的命令确认插件已经加载成功:

show plugins;

 

接着在从库上安装半同步复制插件,并开启半同步复制功能:

mysql > install plugin rpl_semi_sync_slave soname 'semisync_slave.so'

mysql > set global rpl_semi_sync_slave_enabled=on;

mysql > show variables like '%semi%';

 

通过如下命令确认插件已经加载成功:

show plugins;

 

为了以后可以开机自启动半同步复制功能,可以把 rpl_semi_sync_master_enabled=on 和 rpl_semi_sync_slave_enabled=on 两个参数加载到 my.cnf 配置文件中。

重启从库的 I/O 线程,激活半同步复制:

stop slave io_thread;
start slave io_thread;

 

在主库上查看半同步复制是否正常运行: 

show global status like '%semi%';

 

参数 rpl_semi_sync_master_clients 为1代表已经有一个从库连接到了主库上,并且是半同步复制方式。

参数 rpl_semi_sync_master_status  为 on 状态,代表已经是半同步复制模式了。

参数 rpl_semi_sync_master_no_tx 代表没有成功接收 slave 提交的次数。

参数 rpl_semi_sync_master_yes_tx 代表成功接收 slave 事务回复的次数。

在从库上看半同步复制的状态:

show global status like '%semi%';

 

至此半同步复制搭建成功,我们可以往测试数据库test下的表test插入两条数据,再次查看半同步复制的状态:

 

此时可以看到参数   rpl_semi_sync_master_yes_tx 的值为2,代表成功接收 slave 事务回复2次。

执行应用 sql_thread 线程:

start slave sql_thread;

 

可以看到从库中有了刚刚在主库插入的两条新数据。同步成功。

半同步复制和异步复制的切换:

先关闭从库的 I/O 线程:

stop slave io_thread;

 

此时从库的半同步状态为 off 的。

查看主库的半同步状态:

 

此时主库的半同步状态还是开启的,并且参数 rpl_semi_sync_master_clients=0 代表没有连接主库的从库。

此时往主库的test库下的test表下插入一条数据

可以看到语句执行的很慢,10.01秒。主库一直在等待从库的回复,直到超过默认的等待时间10s。这是在查看主库的半同步复制状态:

 

此时主库的半同步复制也关闭了。证明已经完全从半同步复制自动切换为异步复制模式了。

如果在想从异步复制模式切换为半同步复制模式,只需要重新开启从库的 I/O 线程。

mysql > start slave io_thread;

 

查看主库的半同步复制状态如下:

 

可见,已经由异步复制切换到半同步复制模式了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#慧#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值