半同步中
如果在主服务器端启用了半同步复制,并且至少有一个半同步从服务器,则在主服务器上执行事务提交的线程将阻塞并等待,直到至少一个半同步从服务器确认已接收到该事务的所有事件为止,或者直到 发生超时。
从属仅在将事件写入其中继日志并刷新到磁盘后才确认收到事务的事件
如果发生超时而没有任何从属服务器确认该事务,则主服务器将还原为异步复制。 当至少有一个半同步从属服务器赶上时,主服务器将返回到半同步复制
必须在主服务器和从服务器上都启用半同步复制。 如果在主服务器上禁用了半同步复制,或者在主服务器上但没有从属服务器上启用了半同步复制,则主服务器将使用异步复制。
当主服务器阻塞(等待从服务器的确认)时,它不会返回执行事务的会话。 当阻塞结束时,主节点返回到会话,然后会话可以继续执行其他语句。 在这一点上,事务已在主端进行,并且至少一个从属已确认其事件的接收。
主机可以使用rpl_semi_sync_master_wait_for_slave_count系统变量配置每个主机在每次事务处理之前必须收到的从机确认的数量。 预设值是1。
要了解“半同步复制”中的“半”的含义,请将其与异步和完全同步复制进行比较:
使用异步复制,主服务器将事件写入其二进制日志,而从服务器在事件准备就绪时对其进行请求。 不能保证任何事件都会到达任何从库。
使用完全同步复制,当主服务器提交事务时,所有从服务器也将在主服务器返回执行事务的会话之前提交事务。 这样做的缺点是完成交易可能会有很多延迟。
半同步复制介于异步复制和完全同步复制之间。 主机仅等待,直到至少一个从机接收并记录了事件。 它不等待所有从库都确认接收,它仅需要接收,而不是事件已在从库侧完全执行并提交。
与异步复制相比,半同步复制提供了改进的数据完整性,因为当提交成功返回时,已知数据至少存在两个位置。 在半同步主服务器收到来自rpl_semi_sync_master_wait_for_slave_count配置的从服务器数量的确认之前,该事务处于保留状态且未提交。
半同步复制在繁忙的会话上会限制binlog的发送速度,这样会降低速度,但是对某些情况下比较有用。
半同步复制的确会影响性能,因为由于需要等待从属服务器,因此提交速度较慢。 这是提高数据完整性的权衡。 减慢量至少是TCP / IP往返时间,以将提交发送到从属服务器并等待从属服务器确认接收。 这意味着半同步复制最适合通过快速网络通信的关闭服务器,而最不适合通过慢速网络通信的远程服务器。
rpl_semi_sync_master_wait_point系统变量控制半同步复制主服务器在向提交事务的客户端返回状态之前等待事务接收的从属确认的时间点。 这些值是允许的:
AFTER_SYNC(默认设置):主服务器将每个事务写入其二进制日志,从服务器将其写入磁盘。 主机在同步后等待从机对交易收据的确认。 收到确认后,主服务器将事务提交到存储引擎,并将结果返回给客户端,然后客户端可以继续进行。
after_sync是在从库返回确认后,主库commit
AFTER_COMMIT:主服务器将每个事务写入其二进制日志,而从服务器则将其同步,然后将事务提交到存储引擎。 提交后,主机等待从机对交易收据的确认。 收到确认后,主机将结果返回给客户端,然后客户端可以继续进行。
after_commit 是主库写二进制日志并同步binlog,然后提交事务,然后在等待返回确认,确认返回后,客户端才能继续操作,所以会导致客户端看到的事务不一样,虽然提交事务的客户端提交了,但是没有收到从库的确认,依然无法看到这个事务。
after sync的配置更安全,after commit在主库上提交宕机,从库上没有应用,就丢数据了