16.3.7 故障转移期间切换源
您可以使用更改为主语句告诉副本将其更改为新的源。副本不检查源数据库是否与副本上的数据库兼容。它只是从新源的二进制日志中的指定坐标开始读取和执行事件。在故障转移情况下,组中的所有服务器通常都从同一个二进制日志文件执行相同的事件,因此,如果您在使数据库结构保持谨慎的前提下,更改事件的来源不应该影响数据库的结构或完整性。更改。
副本应使用--log-bin选项运行,如果不使用 GTID,则它们也应在不启用log_slave_updates系统变量的情况下运行。这样,副本就可以准备成为源,而无需重新启动副本mysqld。假设您具有图 16.4,“使用复制的冗余结构,初始结构”中显示的结构。
图 16.4 使用复制的冗余,初始结构
在此图中,MySQL Source
保留了源数据库,Replica
主机是副本,Web Client
机器正在发布数据库读和写。未显示仅发出读取(通常将连接到副本)的 WebClient 端,因为如果发生故障,它们无需切换到新服务器。有关读/写横向扩展复制结构的更多详细示例,请参见第 16.3.4 节“使用复制进行横向扩展”。
每个 MySQL 副本(Replica 1
,Replica 2
和Replica 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 1
启用了log_slave_updates,它将在其自己的二进制日志中写入从MySQL Source
接收到的所有更新。这意味着,当Replica 2
从MySQL Source
更改为Replica 1
作为其源时,它可能会从Replica 1
接收到已从MySQL Source
接收到的更新。
确保所有副本均已处理其中继日志中的所有语句。在每个副本上,发出STOP SLAVE IO_THREAD
,然后检查SHOW PROCESSLIST的输出,直到看到Has read all relay log
为止。当所有副本都为真时,可以将它们重新配置为新设置。在要升级为源的副本Replica 1
上,发出STOP SLAVE和RESET MASTER。
在其他副本Replica 2
和Replica 3
上,使用STOP SLAVE和CHANGE MASTER TO MASTER_HOST='Replica1'
(其中'Replica1'
代 tableReplica 1
的真实主机名)。要使用CHANGE MASTER TO
,请添加有关如何从Replica 2
或Replica 3
(* user
, password
, port
*)连接到Replica 1
的所有信息。在此发出CHANGE MASTER TO
语句时,无需指定Replica 1
二进制日志文件的名称或要读取的日志位置,因为第一个二进制日志文件和位置 4 是默认值。最后,在Replica 2
和Replica 3
上执行START SLAVE。
完成新的复制设置后,您需要告诉每个Web Client
将其语句定向到Replica 1
。从那时起,将Web Client
发送到Replica 1
的所有更新语句写入到Replica 1
的二进制日志中,然后包含由于MySQL Source
失败而发送给Replica 1
的每个更新语句。
生成的服务器结构显示在图 16.5,“源故障后使用复制实现冗余”中。
图 16.5 在发生源故障后使用复制实现冗余
当MySQL Source
再次可用时,应将其复制为Replica 1
。为此,在MySQL Source
上发出与先前在Replica 2
和Replica 3
上发出的相同的更改为主语句。 MySQL Source
然后成为Replica 1
的副本,并获取脱机时丢失的Web Client
写入。
要再次使MySQL Source
成为源,请使用前面的过程,就像Replica 1
不可用并且MySQL Source
将成为新源一样。在此过程中,请不要忘记在MySQL Source
的Replica 1
,Replica 2
和Replica 3
副本上对MySQL Source
运行RESET MASTER。如果您不这样做,则副本可能会从MySQL Source
不可用之前的Web Client
应用程序中获取过时的写入。
您应该注意,即使副本共享相同的源,副本之间也没有同步,因此某些副本可能远远领先于其他副本。这意味着在某些情况下,上一个示例中概述的过程可能无法按预期方式工作。但是,实际上,所有副本上的中继日志应该相对靠近。
使应用程序了解源位置的一种方法是为源创建动态 DNS 条目。使用bind
,您可以使用nsupdate
动态更新 DNS。