暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

怎么保证 MySQL 主从一致性?怎么判断不一致?

110
去年,在【DBA驿站】星球里分享过蚂蚁金服的DBA岗面试题,第8题是这样的:

怎么保证 MySQL 主从一致性?怎么判断不一致?

当时的解析是:

保证 MySQL 主从一致性的方法:

保证主从的配置一致

Binlog使用Row格式

使用GTID复制

从库设置Read Only

可以通过pt-table-checksum来校验主从的数据是否有不一致的情况


最近,跟几位星友把这个面试题的解析进行了优化,如下:

保证 MySQL 主从一致性的方法:

1) Binlog使用Row格式

避免语句里有随机函数而导致主从数据不一致的情况

binlog_row_image = FULL,确保记录完整数据镜像(@蓝梦 补充)


2) 使用GTID复制

便于准确追踪、切换。


3) 从库设置Read Only

避免在从库误写导致的不一致。

@sky 补充,需要设置super_read_only会更好。确实,这样从库写入数据的可能性更低。


4) 开启半同步复制

降低主宕机时丢事务的风险


5) 开启双一

增加事务安全性


6) 日志校验

主:binlog_checksum=CRC32、master_verify_checksum=ON;

从:slave_sql_verify_checksum=ON

binlog_checksum,这个参数用于设置Binlog的校验算法,设置为CRC32,MySQL 会对每个写入的 binlog 事件生成一个 CRC32 校验和,并将该校验和附加到事件的末尾。这样可以确保 binlog 内容在传输过程中没有被损坏。

master_verify_checksum,主库会在写入每个 binlog 事件之前计算该事件的校验和,并在事件的末尾附加该校验值;

slave_sql_verify_checksum,启用从库 SQL 线程的 binlog 校验。当设置为 ON 时,从库在接收到主库的 binlog 事件并应用它时,会对 binlog 事件进行 校验和验证。如果从库收到的 binlog 事件校验和与事件的实际内容不匹配,从库会报错,防止将损坏或不一致的数据应用到从库数据库。


7) 避免使用MyISAM

前段时间小编就遇到一个狗血的问题,表是MyISAM表,主从数据不一致,但复制也没报错,最终排查就是从库的表损坏了。


8) expire_logs_days 或者binlog_expire_logs_seconds设置足够旧,防止延迟或者中断场景,Binlog不够用导致主从不一致。(@蓝梦 补充)


怎么判断不一致?

1)  查看复制状态

执行show slave status\G如果发现复制中断或者存在延迟,则主从基本是不一致的


2)  通过一致性校验工具校验来确定

比如pt-table-checksum

其原理是在主库把数据分为多个数据块,然后执行数据块的checksum,再比较从库上相同数据块的checksum的值,来判断主从数据是否一致。

如果发现不一致,可以使用pt-table-sync进行修复。


欢迎大家继续补充。


更多经典DBA面试题,欢迎加入【DBA驿站】星球。


近期文章

怎样构建自己的数据库运维平台?

这些Xtrabackup的问题你遇到过吗?

一周41个技术问题,来自社群的强烈推背感

从小镇做题家到大厂DBA,他是怎样学习的?

通过低代码平台go-admin开发MySQL元数据管理系统

文章转载自MySQL数据库联盟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论