在 MySQL5.5 之前的版本中, MySQL 的复制是异步复制, 主库和从库的数据之间存在一定的延迟, 比如网络故障等各种原因, 这样子容易存在隐患就是: 当在主库写入一个事务成功后并提交了, 但是由于从库延迟没有及时得到主库推送的 Binlog 日志时, 主库突然宕机了, 那么此时从库就可能损失这个事务, 从而造成主从不一致的状况.
因此我们 MySQL5.5 版本之后引入了半同步复制的概念
半同步复制的原理:
半同步复制时, 为了保证主库上的每一个 Binlog 事务都能够被可靠的复制到从库上, 主库在每次事务成功提交时, 并不及时反馈给前端应用用户, 而是等待其中的一个从库也接收到 Binlog 事务并成功写入中继日志后, 出库才返回 commit 操作成功给客户端. 半同步复制保证了事务成功提交后, 至少有两份日志记录, 一份在主库的 Binlog 日志上, 另一份在至少一个从库的中继日志 Relay log 上, 从而更近一步保证了数据的完整性.
这个示意图是半同步复制的步骤:
在这个半同步复制模式下: 第 1,2,3 中任何一个步骤中主库宕机, 则事务并没有提交成功. 从库也没有得到日志, 此时的主从复制数据是一致的.
那什么时候半同步复制会突然变成异步复制呢?
在第 4 步的时候, 如果网络延迟故障或从库宕机, 那么此时主库的 Binlog 都没有及时传送给从库上, 此时主库上的事务会等待一段时间, 时间长短由参数 rpl_semi_master_timeout 设置的毫秒数来决定, 如果 Binlog 在这段时间内都无法成功推送到从库上, 则 MySQL 自动调整复制模式为异步模式, 此时事务正常返回提交结果给客户端.
来源: http://www.bubuko.com/infodetail-2907152.html