问题描述
我有一个场景,其中 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_Running
和Slave_SQL_Running
的值都是yes也是一个好主意,如果其中一个不是,master后面的秒数可以显示0,但这意味着复制不是正在运行并且数据库不是最新的。