dba+开源工具:MHA复刻版,轻松实现MySQL高可用故障转移(附下载)

由于MHA(mha4mysql-manager)工具在2018年已经停止维护更新,且不支持GTID复制模式,在原版基础上增补功能难度较大,因此考虑将其重构。

参考了原版MHA的故障切换思路,改进的地方如下:

1、无需打通ssh公私钥互信认证,只需在app1.cnf配置文件里提供用户名和密码(root权限)即可,这一步的作用是漂移VIP,工具会直接进入远程主机上执行ip addr add VIP。

2、目前主流版本MySQL 5.7和8.0的复制模式是基于Gtid,因事务号是唯一的,更改同步复制源不需要知道binlog文件名和position位置点,固简化了在客户端部署agent做数据补齐。

3、无需安装,就两个文件,一个是(环境配置检查)可执行文件masterha_check_repl_mysql,一个是(故障自动转移autofailover和在线平滑切换online switch)可执行文件masterha_manager_mysql。

4、 基于主从复制(GTID复制模式)才可以运行,masterha_check_repl_mysql工具会检测,如果是基于binlog和position(位置点复制模式)不能运行。可开启半同步复制确保切换以后数据完整性(至少有一个从库确认已接收到所有事件)。

5、masterha_manager_mysql守护进程主控文件,集成了(masterha_master_switch + master_ip_failover + masterha_secondary_check + shutdown_script + weixin_alarm)捆绑在一起。

6、AutoFailover自动故障切换(转移)VIP后,会发送微信公众号报警通知。

