您可以使用该CHANGE MASTER TO语句告诉从站更改为新的主站 。从服务器不会检查主服务器上的数据库是否与从服务器上的数据库兼容。它只是从新主数据库的二进制日志中的指定坐标开始读取和执行事件。在故障转移情况下,组中的所有服务器通常都从同一个二进制日志文件中执行相同的事件,因此,如果您在执行操作时要格外小心,则更改事件的来源不应影响数据库的结构或完整性。更改。
从站应使用该–log-bin选项运行 ,如果不使用GTID,则也应在不启用log_slave_updates系统变量的情况下运行它们 。这样,从属服务器就可以成为主服务器,而无需重新启动从属服务器mysqld。假设您具有图17.4“使用复制实现冗余,初始结构”中 所示的结构。

在此图中,MySQL Master保持主数据库,MySQL Slave主机是复制从属,并且Web Client计算机正在发布数据库读写。未显示仅发出读取操作的Web客户端(通常将其连接到从属服务器),因为如果发生故障,它们不需要切换到新服务器。有关读/写横向扩展复制结构的更详细的示例,请参见第17.3.4节“使用复制进行横向扩展 ”。
每个MySQL Slave(Slave 1,Slave 2和Slave 3)都是一个–log-bin在启用和未启用log_slave_updates系统变量的情况下运行的从站。由于除非log_slave_updates启用了从属服务器从主服务器接收的更新,否则不会记录在二进制日志中 ,因此每个从属服务器上的二进制日志最初都是空的。如果由于某种原因 MySQL Master变得不可用,您可以选择一个从站来成为新的主站。例如,如果选择Slave 1,Web Clients则应将所有都重定向到Slave 1,这会将更新写入其二进制日志。 Slave 2然后Slave 3应从复制Slave 1。
运行未log_slave_updates启用从属服务器的原因 是为了防止从属服务器两次接收更新,以防您导致其中一个从属服务器成为新的主服务器。如果Slave 1已log_slave_updates 启用,它将Master在其自己的二进制日志中写入从其接收的所有更新 。这意味着,当Slave 2从改变 Master到Slave 1它的主人,它可以接收更新Slave 1 ,它已经从收到的Master。
确保所有从站都已处理其中继日志中的所有语句。在每个从站上,发出STOP SLAVE IO_THREAD,然后检查的输出, SHOW PROCESSLIST直到看到 Has read all relay log。当所有从站都为真时,可以将它们重新配置为新设置。在奴隶Slave 1被提升成为主人的时候,发出STOP SLAVE和 RESET MASTER。
在其他从服务器 Slave 2和Slave 3,使用STOP SLAVE和 CHANGE MASTER TO MASTER_HOST=‘Slave1’(其中 'Slave1’代表真正的主机名 Slave 1)。要使用CHANGE MASTER TO,添加有关如何连接到的所有信息 Slave 1来自Slave 2或 Slave 3(user, password, port)。CHANGE MASTER TO在此发布语句时,无需指定Slave 1二进制日志文件的名称或要读取的日志位置,因为第一个二进制日志文件和位置4是默认值。最后,START SLAVE在Slave 2和上执行 Slave 3。
新的复制设置到位后,您需要告诉每个 Web Client将其语句定向到 Slave 1。从那时起,由发送Web Client到的所有更新语句将Slave 1写入的二进制日志中Slave 1,然后包含Slave 1自Master死后发送给的每个更新语句 。
结果服务器结构 如图17.5“在主服务器发生故障后使用复制实现冗余”所示。

当Master再次可用时,您应使其成为的从属Slave 1。为此,请使用与之前发布的声明Master相同的CHANGE MASTER TO声明发布。 然后成为其的从属,并获取脱机时错过的写入。 Slave 2Slave 3MasterS1ave 1Web Client
要Master再次制作母版,请使用前面的步骤,好像Slave 1不可用并且Master要成为新的母版一样。在此过程中,不要忘了运行 RESET MASTER在 Master制作之前Slave 1,Slave 2和Slave 3奴隶Master。如果您不这样做,则从服务器可能会从Web Client应用程序Master不可用之前获取过时的写入。
您应该注意,即使从站共享相同的主站,从站之间也没有同步,因此某些从站可能会领先于其他从站。这意味着在某些情况下,上一个示例中概述的过程可能无法按预期方式工作。但是,实际上,所有从站上的中继日志应该相对靠近。
使应用程序了解主机的位置的一种方法是为主机提供动态DNS条目。使用 bind可以nsupdate 动态更新DNS。




