mysql keepalived双主ha

【1】环境

操作系统 Centos7.8

192.168.148.39  DB3

192.168.148.27  DB4

192.168.148.253 VIP(一个尚未占用的内网ip即可)

备注:互为主从 DB 3/DB 4:该部分参考:mysql双主gtid模式,在有数据情况下 

备注:当然不互为主从也不影响该篇文章对于 keepalived 的研究效果

【2】keepalived 安装配置

(2.1)操作系统环境配置

#(1)添加非本机IP绑定支持
echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf

#(2)开启路由转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

sysctl -p #(
3)iptables相关 #配置iptables,添加VRRP通讯支持 -A INPUT -d 224.0.0.18 -j ACCEPT #允许组播地址访问本机,组播地址用于keepalived互相检测心跳 -A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT #允许组播地址通信 -A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协议)通信 -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCPET #开发mysql3306端口

(2.2)安装与查阅

方法一:yum安装:

yum install-y keepalived 

  

 

如何找到 keepalived 安装到哪里了呢?

rpm -qal|grep keepalived

  

 

很明显,相关配置文件在 /etc/keepalived/keepalived.conf 

 

方法二:二进制包安装

#(1)下载
官网:https://www.keepalived.org/download.html
wget https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

#(2)安装前置依赖包
mount /dev/cdrom /mnt #加载本地源,有网络直接配置也可(参考:yum源配置、epel源配置)
yum install kernel-devel openssl-devel popt-devel -y

#(3)安装
cd /soft/
tar -zxvf keepalived-1.3.3.tar.gz
cd keepalived-1.3.4
./configure --prefix=/usr/local/keepalived/
make && make install

(2.3)修改配置文件

主从配置文件都一样~

! Configuration File for keepalived

global_defs {
   notification_email {
     guochaoqun@bianfeng.com
     815202984@qq.com
   }
   notification_email_from dbmoniter@bianfeng.com
   smtp_server 60.191.38.219
   smtp_connect_timeout 30
   router_id mysql_ha
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script check_run {
script "/etc/keepalived/mysql_check.sh"
interval 60
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    noproeempt
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        check_run
    }
    virtual_ipaddress {
        192.168.148.253
    }
}

 参考配置文档:

! Configuration File for keepalived
global_defs {
  script_user root
  enable_script_security
}
vrrp_script check_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 10
}
vrrp_instance VI_1 {  # 定义一个实例
    state BACKUP     # 指定Keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器,所以设置priority时要注意MASTER比BACKUP高。如果设置了nopreempt,那么state的这个值不起作用,主备靠priority决定。
    nopreempt    # 设置为不抢占 
    interface eth0   #指定监测网络的接口,当LVS接管时,将会把IP地址添加到该网卡上。
    virtual_router_id 101      #虚拟路由标识,同一个vrrp实例使用唯一的标识,同一个vrrp_instance下,MASTER和BACKUP必须一致。
    priority 100       #指定这个实例优先级
    unicast_src_ip 192.168.1.14  # 配置单播的本机地址
    unicast_peer { 
        192.168.1.15       #配置单播的目标地址
    }    #keepalived在组播模式下所有的信息都会向224.0.0.18的组播地址发送,产生众多的无用信息,并且会产生干扰和冲突,可以将组播的模式改为单拨。也有可能组播被上级禁用。这是一种安全的方法,避免局域网内有大量的keepalived造成虚拟路由id的冲突。
    advert_int 1      #心跳报文发送间隔
    authentication {
        auth_type PASS    #设置验证类型,主要有PASS和AH两种
        auth_pass test123   #设置验证密码,同一个vrrp_instance下,MASTER和BACKUP的密码必须一致才能正常通信
    }
    virtual_ipaddress {    #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        118.24.101.16/24 dev eth1 
    }
    track_interface {  # 设置额外的监控,里面那个网卡出现问题都会切换
        eth0
    }
    track_script {
        check_nginx
    }
}

 

 

/etc/keepalived/mysql_check.sh 的作用是为了每分钟判断一次mysql服务是否存活

记得加权限  chmod +x /etc/keepalived/mysql_check.sh,否则会报错:

  

因为我这里在配置文件里就写了密码,所以我这里 mysql -e  就没写账户密码

#!/bin/bash
source /etc/profile
count=1

