最近居然被 MySQL 主从同步的问题坑了, 简直丢尽了老司机的脸, 总结一下.
问题很简单, 一个业务由于 MySQL 主从同步延迟导致读取的数据有问题. 问题解决了, 但如何在 AWS RDS 中获取 MySQL 的延迟信息呢? 非 AWS RDS 的传统 MySQL 中, 可以直接连到 server 通过 SHOW SLAVE STATUS 获取延迟信息.
RDS 呢?
0x00 无处不在的 Cloudwatch
AWS 中大多数(我也不确定是不是所有服务)都接入了 Cloudwatch. Cloudwatch 的好处就是可以作为一个中间层抽象, 将不同系统的数据抽象成一个模型, 统一通过 Cloudwatch API 访问. 就拿主从延迟来说, MySQL/MariaDB 和 PostgeSQL 的计算方法显然是不一样的:
MySQL/MariaDB: the Seconds_Behind_Master field of theSHOW SLAVE STATUS command
PostgreSQL: SELECT extract(epoch from now() - pg_last_xact_replay_timestamp()) AS slave_lag
因此, 只要通过 Cloudwatch API 获取 ReplicaLag 这个 metric 的值就可以判断主从同步延迟, 不管是哪种 DB
def get_cloudwatch_replica_lag(rds_id, start_time, end_time)
local_timezone = pytz.timezone('Asia/Shanghai')
cloudwatch = boto3.client('cloudwatch')
start_time_with_tz = local_timezone.localize(start_time)
end_time_