mysql - 如何确定 MySQL 复制是否完成?
问题描述
我有一个场景,MySQL 将部署在 2 个独立的区域数据中心。数据中心 1 - 主动(占用流量) 数据中心 2 - 被动。将在两个数据中心的 MySQL 之间设置数据复制。当发生故障转移时,主动和被动数据中心将被翻转。
如何在 Datacenter 2 可以激活以接受新请求之前确定数据复制是否完成。有没有办法以编程方式检查复制队列的深度?我想确保从数据中心 1 飞行中的复制队列中的所有数据首先插入数据中心 2,然后才能将其标记为活动并且可以接受新请求。
我知道这种设计会在故障转移期间降低应用程序的可用性,但这没关系。应用程序倾向于一致性而不是可用性,因此需要确保在应用新更新之前对数据库的所有先前更新(来自其他 DC 的飞行中)都已完成。
谢谢!
解决方案
检查的方法之一是运行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,但这意味着复制没有运行并且数据库不是最新的。
推荐阅读
- django - Django 模型字段依赖于另一个模型字段
- java - 当应用程序被杀死时,AlarmManager 在前台服务中不起作用
- c# - 当类实现所有接口但未声明接口时,将类调整为接口
- angular - 从 ionic-select-searchable 迁移到 ionic-selectable 会引发问题
- dns - 如何更改域 CloudFlare 的 NS 服务器?
- android - Firebase 电话号码身份验证失败
- azure - 每月数百万个数据集的 Azure 服务
- sql - SQL Server - 执行时“主要”附近的语法错误
- javascript - Slack OAuth 设置步骤 1 - 使用 Postman 进行测试 - 错误:无效的 client_id 参数
- python - 是否可以有一个一致的 setup.py 文件来反映对依赖项的本地更改?