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