暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU翻译] MySQL 17.4.8 故障转移期间切换源

原创 由迪 2022-10-18
711

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

副本应在启用二进制日志记录( --log-bin选项)的情况下运行,这是默认设置。如果您没有使用 GTID 进行复制,那么副本也应该运行 --log-slave-updates=OFF(记录副本更新是默认设置)。这样,副本就可以成为源,而无需重新启动副本 mysqld。假设您具有图 17.4,“使用复制的冗余,初始结构”中所示的结构。

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

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

在此图中,MySQL Source保存源数据库,MySQL Replica主机是副本,Web Client机器正在发出数据库读取和写入。不显示仅发出读取(通常会连接到副本)的 Web 客户端,因为它们不需要在发生故障时切换到新服务器。有关读/写横向扩展复制结构的更详细示例,请参阅 第 17.4.5 节,“使用复制进行横向扩展”

每个 MySQL 副本(Replica 1Replica 2Replica 3)都是一个副本,运行时启用了二进制日志记录,并且 --log-slave-updates=OFF. 因为在 --log-slave-updates=OFF指定时副本从源接收到的更新不会记录在二进制日志中,所以每个副本上的二进制日志最初都是空的。如果由于某种原因MySQL Source变得不可用,您可以选择其中一个副本作为新源。例如,如果您选择Replica 1,则所有 内容Web Clients都应重定向到 Replica 1,这会将更新写入其二进制日志。Replica 2然后Replica 3应该从 复制Replica 1

运行副本的原因 --log-slave-updates=OFF是为了防止副本接收更新两次,以防您导致其中一个副本成为新源。如果Replica 1--log-slave-updates 启用(这是默认设置),它会将接收到Source的任何更新写入自己的二进制日志中。这意味着,当Replica 2从 更改 SourceReplica 1作为其源时,它可能会收到Replica 1 它已经从 接收到的更新Source

确保所有副本都已处理其中继日志中的任何语句。在每个副本上,发出 STOP REPLICA IO_THREAD,然后检查 的输出, SHOW PROCESSLIST直到看到 Has read all relay log。如果所有副本都是如此,则可以将它们重新配置为新设置。Replica 1在被提升为源的副本上,问题STOP REPLICARESET MASTER.

在其他副本Replica 2and Replica 3上,使用 STOP REPLICAand CHANGE REPLICATION SOURCE TO SOURCE_HOST='Replica1'or CHANGE MASTER TO MASTER_HOST='Replica1'(其中 'Replica1'表示 的真实主机名 Replica 1)。使用CHANGE REPLICATION SOURCE TO| CHANGE MASTER TO, 添加有关如何 Replica 1Replica 2Replica 3( user, password, port) 连接到的所有信息。在这种情况下发出语句时,不需要指定 Replica 1二进制日志文件的名称或要读取的日志位置,因为第一个二进制日志文件和位置 4 是默认值。最后, START REPLICA执行Replica 2and Replica 3

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

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

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

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

Source再次可用时,您应该使其成为Replica 1. 为此,请Source在同一 问题上发布CHANGE REPLICATION SOURCE TO| CHANGE MASTER TO声明Replica 2Replica 3之前发布的一样。Source然后成为它的副本Replica 1并拾取 Web Client它在离线时错过的写入。

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

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

让应用程序了解源位置的一种方法是为源服务器提供动态 DNS 条目。bind您可以使用动态 nsupdate 更新 DNS。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论