版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38637595/article/details/89817734
目标
- 现在只有两台服务器,都运行着nginx和mysql
- 当两台服务器都正常的时候
- 用户访问nginx默认访问服务器A,如果A的nginx异常则访问B的nginx
- 用户访问mysql默认访问服务器B,如果B的Mysql异常则访问A的Mysql
- 意思就是对这两台的服务器做两个VIP,实现两个进程的高可用
配置
- 如果大家对单个进程的高可用检测原理能够理解
- 那么对双进程也是很好理解的
- 可以理解为在同一个配置文件里配置两个单进程的高可用检测
配置效果图
- 关于配置的几点说明(在配置文件中都有)
- 配置了两个虚拟路由组VI_NGINX和VI_MYSQL
- 两个虚拟路由的vrid要不一样(这里一个配了51,一个配了52)
- 服务器A的nginx初始权重为100,B为90
- 服务器A的mysql初始权重为90,B为100
- vip_nginx为192.168.1.200
- vip_mysql为192.168.1.201
- nginx和mysql的检测进程检测到异常时,会使得本机的权重下降20
服务器A
vrrp_script chk_nginx_process {
script "/opt/context/keepalive_check/checkNginx.sh"
interval 2
weight -20
}
vrrp_instance VI_NGINX {
state MASTER
interface bond0
virtual_router_id 51
priority 100
mcast_src_ip 192.168.1.100
advert_int 1
authentication {
auth_type PASS
auth_pass 5678
}
virtual_ipaddress {
192.168.1.200
}
track_script {
chk_nginx_process
}
}
vrrp_instance VI_MYSQL {
state BACKUP
interface bond0
virtual_router_id 52
priority 90
mcast_src_ip 192.168.1.100
advert_int 1
authentication {
auth_type PASS
auth_pass 15678
}
virtual_ipaddress {
192.168.1.101
}
}
服务器B
vrrp_script chk_mysql {
script "/opt/context/keepalive_check/checkMysql.sh"
interval 2
weight -20
}
vrrp_instance VI_NGINX {
state BACKUP
interface bond0
virtual_router_id 51
priority 90
mcast_src_ip 192.168.1.101
advert_int 1
authentication {
auth_type PASS
auth_pass 5678
}
virtual_ipaddress {
192.168.1.200
}
}
vrrp_instance VI_MYSQL {
state MASTER
interface bond0
virtual_router_id 52
priority 100
mcast_src_ip 192.168.1.101
advert_int 1
authentication {
auth_type PASS
auth_pass 15678
}
virtual_ipaddress {
192.168.1.201
}
track_script {
chk_mysql
}
}
检测脚本
- nginx
#!bin/bash
NginxProNum=`ps -C nginx --no-header | wc -l`
if [ $NginxProNum -eq 0 ];then
#systemctl stop keepalived
exit 1
fi
exit 0
- mysql
#!/bin/bash
MYSQL=/usr/local/mysql/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=rep
MYSQL_PASSWORD=pukkasoft
CHECK_TIME=3
#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1
function check_mysql_helth (){
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
pkill keepalived
exit 1
fi
sleep 1
done