nginx + keepalived 实现高可用

175 阅读2分钟

Nginx高可用的必要性主要体现在其作为反向代理或负载均衡服务器的核心地位。当Nginx宕机时,所有服务都无法正常提供,影响非常严重。因此,保证Nginx的高可用性是至关重要的。

keepalived工作原理:Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除, 同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中, 这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器

Keepalived主要通过以下三种模块实现:core、check和vrrp。其中,core模块是Keepalived的核心,负责主进程的启动和管理;check模块则是负责健康检查,可以通过ICMP、TCP和端口状态来检测和移除不健康的服务器;vrrp模块则是实现虚拟路由冗余协议,保证业务/服务/服务器的存活和稳定运行。

资源准备:

  • 内网vip
  • 外网vip
  • keepalived-2.2.4.tar.gz
  • openresty-1.19.9.1.tar.gz

安装部署

  1. 安装nginx:可以采用yum、或者tar包安装

  2. 安装keepalived
    tar -xzvf keepalived-2.2.4.tar.gz -C /data
    cd /data/keepalived-2.2.4
    ./configure --prefix=/usr/local/keepalived
    make && make install

  3. 拷贝文件
    源目录拷贝
    cp /data/keepalived-2.2.4/etc/init.d/keepalived /etc/init.d/
    cp /data/keepalived-2.2.4/etc/sysconfig/keepalived /etc/sysconfig/

    安装目录拷贝
    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

  4. keepalived配置文件:/etc/keepalived/keepalived.conf


global_defs {
        notification_email {
                xxxxx.cn
        }
        notification_email_from xxxx.cn
        smtp_server 127.0.0.1
        smtp_connect_timeout 30
        
        #虚拟路由器的唯一标识
        router_id SVR01
}

#nginx存活检查脚本
vrrp_script chk_nginx {
        script "/etc/keepalived/check_nginx.sh"
        
        #脚本调用间隔
        interval 2
        weight -20
        fall 3
        rise 2
}

vrrp_instance VI_1 {
        #绑定档期虚拟路由器使用的物理接口
        interface eth0
        #master节点
        state MASTER
        #主ip
        vrrp_unicast_bind x.x.x.x
        #备ip
        vrrp_unicast_peer x.x.x.x
        #虚拟路由id,主备必须相同,范围0-255
        virtual_router_id 200
        #主备优先级
        priority 100
        advert_int 2
        #设置主备验证方式
        authentication {
                auth_type PASS
                auth_pass xxxx.cn
        }
        #配置虚拟路由vip
        virtual_ipaddress {
                xxxx/24 dev eth0 label eth0:0
                xxxx/26 dev eth1 label eth1:0
        }
        track_script {
                chk_nginx
        }
}
  1. nginx存活检查脚本:/etc/keepalived/check_nginx.sh
pidof nginx
if [ $? -ne 0 ];then
/etc/init.d/keepalived stop
fi
  1. 启动nginx
  2. 启动keepalived:
    service keepalived start
    systemctl enable keepalived

keepalived限制场景

一般情况下,我们喜欢使用keepalived来实现主备切换,从而实现服务高可用。但是一般是在我们自己的网络内使用,当keepalived在公有网络架构上,往往无法直接使用。公有网络一般在网关设备上会做流量抑制。