mysql 半同步复制测试

半同步复制测试(基于MySQL5.7.14)


一 半同步复制Setup

Variables
Variable_name Value Dynamic
rpl_semi_sync_master_enabled ON YES
rpl_semi_sync_master_timeout 1000 YES
rpl_semi_sync_master_wait_for_slave_count 1 YES
rpl_semi_sync_master_wait_no_slave OFF YES
rpl_semi_sync_master_wait_point AFTER_SYNC YES
rpl_semi_sync_slave_enabled ON YES
配置文件
### 半同步复制
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
rpl_semi_sync_master_wait_point = AFTER_SYNC
rpl_semi_sync_master_wait_for_slave_count = 1
rpl_semi_sync_master_wait_no_slave = OFF
loose_rpl_semi_sync_master_timeout = 1000

二 半同步复制性能

  1. TPS
    • TPS在开启半同步复制的情况下低于未开启强持久化配置异步复制的性能, 高于开启强持久化的异步复制
    • 强持久化指 sync_binlog=1, innodb_flush_log_at_trx_commit=1
    • 开启半同步复制的情况下, 持久化由主从复制保证, 相当于用未开启强持久化选项的性能实现了基于主从的强持久化
  2. Latency

    • 平均增加响应时长为7ms

      mysql> show global status like '%semi%';
      +--------------------------------------------+------------+
      | Variable_name                              | Value      |
      +--------------------------------------------+------------+
      | Rpl_semi_sync_master_clients               | 1          |
      | Rpl_semi_sync_master_net_avg_wait_time     | 0          |
      | Rpl_semi_sync_master_net_wait_time         | 0          |
      | Rpl_semi_sync_master_net_waits             | 264499     |
      | Rpl_semi_sync_master_no_times              | 1          |
      | Rpl_semi_sync_master_no_tx                 | 23         |
      | Rpl_semi_sync_master_status                | ON         |
      | Rpl_semi_sync_master_timefunc_failures     | 0          |
      | Rpl_semi_sync_master_tx_avg_wait_time      | 7050       |
      | Rpl_semi_sync_master_tx_wait_time          | 1848578007 |
      | Rpl_semi_sync_master_tx_waits              | 262181     |
      | Rpl_semi_sync_master_wait_pos_backtraverse | 0          |
      | Rpl_semi_sync_master_wait_sessions         | 0          |
      | Rpl_semi_sync_master_yes_tx                | 243932     |
      +--------------------------------------------+------------+
      14 rows in set (0.30 sec)
      

三 缺陷和隐患

  1. 半同步复制每次事务提交需要从库回复binlog已经接收, 需要一次网络确认的操作. 当出现网络抖动的时候, 主库响应客户端的时间会增加rpl_semi_sync_master_timeout的时长.
  2. 生产环境需要保证业务性能, sync_binlog通常不会设置为1, 如果主库服务器出现宕机的情况, 未成功flush binlog的事务会被回滚, 此时从库执行的事务会比主库多.

四 生产环境部署建议

  1. 依照Setup中进行配置文件配置
  2. 至少有一个从库与主库网络稳定, 低延时. 一主一从的架构下, 主从之间网络稳定且延时低, 最好处于同一个内网.
  3. 做好MySQL状态监控
    • Rpl_semi_sync_master_clients 应该 >=1
    • Rpl_semi_sync_master_no_times 应该 =0, 出现大于0的情况, 可以先通知然后flush 此状态
    • Rpl_semi_sync_master_no_tx 应该=0, 出现大于0的情况, 可以先通知然后flush 此状态
    • Rpl_semi_sync_master_status 应该为ON
    • Rpl_semi_sync_master_tx_avg_wait_time 应该小于一定时间, 不应该超过10到100毫秒
    • Rpl_semi_sync_slave_status 所有从库应该为ON
Status说明
变量名 变量说明 可被flush重置 监控方法
Rpl_semi_sync_master_clients
Rpl_semi_sync_master_net_avg_wait_time deprecated
Rpl_semi_sync_master_net_wait_time deprecated
Rpl_semi_sync_master_net_waits 主库等待从库回复的总次数
Rpl_semi_sync_master_no_times 主库转变为异步复制的次数
(Rpl_semi_sync_master_status转变为OFF的次数)
应该为0
Rpl_semi_sync_master_no_tx 未被从库成功确认binlog已同步的事务数 应该为0
Rpl_semi_sync_master_status 主库是否处在半同步状态 应该为 ON
Rpl_semi_sync_master_timefunc_failures
Rpl_semi_sync_master_tx_avg_wait_time master等待半同步从库确认的是平均时间 (us)
Rpl_semi_sync_master_tx_wait_time master等待半同步从库确认的是总时间 (us)
Rpl_semi_sync_master_tx_waits
Rpl_semi_sync_master_wait_pos_backtraverse
Rpl_semi_sync_master_wait_sessions
Rpl_semi_sync_master_yes_tx 被从库成功确认binlog已同步的事务数
Rpl_semi_sync_slave_status 从库是否处在半同步状态 至少有一个从库为 ON

五 总结

  1. mysql5.7半同步复制可以在性能 (tps, latency) 接近异步复制(不开启强持久性)的情况下 提供 loss-less replication, 确保主从一致性
  2. 半同步复制必须存在至少一个低延时的开启半同步复制的从库, 如果网络延迟高或抖动, 会严重影响业务响应时间和TPS

参考链接

https://mysqlhighavailability.com/semi-synchronous-replication-performance-in-mysql-5-7/
http://yoshinorimatsunobu.blogspot.co.uk/2014/04/semi-synchronous-replication-at-facebook.html
http://keithlan.github.io/2016/06/29/lossless_repl/
https://www.cnblogs.com/ivictor/p/5735580.html
http://mysql.taobao.org/monthly/2017/04/01/
http://my-replication-life.blogspot.com/2013/09/loss-less-semi-synchronous-replication.html