收到告警,有两个一主两从set的从库主从延迟
登录到从库,show slave status查看主从状态,IO 线程和 SQL 线程的状态都是 YES。
show processlist 查看正在运行线程
1、从上图看到2596150正在执行xtabackup的flush tables with read lock。
2、26是并行复制的Coordinator线程。
3、27/28/29是并行复制的worker线程。27/28/29worker线程队列中的事务可以并行执行。
4、26Coordinator线程分发relaylog中事务时发现这个事务不能执行,要等待前面的事务完成提交,所以处于waiting for dependent transaction to commit的状态。是当前事务无法和正在回放的事务并发回放出现的等待。
5、29线程Waiting for preceding transaction to commit,是当前并发回放的事务在进入commit时的flush队列前,必须等到先前事务已经进入flush队列而引起的等待。从库设置slave_preserve_commit_order=ON,保证从库binlog提交顺序,而29线程执行事务对应的binlog靠后面,所以等待27/28的事务提交。
6、2596150占有全局读锁,获取全局commit锁的时候进入阻塞,等待29释放事务涉及到表的commit锁。
7、27/28/29线程和备份线程2596150形成死锁。27/28线程等待2596150线程 global read lock 释放,2596150线程占有MDL::global read lock 全局读锁,申请全局commit lock的时候阻塞等待29线程,29线程占有MDL:: commit lock,最终形成了27/28->2596150->29->27/28的死循环,形成死锁。