无奈之下通过强制 kill 掉进程,重启数据库恢复。
这里暂且不说 hang 住的原因,仅分析数据库 hang 住,但是 MHA 未触发切换。
先说下结论,MHA 默认使用长连接对数据库做 ping 健康 检测(执行 select 1 as Value ),4次无法连接 MySQL 则触发切换。 前面数据库 hang 住只是新的连接无法建立,但是老连接却没有影响,且 MHA 的 健康 检测语句很简单,只在 server 层进行了检测,不涉及到 InnoDB 层,所以 MHA 认为 MySQL 是 健康 的,并没有作出任何决策。
MHA 从 0.53 版本开始支持 ping_type 参数设置如何检查 master 的可用性。支持3个 value :
通过将 ping_type 修改设置为 connect ,MHA 每次进程状态检测,需要新建连接,新链接无法成功建立,就触发了切换。
三种检测机制代码:
MHA 配置文件
模拟服务器CPU满负载,数据库无法建立新连接 编写一个简单的c程序,如下:
编译:
执行:
另外再跑两个 mysqlslap 压测程序:
有兴趣的同学可自行测试一下
调用链路:
MHA 监控进程启动后,会持续监控主节点的状态,主要的 健康 检测函数是 wait_until_unreachable()。
在这个函数中会有一个死循环,持续地进行 健康 检测
1.首先,测试连接,连接正确返回0,否则返回1。
2.测试连接成功后,则进行 健康 状态检测(前面说的3种方式);如果连续4次连接失败,则在第4次的时候会使用第二脚本进行检测(如果定义了的话),如果检测通过,则认为 master 挂掉
关键函数 wait_until_unreachable()代码:
HANG 百度翻译叫做悬挂,DBA行话叫做 “卡” 数据库卡住了!那么HANG MANAGER 就是卡住的管理工具!
卡住了有以下两种情况
一 死锁(cycle)。对于这种hang, 除非循环被打破,问题会永远存在。
二 某个堵塞者(blocker) 进程在持有了某些资源后堵住了其他进程。当然,根据堵塞的情况,我们可以把blocker分为直接堵塞进程(immediate blocker)和根堵塞进程(root blocker)。而root blocker 在通常情况下会处于两种状态。
2.1 根堵塞进程处于空闲状态,对于这种情况,终止这个进程能够解决问题。
2.2 根堵塞进程正在等待某些和数据库无关的资源(例如:等待I/O),对于这种情况,终止这个进程也许能解决问题。但是,从数据库的角度来讲,这已经超出了数据库的范畴。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)