五一公司机房断电,所有服务器都趴窝。供电后,机器们自动开机,自动启动一些服务,docker,nginx,vip这些都没有影响,都按设定好的开机自启启动了。
糟糕的是,mysql(MGR)集群启动失败,究其原因如下:
1 2 3 4 |
1.每个服务器开机启动时间不一样,这次是2台从机器先与primary机器启动,然后加入组的时候。找不到组. MGR组加入失败 2.由于我们使用的是mycat读写分离,mycat因为请求不到主服务器,所以自动切换到了配置中的下一台机器作为主机,这样就导致了三台机器的mycat不同步,先启动的2台机器 主机器自动飘到了第二台从机器,后启动的主机器,还是默认第一台为主机器。 |
要解决的问题:
- 集群宕机后mycat保持默认主配置
- mysql集群启动后自动按顺序加入主,主要先与从机器启动MGR
思路如下图:

1 2 3 4 5 |
1.将mycat开机自启干掉,让mysql随服务先启动 2.写个脚本干预,mycat 和 MGR组的启动顺序 2.1 定时脚本监测mycat配置文件,如果mycat当中的主机器与本机ip相等,那么得知当前机器为primary,就更改rc.local中的延时启动脚本时间为100s (既开机系统初始化完成后100 启动MGR(primary)) 2.2 如果mycat当中的主机ip与本机ip不相等,那么得知当前机器为secondary 从机器,就更改rc.local中的延时启动脚本时间为500s (既开机系统初始化完成后500s启动MGR(secondary)) 3. 系统初始化完成,延时时间之后再启动mycat,这样当mycat启动的时候mysql服务早启动了,就不会出现问题2,mycat无法连接主机器mysql,导致配置文件主(primary)自动飘到从机器上。从而导致三台机器配置不统一的问题。 |
验证:(同时重启三台机器)

本地测试机所有服务均已启动
10分钟后查看MGR组是是否启动成功 master 延迟100秒启动 slave 延迟500秒启动。

自定义脚本
rc.local
1 2 3 4 5 6 7 8 9 |
touch /var/lock/subsys/local source /etc/profile mkdir -p /var/run/nginx/ /usr/local/nginx/sbin/nginx sleep 500 /opt/mycat/bin/mycat start /opt/.local/MGR.sh /etc/init.d/keepalived start exit 0 |
控制主从启动时间延迟的脚本(加入定时任务中,每分钟执行检测一次mycat)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#!/bin/bash #定义MGR集群机器ip array=('192.168.6.121' '192.168.6.122' '192.168.6.123') #查询mycat当前主从配置 mycat_dnindex=$(tail -n1 /opt/mycat/conf/dnindex.properties | cut -d "=" -f 2) #查询当前主机ip Iphost=$(ip addr | grep "state UP" -A2| head -3 | tail -n1 | awk '{print $2}' | cut -d "/" -f 1) snum=$(cat /etc/rc.d/rc.local | awk '{if($1=="sleep") print $2}') if [ -z $snum ];then sed -i '/mycat/i\sleep 500' /etc/rc.d/rc.local fi if [ $mycat_dnindex -eq 0 -a "$Iphost" == ${array[$mycat_dnindex]} ];then sed -i 's/sleep 500/sleep 100/g' /etc/rc.d/rc.local elif [ $mycat_dnindex -eq 1 -a "$Iphost" == ${array[$mycat_dnindex]} ];then sed -i 's/sleep 500/sleep 100/g' /etc/rc.d/rc.local else sed -i 's/sleep 100/sleep 500/g' /etc/rc.d/rc.local fi |
MGR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#!/bin/bash #定义常用变量 ndate=$(date --date='0 days ago' "+%Y-%m-%d>%H:%M:%S") mysqlHome=/usr/local/mysql mysqluser=shooter mysqlpwd=123456 #定义MGR集群机器ip array=('192.168.6.121' '192.168.6.122' '192.168.6.123') #查询mycat当前主从配置 mycat_dnindex=$(tail -n1 /opt/mycat/conf/dnindex.properties | cut -d "=" -f 2) #获取本机IP localIp=$(ip addr | grep 'state UP' -A2 | head -3 | tail -n1 | awk '{print $2}' | awk -F"/" '{print $1}') #查看mysql服务是否启动 port=$(netstat -lntup|grep 3306|wc -l) function start_MGR(){ if test -f $mysqlHome/bin/mysqladmin && $mysqlHome/bin/mysqladmin -u$mysqluser -p$mysqlpwd ping &> /dev/null;then if [ "$localIp" == "${array[$mycat_dnindex]}" ];then sleep 30 $mysqlHome/bin/mysql -uroot -p123456 -e " SET SESSION binlog_format = 'ROW'; SET GLOBAL binlog_format = 'ROW'; SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;" [ ! -z $? ] && echo "${localIp} MGR主(PRIMARY) ${ndate} 启动失败!" >> /data-mysql/mysql/MGR_error.log else sleep 60 $mysqlHome/bin/mysql -uroot -p123456 -e " SET SESSION binlog_format = 'ROW'; SET GLOBAL binlog_format = 'ROW'; START GROUP_REPLICATION;" [ ! -z $? ] && echo "${localIp} MGR主(PRIMARY) ${ndate} 启动失败!" >> /data-mysql/mysql/MGR_error.log fi fi } if [ $port -eq 1 ];then start_MGR; exit; else /etc/init.d/mysqld start start_MGR; fi |
- 本文固定链接: https://www.yoyoask.com/?p=3247
- 转载请注明: shooter 于 SHOOTER 发表