MySQL主从复制(2)半同步复制(无损复制)与异地容灾应用
一、异步复制与半同步复制的区别
MySQL主从复制默认是采用异步机制进行同步,所谓异步即指主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收到binlog并同步。如果从库在接收完主库的Binlog之前主库发生了宕机,此时进行主从切换后,主从的数据就会出现不一致。为了解决这个问题,从MySQL 5.5开始以插件的形式支持半同步复制(由于半同步复制仅与默认复制通道(for channel "")兼容,不支持与多源复制混用)。在半同步复制中,主库在执行完客户端提交的事务后并不会立即响应该客户端,而是等待从库接收Binlog并写入Relaylog后进行ACK响应,主库在收到ACK响应后才返回结果给客户端(这里只需要等待日志的接收,而非事务的重放)。半同步复制在业务繁忙的场景下会对数据库性能有一些影响,但是它保证了主从数据的完全一致,适合对数据要求零丢失和数据一致性有严格要求的场景。这里的性能影响大概为主库将事务日志传入从库并收到从库ACK响应的TCP/IP协议通信包传输时长,所以半同步复制适合在高速网络中使用。
根据存储引擎层处理的逻辑不同又将半同步复制分为after-commit和after-sync两种,这两种半同步的方式在原理上是一样的,区别在于等待的时机不同:
· after-commit
主库未收到从库的ACK消息之前,虽然不会让发起事务的会话收到事务提交结果,但是会在存储引擎层先执行提交。这样一来虽然提交事务的会话无法知道事务结果,但其他会话在主库上却是可以正常查询的。如果发生主从切换,那么原本在主库可以查询到的数据,在从库却丢失了
· after-sync
也可以叫做增强半同步复制或者无损复制,是MySQL 5.7默认的半同步方式。主库未收到从库的ACK消息之前,发起事务的会话收无法到事务提交结果,存储引擎层也不会执行提交,保证了数据的严格一致。由于OLTP应用场景大多数是读多写少,读不会产生binlog,所以即便开启无损复制,相比异步复制所损失的性能也并不多
二、MySQL半同步复制配置
1、在主从节点安装半同步复制插件,该插件分为master和slave两种,但是建议是两种插件全部安装,这样发生主从切换后不需要再次安装
mysql > INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; mysql > INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
2、检查插件安装是否成功,正常情况应该是ACTIVE状态
mysql > SHOW PLUGINS;
3、编辑my.cnf配置文件以启动主从节点的半同步复制功能
主从两端都需要开启半同步复制才会生效。如果主库开启了半同步复制,并且至少有一个从库也开启了半同步复制,那么主库执行事务时就会等待从库的响应;如果任意一端禁用了半同步复制,那么会自动转为异步复制
plugin_dir=/usr/local/mysql/lib/plugin plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_slave_enabled=1 rpl_semi_sync_master_wait_no_slave=OFF #如果主库和所有从库都无法正常连接,是否还继续等待从库的ACK信息,默认是ON rpl_semi_sync_master_wait_for_slave_count=1 #需要至少多少个从库完成确认 rpl_semi_sync_master_wait_point=AFTER_SYNC #AFTER_COMMIT性能差且不能无损复制,所以推荐AFTER_SYNC模式 rpl_semi_sync_master_timeout=10000 #半同步超时时间,超时后转为异步复制,单位为毫秒
4、重启从节点生效配置,重启后Slave会在Master上注册为半同步复制的Slave角色
mysql > stop slave; mysql > START SLAVE;
5、当半同步复制发生超时时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10秒),会暂时关闭半同步复制转而使用异步。转为异步复制时pl_semi_sync_master_no_tx值不为0,如果该值持续增加就需要检查复制配置和网络情况是否存在异常。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内收到了从库的响应,则主从又重新恢复为半同步复制。比如当从节点Down掉,此时在主节点插入一条语句需要等待10秒才会插入成功,等从节点恢复后,主节点再次插入数据又会恢复为半同步复制
6、查看半同步复制插件所生成的环境变量与状态变量,状态变量一般用于统计数据
show global variables like '%semi%'; #半同步复制相关的环境变量 show status like '%semi%'; #查看半同步复制工作状态相关变量 # rpl_semi_sync_master_clients #在主库中查看半同步从库的数量 # rpl_semi_sync_master_yes_tx #通过半同步复制提交的事务数量 # rpl_semi_sync_master_no_tx #退化为异步复制的事务数量
三、半同步复制与异地容灾应用
由于半同步复制确保了数据的一致性,可以基于这个特点一定程度上实现异地容灾。比如在两地三中心架构下,跨机房的节点之间使用异步复制,同机房内节点因为延迟低,更适合配置为半同步复制,这样可以避免主库长时间等待从库响应。具体的实现方法就是将rpl_semi_sync_master_wait_for_slave_count设置为1,主库只需要一个从库确认就可以提交事务。然后只有同机房的从库配置为半同步复制模式,异地从库配置为异步复制模式
评论