【MHA】MySQL高可用MHA源码1-主库故障监控

server/2024/9/22 16:51:43/

 

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 由于太多连接或身份验证错误而无法连接,则不会将主服务器视为已死亡。


http://www.ppmy.cn/server/23891.html

相关文章

飞行汽车飞行控制系统功能详解

飞行汽车是一种创新的交通工具,结合了汽车和飞机的特点。它可以在陆地上行驶,同时也具备在空中飞行的能力。飞行汽车的概念已经存在多年,并且近年来随着技术的进步和研发的深入,这种交通工具正在逐渐从概念走向现实。 飞行汽车的…

LeetCode-非递增子序列

每日一题 今天刷的依旧是一道中等题,不过感觉今天这道题是中等难度里面比较难的题了,思考了很长时间。过程感觉比较难以理解。 题目要求 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两…

第27篇 Spring简介

Spring框架是Java企业级应用的主流框架,其主要基于IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)设计原则。Spring的核心语法主要包括Bean的定义、装配、自动扫描、A…

利用GaussDB的可观测性能力构建故障模型

D-SMART高斯专版已经开发了几个月了,目前主要技术问题都已经解决,也能够初步看到大概的面貌了。有朋友问我,GaussDB不已经有了TPOPS了,为什么你们还要开发D-SMART高斯专版呢? 实际上TPOPS和D-SMART虽然都可以用于Gaus…

前端vue scope的定义以及用法

这段代码是 Vue 组件中用于定义表格列的代码,包含了自定义模板和逻辑,以显示特定格式的内容。在这里,el-table-column 来自 Element UI 框架,提供了一种简洁的方式来定义表格的列及其显示内容。 让我们看看这段代码的细节&#x…

pytorch 实现语义分割 PSPNet

语意分割是指一张图片上包含多个物体,通过语义分割可以识别物体分类、物体名称、像素识别的任务。和物体检测不同,他不会将物体框出来,而是根据像素的归属把物体标注出来。PSPNet 的输入是一张图片,例如300500,那么输出…

套接字以及相关函数

socket函数 linux下的socket函数&#xff1a; #include<sys/socket.h> int socket(int domain, int type, int protocol); 参数&#xff1a; domain 套接字中使用的协议族信息 type 套接字数据传输类型信息 …

算法人生(13):从“Scrum”看“PDCA时间管理法”

很多人会好奇为什么“读了很多书&#xff0c;却依然不知道怎么过好这一生”&#xff1f;大家可能都有各自的理解&#xff0c;但正如王阳明先生的“知行合一”所说&#xff0c;“知”要能“行”出来才算“真知”&#xff0c;生活中很多时候知并不一定能行&#xff0c;所以知与行…