如何判断MySQL复制完成?

问题描述

我有一个场景,其中 MysqL 将部署在 2 个独立的区域数据中心。 数据中心 1 - 活动(获取流量) 数据中心 2 - 被动。 两个数据中心的 MysqL 之间将建立数据复制。当发生故障转移时,主动和被动数据中心将翻转。

如何在 Datacenter 2 变为 Active 以接受新请求之前发现数据复制已完成。有没有办法以编程方式检查复制队列的深度?我想确保来自数据中心 1 的复制队列中的所有数据首先插入到数据中心 2 中,然后才能将其标记为活动并接受新请求。

我知道这种设计会在故障转移期间降低应用程序的可用性,但没关系。应用程序更倾向于一致性而不是可用性,因此需要确保在应用新更新之前对数据库的所有先前更新(来自其他 DC 的更新)都已完成。

谢谢!

解决方法

检查的方法之一是运行 SHOW SLAVE STATUS。这将返回大量信息,例如正在复制的内容、主从日志位置以及复制状态。但是只是为了确定它是否最新是检查master后面的秒数。如果主值落后的秒数为 0,则复制是最新的,零以上是落后的秒数。

虽然我注意到一件事,只是因为它说落后 5 秒并不总是意味着还有 5 秒,这取决于导致延迟的原因。

当您从 MySQL 客户端运行 SHOW SLAVE STATUS 时,在命令行/终端上,您最好使用 \G 而不是 ;,因为它会更好地格式化以便您阅读详细信息。

例如 SHOW SLAVE STATUS\G 代替 SHOW SLAVE STATUS;

再次检查Slave_IO_RunningSlave_SQL_Running的值都是yes也是一个好主意,如果其中一个不是,master后面的秒数可以显示0,但这意味着复制不是正在运行并且数据库不是最新的。