MHA是一套MySQL高可用管理软件,除了检测Master宕机后,提升候选Slave为New Master之外(漂虚拟IP),还会自动让其他Slave与New Master 建立复制关系。MHA Manager可以单独部署在一台独立的机器上,并管理多个master-slave集群。当自动Failover完成后,MHA Manager服务器上的masterha_manager 进程自动退出。(Currently MHA Manager process does not run as a daemon. If failover completed successfully or the master process was killed by accident, the manager stops working. --官方文档)

面临的问题

我们知道开启MHA Manager监控,当MHA 发生自动漂移时,会将老的主库的ip将会从配置文件中移除。那么怎么可以自动将原Master 节点自动以Slave角色添加到集群中来是运维同学面临的问题。

并且大多数情况下,MHA FailOver 后,MHA Manager 监控进程也会关闭。所以很有必要再开启一个关于MHA Manager的保护进程。

背景知识

为简化MHA 配置,测试环境由一主一从一监控构成。

注意:主节点、辅助节点 之间 相互SSH 免密码登入。MHA Manger 到主、副节点之间 需要满足免密码登入(满足单向即可)

主节点上虚拟出了 可读/写的IP;在从节点上虚拟出只读的IP。程序访问使用虚拟IP。

工具包主要功能

工具包 功能描述
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL各节点复制状态
masterha_manger 开启 MHA Manager
masterha_check_status 检测当前MHA Manager运行状态
master_ip_failover 自动切换时管理vip的脚本,主要是VIP的漂移。
master_ip_online_change 手动执行mysql master switchover时执行的切换脚本,含有管理vip的脚本
masterha_master_switch 控制故障转移(可手动)

安装MHA Manager软件包后,路径/usr/local/bin上会出现以上工具包。

解决方案探究

脚本主要解决的问题

实现功能的文件及描述

主要文件mha_health_check_secondary.sh的处理逻辑

实现代码

文件mha_protect.sh的主要代码

  1. ########################################################################
  2. # File Name: mha_protect.sh
  3. # Excute: nohup sh mha_protect.sh &
  4. # Created Time: Thu Jul EST
  5. #########################################################################
  6. #!/bin/sh
  7. while true;
  8. do
  9. mha_check_result=`masterha_check_status --conf=/etc/masterha/app1.conf | grep "stopped" | wc -l`
  10. if [ "$mha_check_result" == "" ];then
  11. echo "$mha_check_result"
  12. sh /etc/masterha/mha_health_check_vip.sh > /etc/masterha/mhalog/MHA_Check_`date "+%Y%m%d%H%M%S"`.log >&
  13. fi
  14.  
  15. sleep
  16. done

此文件中,调用MHA的配置文件的参数为 /etc/masterha/app1.conf。执行mha_health_check_secondary.sh产生的log位于路径 /etc/masterha/mhalog下面,文件以MHA_Check_时间命名。

