Docker容器搭建MHA集群,实现监控报警,一键修复

编程入门 行业动态 更新时间:2024-10-23 03:33:42

Docker容器搭建MHA<a href=https://www.elefans.com/category/jswz/34/1771240.html style=集群,实现监控报警,一键修复"/>

Docker容器搭建MHA集群,实现监控报警,一键修复

经过不断测试,我通过两个脚本来实现故障主库的监控报警、一键修复

监控主库脚本

可以在里面加入报警机制,如发邮件

#!/bin/bash
#AUTHOR:AN
#VERSION:1.1.0
#DATE:2019-06-30
#FUNCTION:监控当前主库状态
#NOTICE:当脚本由于主库故障退出后,app1f文件中主库的配置文件不会立马删除,大概需要等待5秒##############################################################
#!/bin/bash
Mana_Dir=/etc/mha_manager                 #主目录
Mana_Cfg=$Mana_Dir/app1f          	   #MHA主配置文件#输出不同颜色的字体
#$1代表颜色编号,$2代表输出内容
cecho(){echo -e "\033[$1m$2\033[0m"
}#############################主程序#############################
#将管理进程放入后台
/usr/local/bin/masterha_manager --conf=$Mana_Cfg --remove_dead_master_conf --ignore_last_failover &
sleep 8			#等待管理服务完全启动
while :
domasterha_check_status --conf=$Mana_Cfg &>/dev/nullif [ $? -eq 0 ];thenMaster_Host=`masterha_check_status --conf=$Mana_Cfg |awk -F: '/app/{print $4}'`         #当前主库IPcecho 36 "当前主库是${Master_Host}"else[ -z "${Master_Host}" ] && cecho 31 "管理服务没起来" && kill $$cecho 31 "宕机主机是${Master_Host}"[ ! -d $Mana_Dir/logs ] && mkdir $Mana_Dir/logs         #创建日志存放目录echo "$$:`date +%F-%R`:${Master_Host} is error" > $Mana_Dir/logs/${Master_Host}_binlogkill $$fisleep 1                         #每秒检测一次
done

当收到报警邮件后,一键上线故障容器

只需执行:./mha_restore_docker.sh -add 10.10.10.121(上线容器IP地址)

