记录一下那天晚上的排查过程。从库延迟从几秒涨到几小时,读请求拿到旧数据,业务侧出现刚写入就查不到的情况。
排查方向其实有限,先把可能性排一排。从库只有一个回放线程,赶不上主库并发写入。少数情况下是大事务或者大批量更新长时间阻塞回放。
少数情况下是从库磁盘性能差,回放速度被 IO 限制。
动手时先确认延迟和线程状态
mysql -e 'show slave status\G' | grep -E 'Behind|Running|Retrieved'
随后看主库当前的写入位置
mysql -e 'show master status'
接着确认是否有大事务在跑
mysql -e 'select * from information_schema.innodb_trx order by trx_started limit 3'
末了开启并行回放
mysql -e 'set global slave_parallel_workers=8'
那几天正好在做别的变更,先把时间线对齐才敢动手。
改完先别撤,确认这几项。延迟回到个位数并在业务高峰保持稳定,读写不再出现数据不一致的反馈。
这里还有个坑。并行回放对同一张表的并发写入帮助有限;真正的长事务才是延迟的常见原因,先把它找出来。报错文案容易误导,真正的原因往往在相邻那一层的日志里。