应用场景:当数据库主库所在主机宕机之后,通过VIP使从库接管服务,实现高可用,并在数据库主库宕机重启之后,可以使用脚本使VIP从从库所在服务器上重新移至主机数据库所在的服务器上。(注意:重新移至主机数据库之前,需要检查主从数据需要保持一致)
操作步骤:
需要提前准备两台服务器,默认使用数据库MySQL8.0,搭建双主架构(我这边的架构目前是双主架构,可自行参考)
需要系统可以使用yum源,或配置过本地yum源
1.下载keepalived
yum -y install keepalived
2.查询keepalived版本信息
keepalived -v
3.查看keepalived配置文件(默认安装后,在/etc/keepalived/路劲下)
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server xxx.xx.xx.x
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
12.16.123.6(此处已对ip进行修改,显示可能存在不一致)
12.16.123.7(此处已对ip进行修改,显示可能存在不一致)
12.16.123.8(此处已对ip进行修改,显示可能存在不一致)
}
}
virtual_server xxx.xx.xx.x(ip地址) 443 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server xxx.xx.xx.x(ip地址) 443 {
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server xxx.xx.xx.x(ip地址) 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
sorry_server xxx.xx.xx.x(ip地址) 1358
real_server xxx.xx.xx.x(ip地址) 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest xxxxxxxxxxxxxxxxxxxxxx
}
url {
path /testurl2/test.jsp
digest xxxxxxxxxxxxxxxxxxxxxx
}
url {
path /testurl3/test.jsp
digest xxxxxxxxxxxxxxxxxxxxxx
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server xxx.xx.xx.x(ip地址) 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest xxxxxxxxxxxxxxxxxxxxxx
}
url {
path /testurl2/test.jsp
digest xxxxxxxxxxxxxxxxxxxxxx
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server xxx.xx.xx.x(ip地址) 1358 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server xxx.xx.xx.x(ip地址) 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest xxxxxxxxxxxxxxxxxxxxxx
}
url {
path /testurl2/test.jsp
digest xxxxxxxxxxxxxxxxxxxxxx
}
url {
path /testurl3/test.jsp
digest xxxxxxxxxxxxxxxxxxxxxx
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server xxx.xx.xx.x(ip地址) 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest xxxxxxxxxxxxxxxxxxxxxx
}
url {
path /testurl2/test.jsp
digest xxxxxxxxxxxxxxxxxxxxxx
}
url {
path /testurl3/test.jsp
digest xxxxxxxxxxxxxxxxxxxxxx
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
4.可以先备份此配置
cp /etc/keepalived/keepalived.cnf /etc/keepalived/keepalived.cnfbak
5.修改keepalived的配置文件
vim /etc/keepalived/keepalived.cnf
! Configuration File for keepalived
global_defs {
script_user root #执行脚本用户为root
# enable_script_security
}
# 声明自定义脚本路径
vrrp_script CheckMySQL {
script "/etc/keepalived/CheckMySQL.sh"
interval 1 #指定进行健康检查的时间间隔,即每隔一段时间检查一次服务的状态。该参数的值通常以秒为单位。较小的间隔可以提供更频繁的检查,但可能增加系统资源的负担。
fall 2 #连续检测失败的次数,当服务连续失败的次数达到指定的值时,认为服务不可用。换句话说,如果连续指定次数(fall)的健康检查失败,则 keepalived 认为服务已经故障。
}
vrrp_instance VI_1 {
state BACKUP
nopreempt #不抢占模式,在优先级高的机器上设置即可,优先级低的机器可不设置
interface eth0 #指定虚拟网卡接口
virtual_router_id 151 # 路由器标识,MASTER和BACKUP必须是一致的
priority 80 #权重,权重用于抢夺VIP时使用,建议将主库服务器设置权重比从库服务器大于30左右
advert_int 1
authentication {
auth_type PASS
auth_pass ShinDB
}
virtual_ipaddress {
192.168.6.224 #vip
}
track_script {
CheckMySQL8960 #调用脚本模块
}
}
6.放至/etc/keepalived/下CheckMySQL.sh脚本
vim /etc/keepalived/CheckMySQL.sh
#!/bin/bash
COUNT=`ps -C mysqld --no-header | wc -l` #检查mysql服务是否存在
NUM=0
for i in `seq 3` #执行三次检测,避免异常检测引起VIP漂移
do
if [ $COUNT -gt 0 ];then
exit 0
else
NUM=${NUM}+1
fi
if [ $NUM -eq 3 ];then
kill `cat /etc/keepalived/KeepalivedCheckDmp.pid`
exit 1
fi
done
7.赋予CheckMySQL.sh操作权限
chmod +x /etc/keepalived/CheckMySQL.sh
可以将keepalived服务的启停也整理为脚本
服务启动:
/usr/sbin/keepalived -f /etc/keepalived/keepalived.conf -p /etc/keepalived/KeepalivedCheckDmp.pid
服务关闭:
kill `cat /etc/keepalived/KeepalivedCheckDmp.pid`
配置完毕,可以先检查VIP所在服务器
ip a #查看eth0网卡端口是否有VIP
可以看到VIP在主库服务器,然后就可以停止主库查看VIP是否进行了漂移,查看从库服务器,查看到VIP,即可证明已经完成了漂移。