1 阅读之前的准备工作
1 一个IDE工具 ,博主自己尝试了vscode安装perl的插件,但是函数 、变量 、模块等都不能跳转,阅读起来不是很方便。后来尝试使用了pycharm安装perl插件,阅读支持跳转,自己也能写一些简单的测试样例,比较推荐。
2 对perl语法的简单了解。我是通过菜鸟教程 和 perl 官网去了解一些关键字,符号等的用法。perl 相比Python等其他语言,网上的资料还是比较少。而且perl语言给我的感觉是语法比较随性,关键字 符号比较多。遇到不是很理解的我都是查下官网然后动手测试下。
2 阅读版本
MHA 0.58
3 源码目录结构
4 脚本命令功能
masterha_check_repl 检查mysql复制关系
masterha_check_ssh 检查服务器免密ssh连通性
masterha_check_status 检查被mha监控的MySQL主库状态
masterha_conf_host 从配置文件中移除host或往配置文件中添加host
masterha_manager 监控mysql主库可用性并在不可用时进行切换
masterha_master_monitor 监控mysql主库可用性 (检测MHA运行状态)
masterha_master_switch 在线切换脚本
masterha_secondary_check 二次检查脚本
masterha_stop 停止MHA进程
5 源码解读
启动MHA会使用以下的命令
nohup masterha_manager --conf=/home/mha/conf/app1.cnf &
停止命令
masterha_stop --conf=/home/mha/conf/app1.cnf
所以我们阅读 MHA 源码,可以从 脚本masterha_manager.pl 作为程序的入口 ,本篇文章主要介绍 MHA如何 监控主实例 。
函数调用链如下
执行 masterha_manager 命令启动
-->MHA::MasterMonitor::main
-->wait_until_master_is_dead()
-->wait_until_master_is_unreachable()
-->wait_until_unreachable($)
大部分的监控逻辑在函数wait_until_master_is_unreachable中 ,以下是函数的源码阅读的流程图
整体流程图
源码阅读总结
监控主库故障的函数 是一个无限循环的函数,知道主库宕机或出现连接问题
1探活方式
ping_type (从 0.53 版本开始支持)
- 默认情况下,MHA 建立到主服务器的持久连接,并通过执行 "SELECT 1"(ping_type=SELECT)检查主服务器的可用性。
- 但在某些情况下,最好每次连接/断开连接都进行检查,因为它更严格,可以更快地检测到 TCP 连接级别的故障。设置 ping_type=CONNECT 可以实现这一点。
- 从 0.56 版本开始,添加了 ping_type=INSERT。会创建一个库表,进行数据插入
CREATE DATABASE IF NOT EXISTS infra
INSERT INTO infra.chk_masterha values (1,unix_timestamp()) ON DUPLICATE KEY UPDATE val=unix_timestamp()
2 探活间隔
ping_interval
此参数说明 MHA Manager 多久 ping(执行 ping SQL 语句)一次主服务器。连续错过三个连接间隔后,MHA 管理器确定 MySQL 主服务器已死亡。因此,通过 ping 机制发现故障的最长时间是 ping 间隔的四倍。默认为 3(3 秒)。
如果 MHA Manager 由于太多连接或身份验证错误而无法连接,则不会将主服务器视为已死亡。