MySQL 的半同步复制是指主库将数据更新操作写入 Binlog 日志后,等待至少一个从库将数据更新操作写入自己的 Relay Log 日志并确认后,才认为该操作已经成功复制到从库。与异步复制相比,半同步复制可以更加保证数据的一致性和可靠性,但也会对性能产生一定的影响。
底层原理:
半同步复制的实现需要借助插件机制。MySQL 5.5 版本及之前的版本需要使用 MySQL 官方提供的 rpl_semi_sync_master 和 rpl_semi_sync_slave 插件来实现半同步复制。而在 MySQL 5.6 版本及之后的版本中,半同步复制功能已经集成到了 MySQL 内核中,无需再单独安装插件。
在半同步复制中,主库会在向从库发送 Binlog 日志时,等待至少一个从库写入了相应的 Relay Log 日志并进行了确认。主库等待的时间由参数 rpl_semi_sync_master_timeout 控制,默认值为10秒。如果在超时时间内没有收到从库的确认信息,主库会将该操作当做异步复制来处理,继续向其他从库发送 Binlog 日志。
从库在接收到主库的 Binlog 日志后,会将数据更新操作写入自己的 Relay Log 日志中,并向主库发送确认信息,确认信息的格式为一个插件头加一个 OK 数据包。如果主库接收到了至少一个从库的确认信息,那么该操作就被认为是已经成功复制到从库了。如果主库在超时时间内没有收到从库的确认信息,那么该操作就被当做异步复制来处理。
半同步复制可以提高数据的一致性和可靠性,但也会对性能产生一定的影响,因为主库需要等待从库的确认信息才能继续执行后续操作。因此,应该根据实际情况来调整半同步复制的参数,以平衡数据的一致性和性能的需求。