文件mha_health_check_secondary.sh 中的主要代码

  1. #!/bin/bash
  2.  
  3. server1="172.XXX.XXX.XXX" ##此处请输入Server1的IP
  4. server2="172.XXX.XXX.XXX" ##此处请输入Server2的IP
  5. vip="172.XXX.XXX.XXX" ##此处请输入已配置的VIP
  6. mysql_username=用户 ##此处数据用户名
  7. mysql_password=密码 ## 此处输入用户名相应的密码
  8.  
  9. mha_conf=/etc/masterha/app1.conf
  10. # Part:: String SQL
  11. sql_change_master=""
  12. mysql_status=""
  13. slave_status=""
  14. master_status=""
  15.  
  16. #if has vip , master server ip
  17. ipaddr1=`ssh root@"$server1" ip addr | grep "inet 172" | awk -F '[/]' '{print $1}' | awk '{print $2}' | grep "$vip"`
  18. ipaddr2=`ssh root@"$server2" ip addr | grep "inet 172" | awk -F '[/]' '{print $1}' | awk '{print $2}' | grep "$vip"`
  19.  
  20. ###此处应该添加一个判断当 ipaddr1 和 ipaddr2 都为 空时,说明,VIP设置有问题,退出需要告知管理员,去检查
  21.  
  22. if [ "$ipaddr1" = "$vip" ];then
  23. masterip=$server1
  24. echo masterip server1 $server1
  25. fi
  26. if [ "$ipaddr2" = "$vip" ];then
  27. masterip=$server2
  28. echo masterip server2 $server2
  29. fi
  30.  
  31. echo "master ip: $masterip"
  32.  
  33. ## start ## 查看app1.conf mha 配置文件server的信息
  34. conf_server1=`grep "server1" $mha_conf`
  35. conf_server2=`grep "server2" $mha_conf`
  36.  
  37. echo "conf_server1: $conf_server1 conf_server2 :$conf_server2 "
  38. ## end ## 查看app1.conf mha 配置文件server的信息
  39.  
  40. # 生成master mysql的[change master]SQL命令
  41. sql_change_master="CHANGE MASTER TO MASTER_HOST='$masterip', MASTER_USER='$mysql_username', MASTER_PASSWORD='$mysql_password',MASTER_PORT=3306,MASTER_AUTO_POSITION=1;"
  42.  
  43. # --------------------------
  44. # function
  45.  
  46. # 对指定主机执行Linux命令
  47. function do_linux_by_ssh() {
  48. # variable
  49. func_str_ip="$1"
  50. func_str_user="$2"
  51. func_str_command="$3"
  52. # action
  53. ssh $func_str_user@$func_str_ip "$func_str_command"
  54. }
  55.  
  56. function do_sql() {
  57. # variable
  58. func_str_ip="$1"
  59. func_str_sql="$2"
  60. # action
  61. mysql -u $mysql_username -h $func_str_ip -p"$mysql_password" -e "$func_str_sql" -P3306
  62. }
  63. function mysql_stop_up() {
  64. # 判断MySQL服务状态
  65. # variable
  66. func_str_ip="$1"
  67. mysql_status=`do_linux_by_ssh "$func_str_ip" "root" "service mysqld status" | grep -c 'not running'`
  68. if [ "$mysql_status" = ] ;then
  69. do_linux_by_ssh "$func_str_ip" "root" "service mysqld start" > /dev/null
  70. fi
  71. sleep
  72. mysql_status=`do_linux_by_ssh "$func_str_ip" "root" "service mysqld status" | grep -c 'running'`
  73. echo ${mysql_status}
  74. }
  75. function mysql_slave_up() {
  76. # variable
  77. func_str_ip="$1"
  78. slave_status=`do_sql "$func_str_ip" "show slave status \G;" > /dev/null | grep "Last_IO_Errno" | wc -l`
  79. if [[ $slave_status == ]]
  80. then
  81. do_sql "$func_str_ip" "set global read_only=1;set global relay_log_purge=0;"
  82. do_sql "$func_str_ip" "$sql_change_master"
  83. do_sql "$func_str_ip" "start slave;"
  84. fi
  85. slave_status=`do_sql "$func_str_ip" "show slave status \G;" > /dev/null | grep "Last_IO_Errno: 0" | wc -l`
  86. echo ${slave_status}
  87. }
  88.  
  89. ## MHA集群为2个数据节点,所以下面只循环判断server1、server2,同样如果是三个节点,则copy相关代码,修改if添加即可。
  90.  
  91. #if server1 down
  92. if [ "$conf_server1" != "[server1]" ] ;then
  93. #if myql status was dead , auto systemctl start mysqld
  94. echo "check server1 mysql status start"
  95. mysqlstatus=`mysql_stop_up "$server1"`
  96. echo "server1 mysql status : $mysqlstatus"
  97. if [ "$mysqlstatus" = ] ; then
  98. echo "server1 slave up start"
  99. slave_status=`mysql_slave_up "$server1"`
  100. echo "server1 slave status :$slave_status server1: $server1"
  101. if [ "$slave_status" = ] ; then
  102. echo "write server1 app1.conf start"
  103. echo -e "\n[server1]\nhostname=$server1\nport=3306" >> /etc/masterha/app1.conf
  104. fi
  105. mha_check_result=`masterha_check_status --conf=/etc/masterha/app1.conf | grep "stopped" | wc -l`
  106. if [ "$mha_check_result" = ] ;then
  107. nohup masterha_manager --conf=/etc/masterha/app1.conf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/masterha/mhalog/manager.log >& & > /dev/null
  108. fi
  109. fi
  110. fi
  111. conf_server1=`grep "server1" /etc/masterha/app1.conf`
  112.  
  113. #if server2 down
  114. echo "$conf_server2":"$server2"
  115.  
  116. if [ "$conf_server2" != "[server2]" ] ;then
  117. #if server2 myql status was dead , auto systemctl start mysqld
  118. echo "server2 mysql stop status start"
  119. mysqlstatus=`mysql_stop_up "$server2"`
  120. echo "server2 ysql_stop_up status: $mysqlstatus"
  121. if [ "$mysqlstatus" = ] ; then
  122. slave_satus=`mysql_slave_up "$server2"`
  123. echo "server2 slave_status is : $slave_satus"
  124. if [ "$slave_satus" = ] ; then
  125. echo "write server2 in app1.conf start"
  126. echo -e "\n[server2]\nhostname=$server2\nport=3306" >> /etc/masterha/app1.conf
  127. fi
  128. mha_check_result=`masterha_check_status --conf=/etc/masterha/app1.conf | grep "stopped" | wc -l`
  129. echo "$mha_check_result"
  130. if [ "$mha_check_result" = ] ;then
  131. nohup masterha_manager --conf=/etc/masterha/app1.conf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/masterha/mhalog/manager.log >& & > /dev/null
  132. fi
  133. fi
  134. fi
  135. conf_server2=`grep "server2" /etc/masterha/app1.conf`
  136.  
  137. mha_check_result=`masterha_check_status --conf=/etc/masterha/app1.conf | grep "stopped" | wc -l`
  138. if [ "$conf_server1" = "[server1]" ] && [ "$conf_server2" = "[server2]" ];then
  139. if [ "$mha_check_result" = "" ];then
  140. nohup masterha_manager --conf=/etc/masterha/app1.conf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/masterha/mhalog/manager.log >& & > /dev/null
  141. fi
  142. fi

