MGR主节点故障自动切换

MGR单主模式下,当主节点故障,MGR内部将会发起一轮新的选举,选出新的主,这是由MGR内部决定并执行的。但是当应用的连接遇到主节点挂掉的情况下,IP是不会自动发生切换的,也就是说,MGR内部没有提供一种机制,来实现主节点故障切换对应用无感知。

解决办法,用Keepalived 实现MGR节点故障自动切换。应用程序连接数据库使用VIP即可,后面master是哪一台数据库是通过keepalived服务端实现的;keepalived通过检测脚本确定哪一台是master就把VIP飘在哪一台服务器上。

微信图片_20201216155425

1、安装Keepalived

yum install -y keepalived 
  • 修改配置文件(原示例配置删除即可)

原理:

vrrp_script脚本中weight这个值必须指定,否则有时候重启服务后该节点被显示为fault 状态。weight值分为正值和负值,假定weight值为W,初始的优先级为P。

当weight值小于0时:

如果检测脚本返回值=0,则节点最终优先级不改变;

如果检测脚本返回值≠0,则节点最终优先级=P-W,优先级会减小。

当weight值大于0时:

如果检测脚本返回值=0,则节点最终优先级=P+W,优先级会增加;

如果检测脚本返回值≠0,则节点最终优先级不改变。

权重策略是:

当weight > 0时:脚本执行成功了 Priority+Weight 执行失败 Priority

当weight < 0时:脚本执行成功了 Priority 执行失败 Priority+Weight

通过chk_mysql.sh脚本检测mysql服务是否存在返回返回值,Keepalived判断脚本返回值调整优先级,调整后VIP会飘到优先级最大的机器上,

整体来说就是通过改变机器的权重来把VIP飘在权重最大的机器上的;我们要做的就是通过脚本判断是否执行,使得master的权重最高;这里的权限一定得控制好;

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

#指定mysql服务检测脚本
vrrp_script chk_mysql_port {
    script "/root/chk_mysql_port.sh"  #脚本路径
    interval 2  #脚本检测频率
    weight -5   #脚本执行返回值 =0 ,优先级不变。 !=0 时优先级 -5
    fall 2      #如果连续两次检测失败,认为节点服务不可用
    rise 1      #如果连续2次检查成功则认为节点正常
}
#监测mysql 是否是master
vrrp_script chk_mysql_master {
script "/root/chk_mysql_master.sh"
interval 2 
weight 10  #脚本执行返回值 =0 ,优先级加 10。 !=0 时优先级不变。
}

vrrp_instance VI_1 {
    state MASTER  #指定实例初始状态,实际的MASTER和BACKUP是选举决定的。
    interface eth0  #指定实例绑定的网卡
    virtual_router_id 88 #设置VRID标记(0..255)
    priority 100   #设置优先级,优先级高的会被竞选为Master
    advert_int 1    #检查的时间间隔,默认1s
    authentication { #节点间的认证,所有的必须一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { #设置VIP,可以设置多个,用于切换时的地址绑定。
        64.115.5.111
    }

    track_script { #指定前面脚本的名字
        chk_mysql_port
        chk_mysql_master
    }
}

三台节点不同处,根据实际修改。

interface : 网卡根据实际网卡名修改

priority :优先级,三台机器不同

Centos76(master): 100

k8s-node1(slave): 98

k8s-node2(slave): 96

  • 邮件通知配置(选配)
global_defs {
   notification_email {         #设置 keepalived 在发生事件(比如切换)的时候,需要发送到的email地址,可以设置多个,每行一个。
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc    #设置通知邮件发送来自于哪里,如果本地开启了sendmail的话,可以使用上面的默认值。
   smtp_server 192.168.200.1    #指定发送邮件的smtp服务器。
   smtp_connect_timeout 30      #设置smtp连接超时时间,单位为秒。
   router_id LVS_DEVEL          #是运行keepalived的一个表示,多个集群设置不同。
}
  • 两个MySQL 监测脚本(每台机器上都得有)

 

##chk_mysql.sh 检查mysql 服务脚本
#!/bin/bash
mysql_port=netstat -antp |grep :::3306 |wc -l
if [$mysql_port -ne 1 ];then
   exit 1
fi
##chk_mysql_master.sh 检查mysql master 脚本
#!/bin/bash
master_hostname=mysql -h127.0.0.1 -uroot -pWANG_feng123 -e "SELECT * FROM performance_schema.replication_group_members WHERE MEMBER_ID = (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member')" |awk 'NR==2{print}'|awk -F" " '{print $3}'

hostname=hostname
if [ $master_hostname == $hostname ];then
   exit 0
else
   exit 1
fi
  • Mysql root用户默认只能本地登录,通过VIP连接需要授权(三台都需要执行)
mysql> grant all on *.* to root@'%' identified by "WANG_feng123";
mysql> flush privileges;
  • 登录测试

image-20201217143327353

 

  • 参考
  • 李先生的博客

    发表评论

    您的电子邮箱地址不会被公开。 必填项已用*标注

    此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

    open