很高兴的看到,在MySQL5.7版本里,semisync开始进行显著的优化,fix了不少遗留bug,例如支持一主多备的半同步;在server层判断备库是否要求半同步以减少Plugin锁冲突;支持在事务commit前等待ACK;解除binlog dump线程和LOCK_log的冲突等等。

在MySQL5.7.4里,俺最关注的改进当然是对发送binlog和接受ack的异步化了。开发者的博客的测试数据还是比较诱人的;偷个懒,直接扣的作者的图 🙂

旧的逻辑:

1
 

 

 

 

 

 

新的逻辑:

2

 

 

 

 

 

 

 

 

在开发者的测试中,最大可以达到4x的tps提升,网络延迟越大,TPS提升越明显

详细见开发者博客(貌似要翻墙):
http://my-replication-life.blogspot.sg/2014/03/faster-semisync-replication.html

花了一天时间把这些改进port到了我们的内部分支alisql5.5,简单测试了下:
使用sysbench, 20个表,每个表30w数据,负载为update_index.lua,100个session并发
在不开启备库延迟刷mater info的情况下,使用AFTER_COMMIT,从11000TPS上升到20000,而在AFTER_SYNC场景下,从16000上升到25000
测试的两个实例属于同城异地机房,Ping的延迟在0.75ms左右。

从测试的结果来看,性能提升还是非常明显的,具体实现不多说了,worklog上写的非常详细:
worklog链接:http://dev.mysql.com/worklog/task/?id=6630
launchpad链接:http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/7351

大体的实现思路是:
备库io线程使用TCP协议和主库交互,读写socket可以同时进行;
在开启主库semisync时,启动一个后台线程,使用select监听备库连接socket;
dump线程不再等待备库ACK;在ack reciver线程等待ACK时,dump线程还能继续发送下一组group commit的binlog,进而提升TPS

原创文章,转载请注明: 转载自Simple Life

本文链接地址: MySQL5.7.4的semisync优化:异步化binlog dump及接受ack

Post Footer automatically generated by wp-posturl plugin for wordpress.


Comments

  • a thought by 北在南方

    印风 ,能把 你的测试的实例 规格提出来吗?

    Reply

    • a thought by zhaiwx1987

      就是普通的sysbench 根据Pk进行update的测试.

      Reply

Leave a Reply

Your email address will not be published. Name and email are required


Current month ye@r day *