CHANGE REPLICATION SOURCE TO 您可以使用语句(来自 MySQL 8.0.23)或CHANGE MASTER TO语句(在 MySQL 8.0.23 之前) 告诉副本更改为新源 。副本不检查源上的数据库是否与副本上的数据库兼容;它只是从新源的二进制日志中的指定坐标开始读取和执行事件。在故障转移情况下,组中的所有服务器通常都从同一个二进制日志文件执行相同的事件,因此更改事件源不应影响数据库的结构或完整性,前提是您要小心改变。
副本应在启用二进制日志记录( --log-bin选项)的情况下运行,这是默认设置。如果您没有使用 GTID 进行复制,那么副本也应该运行 --log-slave-updates=OFF(记录副本更新是默认设置)。这样,副本就可以成为源,而无需重新启动副本 mysqld。假设您具有图 17.4,“使用复制的冗余,初始结构”中所示的结构。
图 17.4 使用复制的冗余,初始结构

在此图中,MySQL Source保存源数据库,MySQL Replica主机是副本,Web Client机器正在发出数据库读取和写入。不显示仅发出读取(通常会连接到副本)的 Web 客户端,因为它们不需要在发生故障时切换到新服务器。有关读/写横向扩展复制结构的更详细示例,请参阅 第 17.4.5 节,“使用复制进行横向扩展”。
每个 MySQL 副本(Replica 1、Replica 2和Replica 3)都是一个副本,运行时启用了二进制日志记录,并且 --log-slave-updates=OFF. 因为在 --log-slave-updates=OFF指定时副本从源接收到的更新不会记录在二进制日志中,所以每个副本上的二进制日志最初都是空的。如果由于某种原因MySQL Source变得不可用,您可以选择其中一个副本作为新源。例如,如果您选择Replica 1,则所有 内容Web Clients都应重定向到 Replica 1,这会将更新写入其二进制日志。Replica 2然后Replica 3应该从 复制Replica 1。
运行副本的原因 --log-slave-updates=OFF是为了防止副本接收更新两次,以防您导致其中一个副本成为新源。如果Replica 1已--log-slave-updates 启用(这是默认设置),它会将接收到Source的任何更新写入自己的二进制日志中。这意味着,当Replica 2从 更改 Source到Replica 1作为其源时,它可能会收到Replica 1 它已经从 接收到的更新Source。
确保所有副本都已处理其中继日志中的任何语句。在每个副本上,发出 STOP REPLICA IO_THREAD,然后检查 的输出, SHOW PROCESSLIST直到看到 Has read all relay log。如果所有副本都是如此,则可以将它们重新配置为新设置。Replica 1在被提升为源的副本上,问题STOP REPLICA和RESET MASTER.
在其他副本Replica 2and Replica 3上,使用 STOP REPLICAand CHANGE REPLICATION SOURCE TO SOURCE_HOST='Replica1'or CHANGE MASTER TO MASTER_HOST='Replica1'(其中 'Replica1'表示 的真实主机名 Replica 1)。使用CHANGE REPLICATION SOURCE TO| CHANGE MASTER TO, 添加有关如何 Replica 1从Replica 2或 Replica 3( user, password, port) 连接到的所有信息。在这种情况下发出语句时,不需要指定 Replica 1二进制日志文件的名称或要读取的日志位置,因为第一个二进制日志文件和位置 4 是默认值。最后, START REPLICA执行Replica 2and Replica 3。
一旦新的复制设置到位,您需要告诉每个 Web Client人将其语句定向到 Replica 1. 从那时起,Web Clientto 发送的所有更新语句Replica 1都将写入 的二进制日志 ,其中包含自 停止 以来Replica 1发送到的每个更新语句。Replica 1``Source
生成的服务器结构 如图 17.5 “源故障后使用复制的冗余”所示。
图 17.5 源故障后使用复制的冗余

当Source再次可用时,您应该使其成为Replica 1. 为此,请Source在同一 问题上发布CHANGE REPLICATION SOURCE TO| CHANGE MASTER TO声明Replica 2与Replica 3之前发布的一样。Source然后成为它的副本Replica 1并拾取 Web Client它在离线时错过的写入。
要Source再次创建源,请使用前面的过程,就好像Replica 1不可用并且Source要成为新源一样。在此过程中,不要 忘记RESET MASTER在Replica 1制作Replica 1、 Replica 2和. 如果您不这样做,则副本可能会从应用程序中获取过时的写入,该应用程序的日期是在不可用之前。 Replica 3``Source``Web Client``Source
您应该知道副本之间没有同步,即使它们共享相同的源,因此某些副本可能大大领先于其他副本。这意味着在某些情况下,前面示例中概述的过程可能无法按预期工作。然而,在实践中,所有副本上的中继日志应该相对靠近。
让应用程序了解源位置的一种方法是为源服务器提供动态 DNS 条目。bind您可以使用动态 nsupdate 更新 DNS。




