环境
VIP=192.168.100.100
主机 | IP |
---|---|
nginx1 | 192.168.100.150 |
nginx2 | 192.168.100.151 |
部署
安装nginx(略)#两个nginx节点安装keepalive服务
yum -y install keepalived
systemctl enable keepalived
修改keepalive配置文件
nginx1
[root@nginx1 ~]> cat /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id LVS_DEVEL
}
vrrp_script chk_nginx {script "/etc/keepalived/check_nginx.sh"interval 10weight -5fall 2rise 1
}
vrrp_instance VI_1 {state MASTER# 注意网卡名interface ens33# lan口IP地址mcast_src_ip 192.168.100.150virtual_router_id 51priority 100#nopreemptadvert_int 2authentication {auth_type PASSauth_pass BLUEKING_NGINX_HA}virtual_ipaddress {192.168.100.100/24}track_script {chk_nginx}
}
nginx2
[root@kafka02 ~]> cat /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {router_id LVS_DEVEL
}
vrrp_script chk_nginx {script "/etc/keepalived/check_nginx.sh"interval 10weight -5fall 2rise 1
}
vrrp_instance VI_1 {state BACKUP# 注意网卡名interface ens33mcast_src_ip 192.168.100.151virtual_router_id 51priority 98#nopreemptadvert_int 2authentication {auth_type PASSauth_pass BLUEKING_NGINX_HA}virtual_ipaddress {192.168.100.100/24}track_script {chk_nginx}
}
所有节点编写脚本文件
/etc/keepalived/check_nginx.sh
#!/bin/bash
process_name="nginx"
process_abs_path="/usr/local/nginx1/sbin/nginx"function is_nginx_running() {process_info=$(ps --no-header -C $process_name -o ppid,pid,args | awk '{printf $1 "|" $2 "|" ; for (i=3; i<=NF; i++) { printf "%s ", $i };printf "\n"}' | grep master)if [[ -z "$process_info" ]]; thenreturn 1elseprocess_pids=($(echo "$process_info" | awk -F'|' '{print $2}'))for _pid in "${process_pids[@]}"; doabs_path=$(readlink -f /proc/$_pid/exe)if [ "$abs_path" == "$(readlink -f "$process_abs_path")" ]; thenreturn 0fidonereturn 2fi
}err=0
for k in $(seq 1 3); dois_nginx_runningif [[ $? != "0" ]]; thenerr=$((err + 1))sleep 1elseerr=0breakfi
doneif [[ $err != "0" ]]; thenexit 1 # 返回失败状态
elseexit 0
fi
EOF
测试
停止1号节点的nginx,验证故障转移。
[root@kafka01 keepalived]> systemctl stop nginx
[root@kafka01 keepalived]> ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:84:bb:4d brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.100.150/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe84:bb4d/64 scope link noprefixroutevalid_lft forever preferred_lft forever
节点2