MySQL Galera Cluster(5.7)3节点集群阻塞处理记录

欢迎关注公众号

异常说明

图片

客户系统更新版本需要增加字段,客户执行ALTER TABLE SQL后,字段加入到了对应的表中,但发现系统使用异常。

问题定位并解决

问题定位

接收到客户反馈后,首先查看Keepalived的服务状态以及配置,确定Keepalived服务正常,随后查看MySQL集群状态。

查看MySQL节点日志,有输出:

Lock wait timeout exceeded; try restarting transaction

图片

登陆MySQL终端执行MySQL命令“show status like 'wsrep%';”查看节点状态:

A节点和C节点状态正常:

图片

图片

B节点执行MySQL相关命令无响应:

图片

B节点执行命令,MySQL处于运行状态:

systemctl status mysqld

图片

由于B节点的MySQL节点MySQL命令响应超时,故检查系统资源情况:

执行命令查看系统负载正常:

w

图片

执行命令查看内存可用正常:

free -h

图片

执行命令查看磁盘IO情况未见异常:

iostat -x -k 3 50

图片

以上可以判定操作系统无异常。

MySQL Galera Cluster 默认使用Total Ordered Isolation (TOI)模式执行DDL(如ALTER TABLE),该模式会在所有节点同步执行DDL时锁定集群,此时插入操作阻塞直至DDL完成)据此初步判定MySQL集群异常是由B节点卡住导致DDL操作未完成,阻塞整个MySQL集群插入数据。

继续排查,查看正常MySQL节点A和B:

执行MySQL命令查看集群更新DDL方法;
 

show VARIABLES like '%method%';

图片

执行MySQL命令查看事务状态:

select trx_id,trx_state,trx_mysql_thread_id from INNODB_TRX where trx_state="LOCK WAIT";

图片

图片

由此判断MySQL集群确实处于阻塞状态。

问题解决

由于B节点DDL长时间卡住导致集群阻塞,影响业务,且无法通过MySQL命令进行事务操作,为恢复集群可用,需要将B节点暂时踢出集群,遂将MySQL进程kill,此时集群恢复可用。

B节点MySQL被kill后集群阻塞状态消失,MySQL服务由另外两个正常节点提供。B节点MySQL进程由高可用机制自动拉起,进行数据同步,大约30分钟后B节点MySQL恢复正常(集群数据量500G),此时集群整体恢复正常:

图片

图片

异常整改措施以及预防优化建议

整改措施

标准化DDL操作流程

执行DDL前,通过验证所有节点的wsrep_ready为ON、wsrep_cluster_size与节点数量一致。

SHOW STATUS LIKE 'wsrep%' 

使用以下命令检查是否存在未提交事务或长事务:

SELECT * FROM information_schema.innodb_trx

执行模式切换

SET wsrep_OSU_method='RSU'; --切换为滚动升级模式ALTER TABLE <表名> ...;    --执行DDL操作SET wsrep_OSU_method='TOI'; --恢复默认模式

事后验证

检查DDL执行后集群同步状态(wsrep_local_state_comment应为Synced)。

验证业务功能是否正常,并通过测试确认写入无异常。

异常节点快速处理机制

若某节点因DDL卡死导致集群阻塞,立即通过KILL <thread_id>终止相关线程,如果MySQL终端已无法响应,重启该节点MySQL服务。

待节点恢复后,检查wsrep_sst_method配置,确保数据同步(SST/IST)正常完成。

操作日志与回滚预案

记录所有DDL操作的执行时间、节点状态及操作人员,留存操作日志。

为高风险DDL操作设计回滚脚本(如备份原表结构、快速重建表)。

预防优化方案

MySQL集群监控与告警增强

增加监控项

实时监控wsrep_flow_control_paused(流控制暂停比例)配置告警阈值,监控节点状态(wsrep_cluster_status)、同步延迟(wsrep_local_recv_queue_avg)。

MySQL配置优化

调整锁超时时间

优化线程池

优化innodb缓冲池

Re: 《Galera 高可用 MySQL 集群》 (Percona Xtradb Cluster)PXC v5.7 + Haproxy + Keepalived========================================================# Galera Cluster 如何解决问题 我们知道 Galera ClusterMySQL封装了具有高一致性,支持多点写入的同步通信模块Galera而做的,它是建立在MySQL同步基础之上的,使用 Galera Cluster时,应用程序可以直接读、写某个节点的最新数据,并且可以在不影响应用程序读写的情况下,下线某个节点,因为支持多点写入,使得 Failover 变得非常简单。 目前Galera Cluster具备的功能包括如下几个方面:    1) 多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的。    2) 同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失。    3) 并发复制:从节点在APPLY数据时,支持并行执行,有更好的性能表现。    4) 故障切换:在出现数据库故障时,因为支持多点写入,切的非常容易。    5) 热插拔  :在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小。    6) 自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供, Galera Cluster会自动拉取在线节点数据,最终集群会变为一致。    7) 对应用透明:集群的维护,对应用程序是透明的,几乎感觉不到。以上几点,足以说明Galera Cluster是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曹宇飞丶

您的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值