7、支持远控卡重启服务器(避免脑裂问题)。例如删除VIP失败,主机已经hang住,只能通过远程管理卡去重启机器。在这里可以调用远控卡命令,比如DELL服务器的ipmitool命令(可参考:https://www.cnblogs.com/EricDing/p/8995263.html)。

配置文件参数解析

请按照app1.cnf范例模板严丝合缝地进行设置。

1、log日志输出文件。

manager_workdir = /root/mha_log/app1.log

2、监控间隔时间,单位秒。

connect_interval = 1

3、开启调用其他从库去连接主库,如果不需要,则删除masterha_secondary_check这行内容,脚本会调用从库的mysql命令,默认读取路径是/usr/bin/mysql(已经写死在脚本里),如没有请创建一个软连接。

masterha_secondary_check = slave1,slave2

4、当从库出现延迟时,超过60秒内未同步完数据,强制开启VIP故障切换转移。

running_updates_limit = 60

5、设置远程管理卡,当VIP无法卸载时,通过调用命令重启服务器。

ipmitool -I lanplus -H 远控卡主库IP -U 远程console用户 -P 远程console密码 power reset

如果不需要,则删除shutdown_script这行内容

shutdown_script = ipmitool -I lanplus -H 172.31.198.239 -U root -P calvin power reset

6、设置主库故障切换后触发微信报警(wechar.py和masterha_manager_mysql文件放在同一目录下)。

weixin_alarm = /usr/bin/python wechat.py yourweixin

注:微信企业号设置请移步看此教程配置:https://github.com/X-Mars/Zabbix-Alert-WeChat/blob/master/README.md

微信报警需要安装第三方模块。

[En]

Wechat alarm needs to install a third-party module.

shell> pip install simplejson

-i “http://mirrors.aliyun.com/pypi/simple”

–trusted-host “mirrors.aliyun.com”

MHA Re-Edition部署使用

1、环境配置检查(先执行通过后,再执行主程序masterha_manager_mysql)。

shell> chmod 755 masterha_check_repl_mysql

shell> ./masterha_check_repl_mysql –conf=app1.cnf

dba+开源工具:MHA复刻版,轻松实现MySQL高可用故障转移(附下载)

2、开启守护进程,主库故障后,VIP自动故障转移,其他从库自动change master to 指向新主库。

shell> chmod 755 masterha_manager_mysql

shell> ./masterha_manager_mysql –conf=app1.cnf start

注:app1.cnf为配置文件,你可以配置多个监控配置文件,监控多套MySQL集群环境。

dba+开源工具:MHA复刻版,轻松实现MySQL高可用故障转移(附下载)

dba+开源工具:MHA复刻版,轻松实现MySQL高可用故障转移(附下载)

3、Online master switch在线平滑切换。

shell> ./masterha_manager_mysql –conf=app1.cnf switch

dba+开源工具:MHA复刻版,轻松实现MySQL高可用故障转移(附下载)

Auto Failover自动故障转移

1、MHA Re-Edition管理机每隔app1.cnf配置文件参数connect_interval=1(秒),去连接主库,当试图连接3次失败后,尝试去其它从库上连接并执行select 1探测,这里需要你在app1.cnf配置文件里设置masterha_secondary_check = slave1,slave2。

设置完后,slave1和slave2去连接,如果有一台从库可以连接到主库,不认定主库down掉,不进行故障转移操作,会在log日志中输出warning警告信息,提示网络有问题,请排查。

如果MHA Re-Edition管理机和其它slave从库都无法访问连接,则认定主库挂掉,开始进行故障切换。

2、如果你在app1.cnf配置文件里设置candidate_master = 1,指定了候选主库,则默认提升该新主库。

如果你没有在app1.cnf配置文件里设置candidate_master = 1,则根据从库执行的Gtid事件最新的将其提升为主库。

3、当从库出现延迟时,在app1.cnf配置文件里,超过参数running_updates_limit = 60 单位(秒)内,且未同步完数据,则强制开启VIP故障切换转移,并在log日志中输出warning警告信息。否则会一直等待60秒内执行完从库的Gtid事件。

4、其它从库会change master to改变同步源为候选主库,并在log日志中输出show master status新主库的状态信息。

5、关闭候选主库的set global super_read_only = 0只读权限。

6、候选主库不执行reset slave all清空同步信息,这一步操作交给用户处理。

7、漂移VIP至新的主库。至此故障转移流程跑完。

Online Switch平滑在线切换

1、首先检测当前存活主机master(172.19.136.32:3306)、slave1(172.19.136.33:3307)和slave2(172.19.136.34:3308)。

2、输入YES后,在原master上执行FLUSH NO_WRITE_TO_BINLOG TABLES操作,将会强制把打开的表关闭,这一步会耗费很长时间,尤其是业务繁忙的时候,请务必在凌晨执行。

3、之后会询问是否要把master(172.19.136.32:3306) 切换到(172.19.136.33:3307)?输入yes。

如果在app1.cnf配置文件里设置candidate_master = 1,指定了候选主库,则默认提升该新主库。

如果没有在app1.cnf配置文件里设置candidate_master = 1,则根据从库执行的Gtid事件最新的将其提升为主库。

4、将原master上的虚拟VIP摘除。

5、设置原master为只读模式set global read_only=1。

6、原master上KILL掉所有应用连接的线程。

7、原master上执行FLUSH TABLES WITH READ LOCK全局读锁。

8、在候选master上执行 select SELECT WAIT_FOR_EXECUTED_GTID_SET(master_gtid_executed, timeout),等待执行完Gtid事件。当候选主库出现延迟时,在app1.cnf配置文件里,超过参数running_updates_limit = 60 单位(秒)内,且未同步完数据,则强制开启VIP切换转移,并在log日志中输出warning警告信息。否则会一直等待60秒内执行完从库的Gtid事件。

9、新提升的master为读写模式set global read_only=0。

10、在slave2上,执行CHANGE MASTER TO new_master。

11、在原master上解除锁表UNLOCK TABLES。

12、在原master上,执行CHANGE MASTER TO new_master。

13、新提升的master上,执行stop slave; 不执行reset slave all清空同步信息,这一步操作交给用户处理。

14、将VIP切换到新提升的master上。

15、整个切换流程结束。

下载方式

此工具现通过dbaplus社群免费为大家提供下载使用。若使用过程中有任何问题或建议,可随时与我们联系,欢迎大家试用。

打开以下链接即可下载:

https://github.com/hcymysql/MHA-Re-Edition

Original: https://www.cnblogs.com/88223100/p/MHA-Re-Edition.html
Author: 古道轻风
Title: dba+开源工具:MHA复刻版,轻松实现MySQL高可用故障转移(附下载)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505422/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 一句话的需求怎么测?需求文档的三种现状及应对策略

    转载请注明出处❤️ 你好,我是测试蔡坨坨。 今天,我们来聊聊需求文档那些事儿…… 众所周知,软件需求是软件项目研发的开始,是组建研发团队后第一次集体讨论的事…

    数据库 2023年6月11日
    087
  • 源码 | 为金融场景而生的数据类型:Numeric

    高日耀 资深数据库内核研发毕业于华中科技大学,喜欢研究主流数据库架构和源码,并长期从事分布式数据库内核研发。曾参与分布式 MPP 数据库 CirroData 内核开发(东方国信),…

    数据库 2023年5月24日
    0102
  • Java线程状态(生命周期)–一篇入魂

    1.线程状态(生命周期) 一个线程在给定的时间点只能处于一种状态。 线程可以有如下6 种状态: New (新创建):未启动的线程; Runnable (可运行):可运行的线程,需要…

    数据库 2023年6月6日
    0105
  • Linux远程终端连接工具:SecureCRT

    SecureCRT SecureCRT是一款支持 SSH2、SSH1、Telnet、Telnet/SSH、Relogin、Serial、TAPI、RAW 等协议的终端仿真程序 Se…

    数据库 2023年6月11日
    0107
  • mysql创建用户并授权

    新建用户 create user ‘username’@’%’ identified by ‘password’; • user_name:要创建用户的名字。• host:表示要这…

    数据库 2023年5月24日
    064
  • shutdown 关机与取消关机命令

    Windows 系统自带一个名为Shutdown.exe的程序,可以用于关机操作(位置在Windows\System32下) shutdown -a 取消关机 shutdown -…

    数据库 2023年6月11日
    086
  • Java中的数组和集合

    一、List和Map 1、特点 (1)传统的数组结构存储数据会在内存中开辟连续得空间,结合下标从而使得可以快速访问数据,但是删除和添加数据就很浪费资源 (2)链表不需要开辟连续空间…

    数据库 2023年6月6日
    0193
  • MySQL让人又爱又恨的多表查询

    前言 在SQL开发当中,多表联查是绝对绕不开的一种技能。同样的查询结果不同的写法其运行效率也是千差万别。 在实际开发当中,我见过(好像还写过~)不少又长又臭的查询SQL,数据量一上…

    数据库 2023年5月24日
    080
  • redhat 7.4从openssh7.6离线升级openssh8.4p1解决方法

    具体需求 这几天生产环境服务器又进行了安全扫描,每次都会报一下漏洞错误。虽然只有一个高危问题,但是每次看到ssh远程漏洞都很烧脑 “主要是里面坑太多了”,闲…

    数据库 2023年6月14日
    080
  • Collections.singletonList方法

    这个方法主要用于只有一个元素的优化, 减少内存分配,无需分配额外的内存,可以从SingletonList内部类看得出来,由于只有一个element,因此可以做到内存分配最小化,相比…

    数据库 2023年6月16日
    085
  • Hello Word

    编写代码 public class  hello{ public static void main(String[] args){ System.out.print("H…

    数据库 2023年6月11日
    063
  • Vue 和 Django 实现 Token 身份验证

    使用 Django 编写的 B/S 应用通常会使用 Cookie + Session 的方式来做身份验证,用户登录信息存储在后台数据库中,前端 Cookie 也会存储少量用于身份核…

    数据库 2023年6月14日
    080
  • 前端开发:如何正确地跨端

    导读:面对多种多样的跨端诉求,有哪些跨端方案?跨端的本质是什么?作为业务技术开发者,应该怎么做?本文分享阿里巴巴ICBU技术部在跨端开发上的一些思考,介绍了当前主流的跨端方案,以及…

    数据库 2023年6月14日
    094
  • 994.腐烂的橘子

    994.腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。每分钟,腐烂的橘…

    数据库 2023年6月16日
    088
  • Gorm 的黑魔法

    开发过程中,看到同事的代码写了这么一段: db = db.Session(&gorm.Session{Context: db.Statement.Context}).Fir…

    数据库 2023年6月9日
    0102
  • 6 short s1 = 1; s1 = s1 + 1;有错吗? short s1 = 1; s1 += 1; 有错吗?

    第一个有错,因为s1是short类型,s1 + 1会自动转换为int类型,将int类型赋值给short类型的s1,属于高位类型转低位,需强制转换。 第二个正确,因为s1 += 1 …

    数据库 2023年6月6日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球