while true
do
mysql -e "show status;" > /dev/null 2>&1
i=$?
ps aux | grep mysqld | grep -v grep > /dev/null 2>&1
j=$?
if [ $i = 0 ] && [ $j = 0 ]
then
   exit 0
else
   if [ $i = 1 ] && [ $j = 0 ]
   then
       exit 0
   else
        if [ $count -gt 5 ]
        then
              break
        fi
   count=$((${count}+1))
   continue
   fi
fi

done
systemctl stop keepalived

(2.4)启动 keepalived ,核验

我们在 192.168.148.39  DB3  上启动 keepalived

如下,成功

  

 

 另外一台机器

  192.168.148.27  DB4

也启动:

  

 

(2.5)故障转移测试,飘VIP测试

当前VIP 拥有者 192.168.148.39 ,关闭 mysql 服务

  [root@DB3 keepalived]# systemctl stop mysql

  

 如上图,我们立即查看 keepalived 是正常的;

 等一个我们60秒的check间隔,再去查看 keepalived 的情况,发现其在 15.08分还是在启动状态的,在15.11分关闭了

  

 

然后我们查看另外一个机器,VIP 已经飘过来了;

   

 

我们再重新启动

  192.168.148.39 DB3机器的 Mysql 和 keepalived;

  发现其 VIP 也没有自动飘回来;这是因为 我们都 keepalived 配置文件中  设置的  state BACKUP ,且权重参数都是100 一样的,所以不会出现抢占情况(具体原理见参考文件中的 mysql keepalived 双主更全面详细的)

    

 

(2.6)mysql持续连接视角(再飘一下VIP)

那我们在2个机器上都新建了 账户

create user ruser@'192.168.148.%' identified by 'a123456!';

根据上面的操作,我们当前VIP 是在 

  192.168.148.27 DB4 上

我们用另外一个机器DB5去连接

  

 

 然后我们在DB4上关闭mysql;

  

 

 在VIP切换的过程中,我们的查询一直是 丢失连接,无法连接的;等VIP彻底切到 DB3 之后,我们的查询就好了;这个过程对于程序是完全透明的,程序只需要连这个VIP 等待它恢复即可;

  

 

 【3】keepalived告警

vi notify.sh

#!/bin/bash
contact='yuxingfu@aikosolar.com'
notify(){
 mailsubject="$(hostname) to be $1, vip转移"
 mailbody="(`date +%F%T`):vrrp transition, $(hostname) changed to be $1"
 echo "$mailbody" | mail -s "$mailsubject" $contact

}

case $1 in

master)
notify master
;;

backup)
notify backup
;;

fault)
notify fault
;;

*)
echo "Usage: $(basename $o) {master|backup|fault}"
exit 1
;;

esac

 

【故障处理】

(1)vrrp_script 定义的脚本不执行

需要加权限 chmod +x  脚本名

(2)vip无法ping通,无法访问端口

#vrrp_strict

  keepalived.conf中vip配置好后,通过ip addr可以看到vip已经顺利挂载,但是无法ping通,并且防火墙都已关闭;

  原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。

(3)如何抓包查看

tcpdump -i ens160 vrrp

tcpdump -i eth0 -n 'host 224.0.0.18'

(4)2个节点均有VIP

1、VRRP异常,主备都有VIP,备机收不到主节点的vrrp报文

  原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。

2、组播被禁用,使用单播解决

    unicast_src_ip 192.168.1.14  # 配置单播的本机地址
    unicast_peer { 
        192.168.1.15       #配置单播的目标地址
    }    #keepalived在组播模式下所有的信息都会向224.0.0.18的组播地址发送,产生众多的无用信息,并且会产生干扰和冲突,可以将组播的模式改为单拨。也有可能组播被上级禁用。这是一种安全的方法,避免局域网内有大量的keepalived造成虚拟路由id的冲突。

 3、防火墙没有关闭,导致A和B之间不能通信,都判断自己为master绑定vip

4、keepalived的vrid与别人的相同,并且密码还都是一样的导致,keepalived报错

 

【参考文档】

超详细keepalived 配置文件参数:https://blog.csdn.net/mofiu/article/details/76644012

mysql keepalived 双主更全面详细的:https://www.cnblogs.com/gered/p/12328155.html#autoid-2-0-0

 

posted @ 2022-01-20 14:12  郭大侠1  阅读(285)  评论(0编辑  收藏  举报