高并发系列【keepalived+nginx实现双机主备】

双机主备:主机工作,备机备用,主机出现故障,自动切换到备机,由于用户访问的是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
愿你走出半生,归来仍是少年!
原文地址:https://www.cnblogs.com/hujunwei/p/15773502.html