此文件中,调用MHA的配置文件的参数为 /etc/masterha/app1.conf。

masterha_manager 监控所产生的log存放在 /etc/masterha/mhalog/manager.log 中。

感谢:以上代码实现主要是由同事Fly Chen完成。

本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

MySQL MHA FailOver后,原Master节点自动以Slave角色加入解群的研究与实现的更多相关文章

  1. 基于MySQL+MHA+Haproxy部署高可用负载均衡集群

    一.MHA 概述 MHA(Master High Availability)是可以在MySQL上使用的一套高可用方案.所编写的语言为Perl 从名字上我们可以看到.MHA的目的就是为了维护Master ...

  2. 【线上测试之后的应用】基于MySQL+MHA+Haproxy构建高可用负载均衡数据库集群(详解)

    这里我们先介绍一下MHA是什么,其次就是它的应用与测试,同时为了大家呈现了数据备份案例,最后总结了使用情况以及注意事项和解决办法 一.MHA 概述 MHA(Master High Availabili ...

  3. MySQL MHA 运行状态监控

    一 项目描述 1.1 背景 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能.MHA ...

  4. kubeadm高可用master节点(三主两从)

    1.安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 五台机器,操作系统 CentOS7.5+(mini) 硬件配置:2GBRAM,2vCPU+,硬盘30GB+ 集群中所有 ...

  5. 排查 k8s 集群 master 节点无法正常工作的问题

    搭建的是 k8s 高可用集群,用了 3 台 master 节点,2 台 master 节点宕机后,仅剩的 1 台无法正常工作. 运行 kubectl get nodes 命令出现下面的错误 The c ...

  6. 记录一个奇葩的问题:k8s集群中master节点上部署一个单节点的nacos,导致master节点状态不在线

    情况详细描述; k8s集群,一台master,两台worker 在master节点上部署一个单节点的nacos,导致master节点状态不在线(不论是否修改nacos的默认端口号都会导致master节 ...

  7. mysql mha 主从自动切换 高可用

    mha(Master High Availability)目前在MySQL多服务器(超过二台),高可用方面是一个相对成熟的解决方案. 一,什么是mha,有什么特性 1. 主服务器的自动监控和故障转移 ...

  8. 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动

    重新安装MySQL数据库,由于安装的时候马虎,一路next(事实上,某些地方需要严格的配置,我忘记注意了),导致现在出了很多麻烦. 错误信息: 本地计算机上的MySQL服务启动后停止.某些服务在未由其 ...

  9. mysql57重新安装后无法再次启动mysql57服务“本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动。”--解决方法

    本地计算机上的MySQL服务启动后停止.某些服务在未由其他服务或程序使用时将自动. (win10,mysql5.7+) 解决方法: 第一步:查看MySQL57安装路径 只要在programData路径 ...

随机推荐

  1. [Swift]LeetCode741. 摘樱桃 | Cherry Pickup

    In a N x N grid representing a field of cherries, each cell is one of three possible integers. 0 mea ...

  2. [Swift]LeetCode1006. 笨阶乘 | Clumsy Factorial

    Normally, the factorial of a positive integer n is the product of all positive integers less than or ...

  3. Python面向对象中的类和对象

    类和对象 目标 类和对象的概念 类和对象的关系 类的设计 01. 类和对象的概念 类 和 对象 是 面向对象编程的 两个 核心概念 1.1 类 类 是对一群具有 相同 特征 或者 行为 的事物的一个统 ...

  4. 解决Eclipse中无法查看Java源码

    1.点 "window"-> "Preferences"-> "Java" -> "Installed JRES ...

  5. scala时间和时间戳互转

    时间转换为时间戳: import java.text.SimpleDateFormat object test { def main(args: Array[String]): Unit = { va ...

  6. 深入理解OkHttp源码(三)——网络操作

    这篇博客侧重于了解OkHttp的网络部分,包括Socket的创建.连接,连接池等要点.OkHttp对Socket的流操作使用了Okio进行了封装,本篇博客不做介绍,想了解的朋友可以参考拆轮子系列:拆O ...

  7. Python内置函数(29)——help

    英文文档: help([object]) Invoke the built-in help system. (This function is intended for interactive use ...

  8. 要想学好Java编程,构造器、方法重载、this关键字、垃圾回收机制,这4关一定要过!

    有人说,你应该关注时事.财经,甚至流行的电影.电视剧,才有可能趁着热点写出爆文:有人说,你别再写“无聊”的技术文了,因为程序员的圈子真的很小,即便是像鸿洋那样的招牌大牛,文章是那么的干货,浏览量有多少 ...

  9. Http协议状态码总结

    一.http方法 方法名 说明 get 发送一个获取请求,服务器的响应会包含head与body部分 post 发送一个输入数据的请求,服务器的响应会包含head与body部分 head 服务器响应的只 ...

  10. 【单例模式】java实现

    概述:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 关键点: 构造函数不对外开放,一般为private. 通过一个静态方法或者枚举返回单例类对象. 确保单例类的对象有且只有一个,尤 ...