nginx两台负载均衡服务器之间使用keepalived实现高可用

这篇具有很好参考价值的文章主要介绍了nginx两台负载均衡服务器之间使用keepalived实现高可用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

高可用HA

单点故障:某个重要的功能只有一份,如果他出现问题,会导致全局不能使用

“高可用性”(High Availability,缩写为HA)用于描述系统或服务在面临故障、硬件或软件问题时能够继续正常运行的能力。高可用性的目标是最大程度地减少系统中断或停机时间,确保用户可以随时访问服务或应用程序。

三个经典的高可用软件:hearbeat、keepalived、HAproxy

keepalived实现高可用

keepalived两大核心功能:
1、loadbalance 负载均衡:ipvs -> LVS软件在Linux内核里已经安装
2、high-avaliability 高可用:vrrp协议(虚拟路由冗余协议)

keepalived启动之后会有三个进程:
父进程: 内存管理,子进程管理等
子进程: VRRP子进程
子进程: healthchecker子进程,查看各自服务器的健康状况

出错了可以看日志:/var/log/messages

两台负载均衡器上都需要安装nginx,使用nginx做七层负载均衡,

VRRP协议

virtual router redundancy protocol 虚拟路由冗余协议
一组路由器协同工作,担任不同工作,担任不同角色,有master角色,也有backup角色
master角色的路由器(的接口)承担实际的数量流量转发任务
backup路由器监听master路由器的状态,并在master路由器发生故障时,接替其工作,从而保证业务流量的平滑切换

vrrp协议工作在网络层
vrrp协议使用固定的组播地址224.0.0.18进行发送
帧的组播地址:目的地址 - 01:00:5E:00:00:12
第8位为1,代表这个mac地址是一个广播地址

vrrp协议的工作原理:

  1. 所有的路由器或服务器发生vrrp宣告报文,进行选举,必须是相同vrid和认证密码,优先级高的服务器或路由器会被选举为master
  2. master定时发生vrrp通告报文,以便向backup路由器告知自己的存活情况,默认时间间隔是1秒
  3. 接收master设备发送的vrrp通告报文,判断master设备的状态是否正常。如果超过1秒没有收到vrrp报文,就认为master挂了,开始重新选举新的master,vip会飘移到新的master上

单VIP架构

LB2:192.168.232.165

  1. 在两台LB上安装keepalived

    yum install keepalived -y
    
  2. 修改主LB的配置文件

    cd /etc/keepalived/
    vim keepalived.conf
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
       vrrp_skip_check_adv_addr
       #vrrp_strict    # 注释这一行
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }
    
    vrrp_instance VI_1 {
        state MASTER    # 主LB
        interface ens33
        virtual_router_id 58    # 虚拟路由器id
        priority 120    # 优先级(0~255)
        advert_int 1    # 宣告消息的间隔事件为1秒
        authentication {    # 认证
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {    # VIP
            192.168.232.111
        }
    }
    
  3. 修改从LB的配置文件

    cd /etc/keepalived/
    vim keepalived.conf
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
       vrrp_skip_check_adv_addr
       #vrrp_strict
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }
    
    vrrp_instance VI_1 {
        state BACKUP    # 从LB
        interface ens33
        virtual_router_id 58
        priority 100    # 优先级要比主LB小
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.232.111
        }
    }
    
    
  4. 配置完成之后刷新服务

    service keepalived restart 
    

    这个时候就可以在主LB服务器上看到VIP,而从LB服务器上没有这个VIP。VIP在哪一个服务器上,就由哪一个服务器对外提供服务

VIP飘移

master挂了(或keepalived服务关闭),VIP就会飘移到slave上,这个时候就可以在从LB上看到这个VIP。如果master恢复,VIP就会飘会主LB上(优先级更高)

脑裂

多台机器出现同一个VIP

脑裂出现的原因:
1、vrid(虚拟路由id)不一样
2、网络通信有问题(防火墙组织了vrrp报文的通信)
3、认证密码不一样

双VIP架构(互为主从)

双VIP的架构可以实现负载均衡

只要将以下代码加入主LB的配置文件,作为第二个VIP的从服务器

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 59
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.232.112
    }
}

将以下代码加入从LB的配置文件,作为第二个VIP的主服务器

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 59
    priority 120
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.232.112
    }
}

这个时候就可以在主LB上看到192.168.232.111这个VIP,在从LB上看到192.168.232.112

完成高可用之后就可以在DNS服务器里添加这两个IP的记录了

keepalived监控 、执行脚本

Keepalived 可以通过检查状态来了解当前主服务器和备用服务器的状态

keepalived的基础是nginx服务,nginx服务停止了,就会检测为状态异常

实例:监控本机的nginx进程是否运行,如果nginx进程不运行就立马将优先级降低30

如何判断nginx是否运行
1、pidof nginx
2、查看kiilall -0 nginx这条命令的返回值

  1. 编写监控nginx脚本,授予可执行权限,也可以直接写在keepalived里

    mkdir /nginx
    cd /nginx
    vim check_nginx.sh
    
    #!/bin/bash
    if /usr/sbin/pidof nginx &>/dev/null ;then
    	exit 0
    else
    	exit 1
    fi
    
    chmod +x check_nginx.sh
    
  2. 在keepalived里定义并调用监控脚本

    # 在global_defts部分后面加:
    # 定义监控脚本chk_nginx
    # 当脚本执行返回值为1时才会执行下面权重值-30的操作
    vrrp_script chk_nginx {
    	script "/nginx/check_nginx.sh"
    	interval 1    # 每隔一秒执行
    	weight -30    # 返回值为0时就把优先级-30
    }
    
    #主LB在vrrp_instance VI_1中添加,从在VI_2中添加:
    # 调用监控脚本
    track_script {
    	chk_nginx
    }
    

    是master的那个vrrp实例调用vrrp监控脚本

notify

notify脚本是当本节点服务器成为某个角色的时候,就会去执行某个脚本文章来源地址https://www.toymoban.com/news/detail-702784.html

# 状态改变为master后执行的脚本
notify_master "/mail/master.sh"

# 状态改变为backup后执行的脚本
notify_backup "/mail/backup.sh"

# vrrp停止后执行的脚本
notify_stop "/mail/stop.sh"

到了这里,关于nginx两台负载均衡服务器之间使用keepalived实现高可用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家