mysql复制--半同步复制配置

半同步复制原理:

在mysql5.5之前mysql的复制都是异步操作,主库和从库的数据之间存在一定延迟,这样存在一个隐患:当在主库上写入一个事务并提交,而从库尚未得到主库推送的Binlog日志时,主库宕机了,例如:主库可能因为磁盘损坏,内存故障等造成主库上该事务Binlog丢失,此时从库上就可能损失这个事务,从而造成主从不一致。为了解决这个问题,在mysql5.5引入了半同步复制。
在mysql5.5之前的异步复制时,主库执行完了commit提交操作后,在主库写入Binlog日志后即可成功返回客户端,无需等待binlog日志传送给从库。
这里写图片描述
而半同步复制时,为了保证主库上的每一个Binlog事务都能够被可靠的复制到从库上,主库在每次事务成功提交时,并不及时反馈给前端应用用户,而是等待其中一个从库也收到binlog事务并成功写入中继日志后,主库才返回commit操作成功给客户端。
半同步复制保证了事务成功提交后,至少有两份日志记录,一份在主库的binlog日志上,另一份在至少一个丛库的中继日志 relay log上,从而进一步保证了数据的完整性,半同步复制的大致流程图如下:
这里写图片描述
在半同步复制模式下,假如在1,2,3中的任何一步骤中主机宕机,则事务并未提交成功,从库上也没有收到事务对应的binlog日志,所以主从数据是一致的。假如在步骤4 传送binlog日志到丛库时从库宕机或是网络故障,导致binlog并没有及时的传送到从库上,此时主库上的事务会等待一段时间(时常有参数 rpl_semi_sync_master_timeout设置的毫秒数决定),如果binglog在这段时间内都无法成功推送到从库上,则mysql自动调整复制模式为异步,事务正常返回提交结果给客户端。
半同步复制很大程度上取决于主从库之间的网络情况,往返时延 RTT 越小决定了从库的实时性能越好,通俗的说,主从库之间网络越快,从库越实时。尽量保证该从节点和主节点在同一个机房,同一个机柜的,同一台交换机上最好。
google为mysql5.5以后开发的semi同步插件,我们可以利用该插件实现半同步复制,
主库和从库使用不同的插件。

实验环境:
192.168.0.196 主节点1
192.168.0.198 主节点2
myql版本:mysql-5.5.17
配置防火墙,运行两主节点的能够互相访问对方的3306端口。

配置流程:
1:)判断msyql服务器是否支持动态增加插件
这里写图片描述
2:)确认支持动态插件后,检查mysql的安装目录下是否存在插件,一般默认在安装目录/lib/plugin目录下存在主库插件:semisync_master.so和从库插件semisync_slave.so
这里写图片描述
3:)在主库上安装插件
这里写图片描述
4:)在从库上安装插件

这里写图片描述
5:)从mysql.plugin中查看安装的插件
这里写图片描述
这里写图片描述
当安装完成后,MySql会在系统表plugin中记录刚才安装的插件,下次系统重启后会自动加载插件。
6:)需要分别在主库和从库上配置参数打开半同步 semi_sync,默认半同步设置是不打开的。
主库上配置全局参数:
这里写图片描述
从库上一样配置全局参数:
这里写图片描述
7:启动从库上的slave线程
这里写图片描述
到此步,半同步配置完成

配置测试
在主库上查看半同步状态:
这里写图片描述
注意一下三个参数:
rpl_semi_sync_master_status =ON :表示半同步复制目前处于打开状态
rpl_semi_sync_master_yes_tx 值为 0 :表示主库目前尚未有任何一个事务是通过半同步复制到从库。
rpl_semi_sync_master_no_tx 值为0:表示当前有0个事务不是半同步模式下从库及时响应的。
执行一个事务,在检查一下状态:
这里写图片描述
此时会发现 rpl_semi_sync_master_yes_tx变为1,刚才的update事务通过半同步复制到了从库上, rpl_semi_sync_master_yes_tx增加了1
查看从库数据表
这里写图片描述

在测试一下网络异常的环境下主库等待的毫秒超时后,自动转成异步复制的场景。
1)查看主库半同步复制的等待超时时间:
这里写图片描述
2:)开启从库防火墙,并设置过滤规则,模拟主库宕机或是网络故障。
*表示启用, 通过【空格键】切换是否启用
这里写图片描述
在从库上创建一条过滤规则
这里写图片描述
再在从库上执行停止slave线程并再开启slave线程,并查看slave线程。
这时 slave_IO_Running变为connecting状态,表示正在和主库进行连接操作。如果连接成功,slave_IO_Running变为yes状态.
这里写图片描述
3:)在主库上执行一个事务,并提交,主库上的提交操作会被阻塞30秒。
这里写图片描述
这里写图片描述
主库经过30秒的同步等待时间,没有获取从库的同步响应之后更新操作执行成功,该更新事务被写道主库的二进制文件中,并同时将半同步模式切换为异步模式。
这里写图片描述
rpl_semi_sync_master_status =OFF :表示半同步复制目前处于关闭
rpl_semi_sync_master_yes_tx 值为 1:表示主库目前有1一个事务是通过半同步复制到从库。
rpl_semi_sync_master_no_tx 值为3:表示当前有3个事务不是半同步模式下从库及时响应的,由之前的2变为三,就是因为半同步更新操作没有成功。

4:清除从库的防火墙规则。
清除防火墙规则后,从库会自动尝试连接主库,几秒钟后i/o 线程的状态会从Connecting 变成 YES,并且主库和从库的数据一致了
这里写图片描述
这里写图片描述
这里写图片描述
查看主库和从库的semi_sync状态:
这里写图片描述
这里写图片描述
发现主库的 rpl_semi_sync_master_status 变为 ON ,主库在检测到从库正常后,主库到从库的复制方式有异步模式,再次切换为半同步模式。
从半同步的复制的流程会发现,半同步复制的‘半’就体现在:虽然主库和从库的 binlog日志是同步,但是主库并不等待从库应用这部分日志就返回提交结果,这部分操作是异步的。从库的数据并不是和主库实时同步的。所以只能称为半同步,而不是完全的实时同步。

猜你喜欢

转载自blog.csdn.net/daicooper/article/details/79945962