Nginx + Keepalived 双机热备

Posted 拨云见日

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx + Keepalived 双机热备相关的知识,希望对你有一定的参考价值。

VRRP 协议

虚拟路由冗余协议(Virtual Router Redundancy Protocol)是解决局域网中配置静态网关出现单点失效现象的路由协议,通过将多台设备虚拟化成一台设备,如果其中一台设备出现故障,那么另一台设备可以迅速接替其工作,已保证通讯的可靠性和连续性,属于网络层协议 。

公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了,怎么办?通常的做法是给路由器增加一个 BACKUP,假设 MASTER 发生了故障,每一个用户需要手动指向 BACKUP,如果用户过多修改起来非常麻烦 ;那从主节点 MASTER 下手,我们将 BACKUP 网关修改为 MASTER 的 IP 是否可以?

答案是不行的,PC 第一次通过 ARP 广播找到 MASTER 网关的 IP + Mac 地址后,会写入 ARP 缓存表,那么 PC 在之后的连接都是通过缓存表进行数据报转发的,即使我们修改了 IP,但是 Mac 地址是唯一的, PC 的数据包仍然会发送给 Master(除非 ARP 缓存表过期,再次发 ARP 广播时,会记录新的 IP + Mac 地址映射)

如何才能做到出现故障自动转移,此时 VRRP 就出现了,我们的VRRP其实是通过软件或者硬件的形式在 Master 和 Backup 外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,PC仅会在 ARP 缓存表中记录 VMAC 与 VIP 的信息 。

nginx + Keepalived 高可用

Keepalived 软件是基于 VRRP 协议实现的,用来解决服务器的单点故障问题,实现高可用的服务器架构


用虚拟机模拟上图情况获取缓存表如下,

实现 Nginx + Keepalived 高可用,就是将 Nginx 与 Keepalived 服务的守护进程存活捆绑在一起,Keepalived 服务决定了 VIP 的地址绑定在哪一台机器的哪一块网卡上 。

如果绑定了 VIP 的机器的 Nginx 突然挂掉了,那就要将这台机器的 Keepalived 服务停掉,VIP 的地址就会漂移到备份服务器的网卡上 。

抢占式 Keepalived 配置

Master 节点配置

# 安装 keepalived
[root@lb01 ~]# yum -y install keepalived

# 编辑配置文件 
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {                   #全局配置
    router_id lb01              #标识身份->名称
}

vrrp_script isalive {
    script "/script/nginx_keep.sh"
    interval 5
}

vrrp_instance VI_1 {
    state MASTER                #标识角色状态
    interface eth0              #网卡绑定接口
    virtual_router_id 50        #虚拟路由id
    priority 150                #优先级
    advert_int 1                #监测间隔时间
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {
        10.0.0.3                #虚拟的VIP地址
    }
    
    track_script {
        isalive
    }
}

# 编辑定时执行脚本
[root@lb01 ~]# cat /script/nginx_keep.sh 
#!/bin/sh
nginx_status=$(ps -C nginx --no-header|wc -l)

#1.判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $nginx_status -eq 0 ];then
    systemctl start nginx
    sleep 3
    #2.等待3秒后再次获取一次Nginx状态
    nginx_status=$(ps -C nginx --no-header|wc -l)
    #3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
    if [ $nginx_status -eq 0 ];then
        systemctl stop keepalived
   fi
fi

# 切记要将脚本文件授权成 可执行文件
[root@lb01 ~]# chmod +x /script/nginx_keep.sh 

[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# systemctl enable keepalived

Backup 节点配置

# 安装 keepalived
[root@lb02 ~]# yum -y install keepalived

# 编辑配置文件 
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
    router_id lb02
}
vrrp_instance VI_1 {
    state BACKUP        
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}

[root@lb02 ~]# systemctl start keepalived
[root@lb02 ~]# systemctl enable keepalived

非抢占式 Keepalived 配置

1、两个节点的state都必须配置为 BACKUP
2、两个节点都必须加上配置 nopreempt
3、其中一个节点的优先级必须要高于另外一个节点的优先级
两台服务器都角色状态启用 nopreempt 后,必须修改角色状态统一为 BACKUP,唯一的区分就是 优先级!!

原 Master 配置
    vrrp_instance VI_1 {
        state BACKUP
        priority 150
        nopreempt
    }

Backup 配置
    vrrp_instance VI_1 {
        state BACKUP
        priority 100
        nopreempt
    }

Keepalived 脑裂

由于某些原因,导致两台 Keepalived 高可用服务器在指定时间内,无法检测到对方的心跳,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着,都绑定了 VIP

脑裂故障原因:
①.服务器网线松动等网络故障
②.服务器硬件故障发生损坏现象而崩溃
③.主备都开启firewalld防火墙

# 执行脚本,如果 lb01,lb02 都绑定了 VIP,停掉 lb02 的Keepalived
[root@lb02 ~]# vim  brainsplitting.sh
#!/bin/bash
vip=10.0.0.3
lb01_ip=10.0.0.5
while true;do							
    ping -c 3 $lb01_ip &>/dev/null
    if [ $? -eq 0 ];then
        lb01_vip_status=$(ssh $lb01_ip "ip add|grep $vip|wc -l")
        lb02_vip_status=$(ip add|grep $vip|wc -l)
        if [ $lb01_vip_status -eq 1 -a $lb02_vip_status -eq 1 ];then
                systemctl stop keepalived
        fi
    fi
sleep 5
done

其他可供学习的Blog:
Nginx + Keepalived 双机热备

以上是关于Nginx + Keepalived 双机热备的主要内容,如果未能解决你的问题,请参考以下文章

keepalived双机热备nginx

keepalived+nginx双机热备+负载均衡

Nginx+Keepalived双机热备(主主模式)

Lvs+keepalived+Nginx双机热备实现Nginx高可用

Nginx + Keepalived 双机热备

Nginx + Keepalived 双机热备