17.1.1.1 主次复制

传统的 MySQL 复制提供了一种简单的主次复制方法。有一个主要的(来源),并且有一个或多个次要的(副本)。主数据库执行事务,将其提交,然后将它们稍后(因此异步)发送给第二数据库,以重新执行(在基于语句的复制中)或应用(在基于行的复制中)。这是一个无共享系统,默认情况下,所有服务器均具有数据的完整副本。

图 17.1 MySQL 异步复制

执行源接收到的事务,将其写入二进制日志,然后提交,然后将响应发送到 Client 端应用程序。提交之前,二进制日志中的记录将发送到副本 1 和副本 2 上的中继日志。在每个副本上,应用事务,将其写入副本的二进制日志,然后提交。源上的提交和副本上的提交都是独立且异步的。

还有半同步复制,它向协议添加了一个同步步骤。这意味着主服务器在提交时 await 辅助服务器确认它已“接收”到该事务。只有这样,主服务器才会恢复提交操作。

图 17.2 MySQL 半同步复制

源接收到的事务将被执行并写入二进制日志。来自二进制日志的记录将发送到副本 1 和副本 2 上的中继日志。然后,源将 await 副本的确认。当两个副本都返回了确认后,源将提交事务,并将响应发送到 Client 端应用程序。每个副本返回其确认后,它将应用事务,将其写入二进制日志,然后提交。对源的提交取决于来自副本的确认,但是副本上的提交彼此独立,并且与源上的提交独立。

在上面的两张图片中,您可以看到经典的异步 MySQL 复制协议(及其半同步变量)的示意图。对角箭头 table 示服务器之间交换的消息或服务器与 Client 端应用程序之间交换的消息。