• 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 双机热备

  • 相关阅读:
    MySql中的变量定义
    mysql常用脚本
    Spring中依赖注入的使用和配置
    在linux下通过sh运行java程序
    linux下shell脚本学习
    eclipse导出jar包
    mysql中游标的使用
    netty中LengthFieldBasedFrameDecoder的使用
    网络游戏服务器架构(转)
    H2 database的使用
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/13058208.html
Copyright © 2020-2023  润新知