双机主备:主机工作,备机备用,主机出现故障,自动切换到备机,由于用户访问的是vip,故不会感知到。
1.两台机器nginx-master,nginx-backup
2.在两台nginx服务期上分别安装keepalived
yum install -y keepalived
3.在nginx-master上修改keepalived.conf
cd /etc/keepalived
vi keepalived.conf
#保留下面的内容
! Configuration File for keepalived
global_defs {
router_id nginx1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 61
#注意,如果主机的优先级没有备机的大,则vip会绑定到优先级大的机器上,优先级相同时会先绑到主机上
priority 100
#主备之间同步检查的时间间隔,默认1s
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.26.102
}
}
4.在nginx-backup上修改keepalived.conf
! Configuration File for keepalived
global_defs {
router_id nginx2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 61
priority 50
#主备之间同步检查的时间间隔,默认1s
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.26.102
}
}
5.分别主机和备机的keepalived
systemctl start keepalived
6.用"ip addr"命令验证vip 192.168.26.102是否已绑到主机ens33网卡上
存在的问题:
keepalived只有在nginx-master这整个节点挂掉时才会自动切换到备用节点,如果只有主节点的ngixn挂掉了,keepalived是无法感知到的,这时候vip仍然绑定在master上,无法完成ip漂移,如果这时候客户访问vip的时候,会显示“无法访问此网站”,相当于服务整个就瘫痪了。
解决方案:
为了保证全天候的为用户提供不间断的服务,我们得让keepalived定时去检测nginx软件是否正常,如果nginx出现了问题,这时候,keepalived要尝试重启nginx,使得服务能够自动恢复到正常状态,如果说实在重启不了,那就切换到备用nginx服务器。
1.在nginx-master服务器上编写脚本,手动停止master上的nginx
#测试是否安装了killall命令,执行完若出来版本号则证明已安装
killall -V
#若没出来版本号,显示无此命令,则先安装
yum install -y psmisc
cd /etc/keepalived
vi check_nginx_status.sh
#保存下面内容,注意,一个空格都不能错
#!/bin/sh
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
#保存退出,并赋执行权限
chmod 775 check_nginx_status.sh
#尝试着运行一下,不报错则说明脚本没问题
./check_nginx_status.sh
2.进入nginx-master,在keepalived的配置文件中调用此脚本,重点加上紫色部分的代码
cd /etc/keepalived
vi keepalived.conf
#保存下面的配置
! Configuration File for keepalived
global_defs {
router_id nginx1
}
vrrp_script check_nginx_status {
script "/etc/keepalived/check_nginx_status.sh"
# 每隔2秒运行一下上一行脚本
interval 2
# 如果脚本运行成功,则升级权重+10
weight 10
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 61
priority 100
#主备之间同步检查的时间间隔,默认1s
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
#追踪nginx脚本
check_nginx_status
}
virtual_ipaddress {
192.168.26.102
}
}
3.重启keepalived
systemctl restart keepalived
#设置开机自启动
systemctl enable keepalived
4.测试,若此时访问虚拟ip是通的,并且vip是绑定在master上的,则大功告成!
5.在backup节点上,重新执行1-4步骤即可。
常见的问题:
1.keepalived调用的脚本不生效,手动执行脚本没问题,但是配到keepalived.conf中就是不起作用。
首先检查keepalived.conf配置里面脚本定义的名字和外面脚本的名字是否一致,再检查和配置里调用的方法的名字和定义的名字是否一致,若都没问题,那就是selinux的问题了。
关闭selinux,这个只是临时关闭,重启之后又不行了
setenforce 0
永久关闭selinux,执行完命令后记得重启
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config