MySQL的slave为什么不独立出一个ack线程?

MySQL 5.7.4之后半同步得到极大增强,我们测试比5.5的半同步性能提升了差不多100%!这得益于MySQL 5.7.4之后的半同步独立出一个ack线程来替代dump thread做ack应答,这样主机发送binlog和接受slave ack回应可以并行化,详细解释可以参考这篇和这篇,以下是简单描述图:
5.6之前
MySQL的slave为什么不独立出一个ack线程?
文章图片
5.7之后
MySQL的slave为什么不独立出一个ack线程?
文章图片
【MySQL的slave为什么不独立出一个ack线程?】今天来自Oracle的Ivan Ma(马楚成)在介绍5.7新特性时,一个开发同事就针对半同步增强提出了以下问题:

既然master做了dump thread和ack thread分离的优化,那为什么slave不也这样仿效将receive线程和ack线程独立这样做进一步提升性能呢?
我一开始的想法是:master后面可能挂多个slave,压力较大,MySQL开发人员精力有限,优先将master如此优化效果更明显,后续再将slave优化。不过这解释实在心里没底...
再一想不禁哑然失笑:slave接受完主机送过来的binlog再返回ack应答这是半同步规定的行为呀!半同步就是为了解决异步复制情形下事务在主机提交完成而slave不一定收到此事务binlog而提出的:主机的事务就是要等待slave接受完binlog返回个ack应答然后才能提交完成; 如果slave的receiver线程和ack线程独立运行,可能receiver线程还没接受完主机事务的一个binlog而ack返回接受成功,主机收到ack应答就提交事务,但这样此时slave其实缺少这个事务,这种情形就不是半同步了呀!
最后,这位同事能提这么独辟蹊径的问题说明热爱独立思考,而不像我在内的大多数人只是了解、记住概念知识,值得学习!

    推荐阅读