Mysql主从同步是怎么做的

230 阅读3分钟

MySQL集群中的主从同步,也称为复制(Replication),是通过主数据库将更改记录写入二进制日志(Binary Log)并由从数据库读取这些日志来实现的。以下是主从同步的具体实现步骤以及如何保证事务一致性:

  1. 数据更改在主库上的记录:  当在主库上执行一个事务时,MySQL会将该事务的所有更改操作以事件的形式记录到二进制日志中,每个事件对应一个SQL语句或一组相关的SQL语句,并且按照它们在主库上执行的顺序排列。

  2. 二进制日志传输:  从库通过I/O线程连接主库,请求并获取主库上的二进制日志内容。主库将新的二进制日志事件发送给从库。

  3. 从库重做事务:  从库接收到日志后,将其写入本地的一个特殊文件——重做日志(Relay Log)。然后从库的SQL线程负责读取重做日志中的事件,并按顺序重新执行这些事件,即在从库上执行相同的SQL语句,从而达到与主库相同的数据状态。

  4. 事务一致性的保证:

    • 原子性:由于主库上的事务要么全部提交,要么全部回滚,因此只有已提交的事务会被完整地记录到二进制日志中,确保了从库上事务执行的原子性。
    • 隔离性:尽管复制是异步的,但在从库上执行的日志事件仍然遵循ACID原则。从库上的事务隔离级别可以配置为与主库相同,以避免脏读、不可重复读等问题。
    • 一致性:为了保持主从数据的一致性,在某些情况下,MySQL提供了基于行的复制(Row-Based Replication, RBR)和GTID(Global Transaction Identifier)等机制来更精确地复制事务,尤其当事务涉及到了非确定性的函数或者数据类型时。RBR能够精确记录每一行数据的变更,而GTID则能确保全局范围内的事务唯一标识和有序应用,使得从库能够严格按照事务在主库上的执行顺序进行重放。
  • 持久性:一旦事务在主库上被提交并记录到二进制日志,即使主库发生故障,只要日志未丢失,从库在恢复后依然可以从断点处继续复制,保证最终数据的一致性。
  1. 安全性选项: MySQL还提供了一些高级复制选项,如半同步复制(Semisynchronous Replication),它能在一定程度上增强同步的安全性,要求至少有一个从库确认接收到并写入二进制日志后,主库才返回事务成功,这样可以降低主库宕机导致部分事务未复制的风险。

综上所述,MySQL主从同步通过二进制日志记录和重放机制确保了从库数据与主库数据的最终一致性,并通过一系列策略和优化手段尽可能地保障事务处理过程中的一致性。