MGR MYSQL 集群崩溃恢复,及非正常手段修复

本文详细记录了一次MYSQL MGR集群在压力测试中遇到的问题及修复过程,包括内存溢出、磁盘空间不足导致的集群失败状态,以及通过GTID和日志清理等手段进行的集群恢复。

生产即将部署MYSQL  MGR 的环境,进行对接银行的项目,在测试系统上进行测试了的两个月的MGR 没有任何问题,出过一次问题,还是开发人员不大熟悉MYSQL 的原理,使用了大事务,将MYSQL MGR 卡死,经过几分钟的处理,一切正常,基本上几百万的数据的查询都在秒级。完全不逊色其他数据库产品的响应。

最近出了事情,所以必须要对任何系统的上线进行严控,这边MYSQL MGR 上线需要进行严格的上线测试,得到目前MYSQL 集群能HOLD 住的数据量,这样才能给运维和开发一个参数和数据承受范围,避免一些不好的事情出现。

将SYSBENCH 搭建在 PROXYSQL 中间件上,开始压测,初始没有任何问题,后面加大压测的数据量,30个表每个表500MB,30个线程,持续5分钟,在PERPARE的时候,发现到第10个表系统已经没有反应了,查询了内存已经开始使用了 SWAP了,应该是内存已经爆了,停止系统的线程,发现无法停止。SHOW PROCESSLIST; 

发现大量 insert into 的语句开卡在线程池里面,手动清理,无效。

无意之间查看了磁盘空间,OMG,UNDO LOG 和 RELAY LOG 的空间已经爆了,100%的使用率。

此时查询集群的状态,集群已经处于失败的状态,(图没有留,下面的图中的 MEMBER_STATE,应该是OFFILINE 的状态了)

此时集群已经散掉了,查看日志,其实日志已经在昨天就已经报警了(因为压力测试是前天做的,但是由于突发情况就没有再管压力测试,几天在测,发现已经出了问题)

没有良好的系统测试,无论是硬件方面的还是软件方面的,都为未来的“重击”买下了伏笔。

所幸,本次做了,所以在系统上线前发现了问题。

下面就是修复,在通知运维的同学后,添加了磁盘空间,然后系统重新集群的搭建和启动。(MYSQL MGR 还是很健壮的,只是重启了集群,将失败的节点添加)

但此时第二个问题出来了,由于RELAY LOG的磁盘空间问题,已经有很多日志挤压了.

最省事的方法就是BACKUP 主库,然后在 RESTORE   到从库,从起MGR 就可以了。如此也就放弃了,更深层次修复的MGR的技巧。首先我们先强制从节点启动,马上一堆挤压的LOG 开始执行,由于在当时为了磁盘空间的问题,已经在主库和从库都删除了测试数据库。(仅仅为了试验,上线的绝对禁止)

洪水一般的日志向STANDBY节点袭来,都是报日志与当前操作的环境不一致之造成的报错,当下还是一直的执行,但后面突然停下来,原来是DROP DATABASE 这样的操作又被卡主了,(这和MYSQL当时的可以容忍的复制ERROR有关,DDL操作是不能容忍的错误)这下数据库从节点彻底锁死。

好吧那就开始修复集群。

 (不熟悉MGR 和 GTID 原理的估计看下面就开始费劲了)

1 我们查看主节点的GTID 号

2620d5df-07e7-11e9-8fa8-005056ad4145:1-2740,

81f38f19-09d2-4144-8925-484ad1cb5c6f:1-1002,

bf79695c-0e78-11e9-9c14-005056ad1469:1

主库的日志已经到了这个GTID 并且 是 MYSQL-BIN.000012

2 我们在看从库的状态

果然是不一样,当然应该不一样,要不集群就不会是失败的状态。

3 开始修复

我们先停止从节点

stop group_replicatiton;

清空当前GTID EXECUTED

reset master;

设置和主节点一样的 EXECUTED_GTID_SET

启动复制

start group_replication;

再次查看修复的那个从节点的状态,已经上线了

查看对应的日志,OK 已经和主同步了,(如果你熟悉GTID的原理你就知道为什么了)

使用此种手段,修复第二个节点

修复成功,集群恢复工作。

再次验证是否还有挤压的 TRANSACTION LOG

没有了,当然没有了。

此种方法使用是有条件的,要根据当前的状态,如果是复杂的状态,还是建议用传统的方法来进行恢复,不过如果你对你的MYSQL MGR 集群和相关系统的运作了解,你可以在紧急的状况或测试环境做一遍,对了解MGR的原理和紧急状态的修复会受益匪浅。

 这也从另一点上验证了,系统上线前不做测试,那纯属找死。

### 3.1 VIP 自动漂移的实现原理 在 MySQL MGR 集群中,VIP(虚拟 IP)的自动漂移依赖于外部工具或脚本,因为 MySQL 官方并未提供原生的 VIP 管理机制。MGR 本身支持自动故障切换,但在主节点变更后,客户端仍需感知新的主节点地址。通过 VIP,可以将该 IP 地址绑定到当前主节点上,从而实现客户端连接的透明切换 [^1]。 ### 3.2 使用 Keepalived 实现 VIP 漂移 Keepalived 是一个常用的高可用性工具,可用于管理 VIP 的绑定和漂移。它通过 VRRP 协议实现主备切换,确保 VIP 始终绑定在当前主节点上。 #### 配置示例 ```bash vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 192.168.1.100 } track_script { chk_mysqld } } vrrp_script chk_mysqld { script "/usr/local/bin/check_mysqld.sh" interval 2 weight -20 } ``` 在上述配置中,`192.168.1.100` 是分配给主节点的 VIP。脚本 `check_mysqld.sh` 用于检测本地 MySQL 实例是否正常运行。如果主节点故障,Keepalived 会自动将 VIP 漂移到新的主节点上 [^4]。 ### 3.3 使用脚本实现 VIP 管理 除了 Keepalived,也可以使用自定义脚本或 Go 编写的工具实现 VIP 的自动漂移。例如,可以在 MGR 节点上部署一个监控服务,定期检查当前节点是否为主节点。如果是,则绑定 VIP;否则释放 VIP。 #### 示例脚本逻辑(伪代码) ```bash while true; do current_role=$(mysql -e "SELECT @@server_id, MEMBER_ROLE FROM performance_schema.replication_group_members WHERE MEMBER_ID = (SELECT VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'server_uuid');" | awk '{print $2}') if [ "$current_role" == "PRIMARY" ]; then ip addr add 192.168.1.100 dev eth0 else ip addr del 192.168.1.100 dev eth0 fi sleep 5 done ``` 此脚本定期检查当前节点是否为 MGR 主节点,并根据结果绑定或释放 VIP,从而实现自动漂移 [^1]。 ### 3.4 与 MHA 的对比 MHA(Master High Availability)同样支持 VIP 自动漂移,但其主要适用于传统的主从架构,而非 MGR。MHA 通过探测主节点状态并在故障时提升从节点为主节点,同时将 VIP 漂移到新的主节点上,整个过程对应用程序透明 [^3]。相比之下,MGR 的 VIP 漂移更依赖于外部工具,但其架构更适用于分布式、多节点的高可用场景。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值