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脚本是当本节点服务器成为某个角色的时候,就会去执行某个脚本

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

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

# vrrp停止后执行的脚本
notify_stop "/mail/stop.sh"
相关推荐
Avan_菜菜5 小时前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
ping某4 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 天前
ARP代理--工作原理
运维·网络·arp·arp代理