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

在此图中,MySQL Master保持主数据库,MySQL Slave主机是复制从属,并且Web Client计算机正在发布数据库读写。未显示仅发出读取操作的Web客户端(通常将其连接到从属服务器),因为如果发生故障,它们不需要切换到新服务器。有关读/写横向扩展复制结构的更多详细示例,请参见“使用复制进行横向扩展”。
每个MySQL从站(Slave 1,Slave 2和Slave 3)是一个从站,运行时启用了二进制日志记录,并带有--log-slave-updates=OFF。由于在--log-slave-updates=OFF指定时从站从主站接收的更新未记录在二进制日志中,因此每个从站上的二进制日志最初都是空的。如果由于某种原因MySQL Master变得不可用,您可以选择一个从站来成为新的主站。例如,如果选择Slave 1,Web Clients则应将所有都重定向到Slave 1,这会将更新写入其二进制日志。Slave 2然后Slave 3应从复制Slave 1。
运行slave with的原因--log-slave-updates=OFF是为了防止奴隶两次接收更新,以防您导致其中一个slave成为新的master。如果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“在主服务器发生故障后使用复制实现冗余”所示。
图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。
