CHANGE MASTER TO您可以使用该语句
告诉副本更改为新源
。副本不检查源上的数据库是否与副本上的数据库兼容;它只是从新源的二进制日志中的指定坐标开始读取和执行事件。在故障转移情况下,组中的所有服务器通常都从同一个二进制日志文件执行相同的事件,因此更改事件源不应影响数据库的结构或完整性,前提是您在制作改变。
副本应该使用该
--log-bin选项运行,如果不使用 GTID,那么它们也应该在不启用
log_slave_updates系统变量的情况下运行。这样,副本就可以成为源,而无需重新启动副本mysqld。假设您的结构如图
16.4 “使用复制的冗余,初始结构”所示。
在此图中,MySQL Source拥有源数据库,Replica主机是副本,Web Client机器发出数据库读写。只发出读取(并且通常会连接到副本)的 Web 客户端没有显示,因为它们在发生故障时不需要切换到新服务器。有关读/写横向扩展复制结构的更详细示例,请参阅
第 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'代表 的真实主机名
Replica 1)。要使用CHANGE MASTER
TO,请添加有关如何连接到
Replica 1fromReplica 2或
Replica 3( user,
password,
port) 的所有信息。在此发出CHANGE
MASTER TO语句时,无需指定Replica 1要读取的二进制日志文件的名称或日志位置,因为第一个二进制日志文件和位置 4 是默认值。最后执行
START SLAVEonReplica
2和Replica 3。
一旦新的复制设置就位,您需要告诉每个
Web Client人将其语句定向到
Replica 1. 从那时起,由Web Clientto
发送的所有更新语句Replica 1都将写入 的二进制日志
Replica 1,然后包含Replica 1自
MySQL Source失败以来发送至的每个更新语句。
生成的服务器结构 如图 16.5 “源故障后使用复制的冗余”所示。
当MySQL Source再次可用时,您应该使它成为Replica 1. 为此,请发布与之前发布的声明MySQL Source相同的
声明。然后成为其副本并拾取
它在离线时错过的写入。
CHANGE MASTER TOReplica 2Replica
3MySQL SourceReplica 1Web Client
要MySQL Source再次创建源,请使用前面的过程,就好像Replica 1不可用并且MySQL Source将成为新源一样。在此过程中,不要忘记
RESET MASTER在MySQL
Source制作Replica 1、
Replica 2和Replica 3
的副本之前继续运行MySQL Source。如果您不这样做,副本可能会从应用程序中获取过时的写入,这些Web
Client应用程序的日期是在MySQL Source变得不可用之前。
您应该知道副本之间没有同步,即使它们共享相同的源,因此一些副本可能会远远领先于其他副本。这意味着在某些情况下,前面示例中概述的过程可能无法按预期工作。然而,在实践中,所有副本上的中继日志应该相对靠近。
让应用程序了解源位置的一种方法是为源创建一个动态 DNS 条目。bind您可以使用动态
nsupdate
更新 DNS。