(1)概述
    也可以用mycat或者sharding-sphere之类的中间件,就可以实现你的系统写入主库,去从库读取。但是现在搭建出来的主从复制架构就有一个问题,那就是之前那种搭建方式默认是一种异步的复制方式,也就是说,主库把日志写入binlog文件,接着自己就提交事务返回了,不管从库到底收到日志没有,万一此时主库的binlog还没同步从库,结果主库宕机了,此时数据不就丢失了?即使做了高可用可自动切换,一下子把从库切换为主库,但是里面没有刚才写入的数据的,所以这种方式是有问题的。

    (2)半同步
    因此一般来说搭建主从复制,都是采取半同步的复制方式的,这个半同步的意思就是主库写入数据,日志进入binlog之后,起码得确保binlog日志复制到从库去了,然后再告诉客户端本次写入成功了,这样起码主库突然崩了,之前写入成功得数据得binlog日志都是从库了,从库切换为主库,数据也不会丢的,这就是所谓的半同步的意思。
    这个半同步复制有两种方式,第一种叫做 AFTER_COMMIT 方式,他不是默认的,意思是说,主库写入binlog,等待binlog复制到从库了,主库就提交自己的本地事务,接着等待从库返回给自己一个成功的响应,然后主库返回提交事务成功的响应给客户端。
    另一种方式是现在MySQL5.7默认的方式,主库把日志写入binlog,并且复制给从库,然后开始等待从库的响应,从库返回成功给主库,主库再提交事务,接着返回提交事务成功的响应给客户端,总而言之,这种方式可以保证每个事务提交成功之前,binlog日志一定都复制到从库,所以只要事务提交成功,就可以认为数据在从库也有一份了,那么主库崩溃,已经提交的事务的数据绝对不会丢失。
    搭建半同步复制也简单,在之前搭建好异步复制的基础之上,安装一下半同步复制插件就好了,先在主库安装半同步复制插件,同时还得开启半同步复制功能。
    install plugin rpl_semi_sync_master soname ‘semisync_master.so’;
    set global rpl_semi_sync_master_enabled=on;
    show plugins;
    接着从库也是安装这个插件以及开启半同步复制功能
    install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
    set global rpl_semi_sync_slave_enabled=on
    show plugins;
    接着要重启从库的IO线程:stop slave_io_thread;start slave_io_thread;

    (3)总结
    到此半同步复制就开启成功了,其实一般来说,主从复制都建议做成半同步复制,因为这样配合高可用切换机制,就可以保证数据库有一个在线的从库热备份主库的数据了,而且主要主库宕机了,从库立即切换为主库,数据不丢失,数据库还高可用。

    知识点:有三个从库,那半同步复制是其中一个应答成功就可以了,如果主库挂了选主会有一个Group Replication机制。
    知识点:半同步复制,主库要等从库响应了再响应给客户端,大大降低了效率,追求数据强一致响应时间会变长
    生产上主流MySQL版本是MySQL5.7

    全同步复制:
    指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
    半同步复制:
    是介于全同步复制与全异步复制之间的一种,主库只需要等待至少一个从库节点收到并且 Flush Binlog 到 Relay Log 文件即可,主库不需要等待所有从库给主库反馈。同时,这里只是一个收到的反馈,而不是已经完全完成并且提交的反馈,如此,节省了很多时间。
    https://www.cnblogs.com/kevingrace/p/10260685.html
    https://www.jianshu.com/p/4fb6c0642f59