MySQL 8.0 参考手册  / 第十七章复制  / 17.4 复制解决方案  /  16.3.7 在故障转移期间切换源

16.3.7 在故障转移期间切换源

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

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

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

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

在此图中,MySQL Source拥有源数据库,Replica主机是副本,Web Client机器发出数据库读写。只发出读取(并且通常会连接到副本)的 Web 客户端没有显示,因为它们在发生故障时不需要切换到新服务器。有关读/写横向扩展复制结构的更详细示例,请参阅 第 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 2然后Replica 3 应该从复制Replica 1

在未启用的情况下运行副本的原因 log_slave_updates是为了防止副本在您导致其中一个副本成为新源的情况下接收两次更新。如果Replica 1log_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'代表 的真实主机名 Replica 1)。要使用CHANGE MASTER TO,请添加有关如何连接到 Replica 1fromReplica 2Replica 3( user, password, port) 的所有信息。在此发出CHANGE MASTER TO语句时,无需指定Replica 1要读取的二进制日志文件的名称或日志位置,因为第一个二进制日志文件和位置 4 是默认值。最后执行 START SLAVEonReplica 2Replica 3

一旦新的复制设置就位,您需要告诉每个 Web Client人将其语句定向到 Replica 1. 从那时起,由Web Clientto 发送的所有更新语句Replica 1都将写入 的二进制日志 Replica 1,然后包含Replica 1MySQL Source失败以来发送至的每个更新语句。

生成的服务器结构 如图 16.5 “源故障后使用复制的冗余”所示。

图 16.5 使用复制的冗余,源故障后

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

MySQL Source再次可用时,您应该使它成为Replica 1. 为此,请发布与之前发布的声明MySQL Source相同的 声明。然后成为其副本并拾取 它在离线时错过的写入。 CHANGE MASTER TOReplica 2Replica 3MySQL SourceReplica 1Web Client

MySQL Source再次创建源,请使用前面的过程,就好像Replica 1不可用并且MySQL Source将成为新源一样。在此过程中,不要忘记 RESET MASTERMySQL Source制作Replica 1Replica 2Replica 3 的副本之前继续运行MySQL Source。如果您不这样做,副本可能会从应用程序中获取过时的写入,这些Web Client应用程序的日期是在MySQL Source变得不可用之前。

您应该知道副本之间没有同步,即使它们共享相同的源,因此一些副本可能会远远领先于其他副本。这意味着在某些情况下,前面示例中概述的过程可能无法按预期工作。然而,在实践中,所有副本上的中继日志应该相对靠近。

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