16.3.7 故障转移期间切换源

您可以使用更改为主语句告诉副本将其更改为新的源。副本不检查源数据库是否与副本上的数据库兼容。它只是从新源的二进制日志中的指定坐标开始读取和执行事件。在故障转移情况下,组中的所有服务器通常都从同一个二进制日志文件执行相同的事件,因此,如果您在使数据库结构保持谨慎的前提下,更改事件的来源不应该影响数据库的结构或完整性。更改。

副本应使用--log-bin选项运行,如果不使用 GTID,则它们也应在不启用log_slave_updates系统变量的情况下运行。这样,副本就可以准备成为源,而无需重新启动副本mysqld。假设您具有图 16.4,“使用复制的冗余结构,初始结构”中显示的结构。

图 16.4 使用复制的冗余,初始结构

两个 WebClient 端将数据库读取和数据库写入都定向到单个 MySQL 源服务器。 MySQL 源服务器复制到副本 1,副本 2 和副本 3.

在此图中,MySQL Source保留了源数据库,Replica主机是副本,Web Client机器正在发布数据库读和写。未显示仅发出读取(通常将连接到副本)的 WebClient 端,因为如果发生故障,它们无需切换到新服务器。有关读/写横向扩展复制结构的更多详细示例,请参见第 16.3.4 节“使用复制进行横向扩展”

每个 MySQL 副本(Replica 1Replica 2Replica 3)都是一个运行--log-bin并且未启用log_slave_updates系统变量的副本。因为除非启用log_slave_updates,否则副本从源接收到的更新不会记录在二进制日志中,因此每个副本上的二进制日志最初都是空的。如果由于某种原因MySQL Source变得不可用,则可以选择其中一个副本作为新源。例如,如果选择Replica 1,则应将所有Web Clients重定向到Replica 1,后者会将更新写入其二进制日志。 Replica 2Replica 3然后应从Replica 1复制。

在未启用log_slave_updates的情况下运行副本的原因是为了防止副本两次接收更新,以防您导致其中一个副本成为新源。如果Replica 1启用了log_slave_updates,它将在其自己的二进制日志中写入从MySQL Source接收到的所有更新。这意味着,当Replica 2MySQL Source更改为Replica 1作为其源时,它可能会从Replica 1接收到已从MySQL Source接收到的更新。

确保所有副本均已处理其中继日志中的所有语句。在每个副本上,发出STOP SLAVE IO_THREAD,然后检查SHOW PROCESSLIST的输出,直到看到Has read all relay log为止。当所有副本都为真时,可以将它们重新配置为新设置。在要升级为源的副本Replica 1上,发出STOP SLAVERESET MASTER

在其他副本Replica 2Replica 3上,使用STOP SLAVECHANGE MASTER TO MASTER_HOST='Replica1'(其中'Replica1'代 tableReplica 1的真实主机名)。要使用CHANGE MASTER TO,请添加有关如何从Replica 2Replica 3(* user password port *)连接到Replica 1的所有信息。在此发出CHANGE MASTER TO语句时,无需指定Replica 1二进制日志文件的名称或要读取的日志位置,因为第一个二进制日志文件和位置 4 是默认值。最后,在Replica 2Replica 3上执行START SLAVE

完成新的复制设置后,您需要告诉每个Web Client将其语句定向到Replica 1。从那时起,将Web Client发送到Replica 1的所有更新语句写入到Replica 1的二进制日志中,然后包含由于MySQL Source失败而发送给Replica 1的每个更新语句。

生成的服务器结构显示在图 16.5,“源故障后使用复制实现冗余”中。

图 16.5 在发生源故障后使用复制实现冗余

MySQL 源服务器发生故障,并且不再连接到复制拓扑中。现在,两个 WebClient 端将数据库读取和数据库写入都定向到副本服务器 1,后者是新的源。副本 1 复制到副本 2 和副本 3.

MySQL Source再次可用时,应将其复制为Replica 1。为此,在MySQL Source上发出与先前在Replica 2Replica 3上发出的相同的更改为主语句。 MySQL Source然后成为Replica 1的副本,并获取脱机时丢失的Web Client写入。

要再次使MySQL Source成为源,请使用前面的过程,就像Replica 1不可用并且MySQL Source将成为新源一样。在此过程中,请不要忘记在MySQL SourceReplica 1Replica 2Replica 3副本上对MySQL Source运行RESET MASTER。如果您不这样做,则副本可能会从MySQL Source不可用之前的Web Client应用程序中获取过时的写入。

您应该注意,即使副本共享相同的源,副本之间也没有同步,因此某些副本可能远远领先于其他副本。这意味着在某些情况下,上一个示例中概述的过程可能无法按预期方式工作。但是,实际上,所有副本上的中继日志应该相对靠近。

使应用程序了解源位置的一种方法是为源创建动态 DNS 条目。使用bind,您可以使用nsupdate动态更新 DNS。