#!/bin/bash
#AUTHOR:AN
#VERSION:1.1.0
#DATE:2019-06-30	
#MODIFY:
#FUNCTION:将修复好的容器快速加入到MHA集群中
#DESCRIBE:收到mha容器中发送的报警邮件,从报警邮件中获知损坏的容器,触发该脚本,删除损坏的容器,重新运行一个新的容器,
#		获取当前MHA集群中的主库IP地址和binlog日志,使新容器指向主库容器,作为主库容器的从库
#NOTICES:务必使宿主机可以免密登录所有容器#定义容器与IP地址的关系
mha_master=10.10.10.121
mha_slave1=10.10.10.122
mha_slave2=10.10.10.123
mha_data1=10.10.10.124
mha_data2=10.10.10.125#############################################
#输出不同颜色的字体
#$1代表颜色编号,$2代表输出内容
cecho(){echo -e "\033[$1m$2\033[0m"
}#发送公钥(宿主机只需使用一次)
SendKey(){rpm -q expect &>/dev/null || yum -y install expect	[ ! -f /root/.ssh/id_rsa ] && ssh-keygen -N  ''  -f /root/.ssh/id_rsa     #非交互生成密钥文件expect << EOF	spawn ssh-copy-id root@$1
#	expect "(yes/no)?"		{send "yes\r"}expect "password:" 		{send "a\r"}expect "#"	    				{send "exit\r"}
EOF
}#运行容器
RunDocker(){	docker rm -f $2docker run -itd --net docker01 --ip $1 --name $2 -h $2 --restart=always --restart=on-failure:5 \
-v /docker_data/mha/$2:/data/mysql3306 -v /docker_data/mha/conf/$2f:/etc/myf \
-v /etc/localtime:/etc/localtime -v /docker_data/mha/ssh_key:/root/.ssh mha_mysql:5.7.17
}#删除坏的容器,重新运行一个新的容器
NewDocker(){	if [ "$Down_Host" == "$mha_master" ];then		RunDocker $mha_master mha_masterelif [ "$Down_Host" == "$mha_slave1" ];thenRunDocker $mha_slave1 mha_slave1elif [ "$Down_Host" == "$mha_slave2" ];thenRunDocker $mha_slave2 mha_slave2elsececho 36 "OK"fi
}#检测当前主库,获取binlog日志文件
NowMaster(){if ping -c2 -w1 -i0.2 $mha_data1 &> /dev/null;thenNow_Master=`ssh $mha_data1 'mysql -uroot -p123456 -e "show slave status\G"' |grep 'Master_Host' |awk  '{print $2}'`Master_Log=`ssh $mha_data1 'mysql -uroot -p123456 -e "show slave status\G"' |grep '^ *Master_Log' |awk  '{print $2}'`elif 	ping -c2 -w1 -i0.2 $mha_data2 &> /dev/null;thenNow_Master=`ssh $mha_data2 'mysql -uroot -p123456 -e "show slave status\G"' |grep 'Master_Host' |awk  '{print $2}'`Master_Log=`ssh $mha_data1 'mysql -uroot -p123456 -e "show slave status\G"' |grep '^ *Master_Log' |awk  '{print $2}'`elseecho "数据备份容器故障"fiecho $Now_Masterecho $Master_Log
}#生成选择主库文件
SelectMaster(){	Select_Master=/opt/select_master.sqlRepl_User=replicater				#主从复制用户Repl_Password=123456Master_Pos=154NowMaster 							#检测当前主库,获取binlog日志文件	touch $Select_Master> $Select_Masterecho 'stop slave;
change master to
master_host="192.168.4.31",
master_user="repluser",
master_password="123456",
master_log_file="host31.000001",
master_log_pos=154;
start slave;
' > $Select_Master	sed -ri "3 s/^(.{13})(.*)(..)/\1${Now_Master}\3/"	  $Select_Mastersed -ri "4 s/^(.{13})(.*)(..)/\1$Repl_User\3/" 	      $Select_Mastersed -ri "5 s/^(.{17})(.*)(..)/\1$Repl_Password\3/"    $Select_Mastersed -ri "6 s/^(.{17})(.*)(..)/\1$Master_Log\3/"       $Select_Mastersed -ri "7 s/^(.{15})(.*)(.)/\1$Master_Pos\3/"        $Select_Master
}Mha_Conf=/docker_data/mha/mha_manager/app1f
#在MHA主配置文件中加入修复好的主机
MhaConf(){	[ ! -f $Mha_Conf ] && echo 错误 && exit 71Server_Num=`echo ${Down_Host} | awk -F. '{print $4}' |cut -b 3`cat >> $Mha_Conf << EOF
[server${Server_Num}]
candidate_master=1
hostname=${Down_Host}
EOF
}#修复集群,为数据库容器指定主库
AddMha(){SelectMaster		scp $Select_Master 	${Down_Host}:$Select_Master			#发送选择主库文件ssh ${Down_Host} "cat $Select_Master |mysql -uroot -p123456" &> /dev/null		#选择主库
#		ssh ${Down_Host} 'mysql -uroot -p123456 -e "start slave"'						#启动从库Io_Thread=`ssh ${Down_Host} "mysql -uroot -p123456 -e 'show slave status\G'" |grep 'Slave_IO_Running' |awk '{print $2}'`Sql_Thread=`ssh ${Down_Host} "mysql -uroot -p123456 -e 'show slave status\G'" |grep 'Slave_SQL_Running:' |awk '{print $2}'`if [ "$Io_Thread" == "Yes" -a "$Sql_Thread" == "Yes" ];thencecho 36 "主从成功"else cecho 31 "主从失败"exit $ISERRORfigrep ${Down_Host}  $Mha_Conf &> /dev/null if [ $? -ne 0 ];thenMhaConf				#添加修复好的主机到app1f中cecho 36 "修复成功"elsececho 31 "请检查$Mha_Conf" && exit 71fi
}#帮助信息
HELP(){cat << EOF
mha_restore_docker.sh version 1.1.0
Usage: mha_restore_docker.sh [-h] [-key 主机位] [-add 修复好的主机]
=======================================================================
optional arguments:-h		提供帮助信息-key	配置ssh免密,宿主机初次才使用-add	修复好的主机IP地址	
EXAMPLE:bash mha_restore_docker.sh -add 10.10.10.121
EOF
}#############################主程序#############################
[ $# -eq 0 ] && HELP
case $1 in-h)HELP;;-key)for i in $@do[ "$i" == "-key" ] && continueSendKey 10.10.10.$idone	;;	-add)[ -z $2 ] && cecho 31 "Invalid option:bash `basename $0` [-h]" && exit 71Down_Host=$2NewDockerAddMha;;		\?)cecho 31 "Invalid option:bash `basename $0` [-h]"
esac

更多推荐

Docker容器搭建MHA集群,实现监控报警,一键修复

本文发布于:2024-02-27 17:15:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1707507.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:集群   一键   容器   Docker   MHA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!