首页 > 解决方案 > 如何确定 MySQL 复制是否完成?

问题描述

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

如何在 Datacenter 2 可以激活以接受新请求之前确定数据复制是否完成。有没有办法以编程方式检查复制队列的深度?我想确保从数据中心 1 飞行中的复制队列中的所有数据首先插入数据中心 2,然后才能将其标记为活动并且可以接受新请求。

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

谢谢!

标签: mysqldatabase-replication

解决方案


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

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

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

例如 SHOW SLAVE STATUS\G ,而不是 SHOW SLAVE STATUS;

Slave_IO_Running仔细检查和的值也是一个好主意Slave_SQL_Running,如果其中任何一个都不是,则master后面的秒数可以显示为0,但这意味着复制没有运行并且数据库不是最新的。


推荐阅读