Nginx + Keepalived 高可用之主从配置

2021-04-12 11:16:42 浏览数 (1)

在架构设计中,可以利用 nginx 的反向代理和负载均衡实现后端应用的高可用性,同时还需要考虑Nginx的单点故障,真正做到架构高可用性。

主要考虑以下两点:

  • Nginx 服务因为意外现象挂掉
  • 服务器宕机导致 Nginx 不可用

目前主流的解决方案就是 keepalived nginx 实现 nginx 的故障转移,同时做好监控报警。在自动故障转移的同时能通知到相关的应用负责人检查相关应用,排查隐患,彻底解决问题。

模拟环境:虚拟机 192.168.56.9 与 192.168.56.10

192.168.56.9:安装 nginx 主 keepalived 主 Tomcat 主

192.168.56.10:安装 nginx 备 keepalived 备 Tomcat 备

虚拟IP(VIP):192.168.56.120

Nginx 服务和 Tomcat 应用是已经配置好的环境,这里就不介绍相关的配置。具体可以查考以下两篇博文:

  • Nginx系列:Nginx源码安装
  • Nginx Tomcat 负载均衡配置

0x01:Keepalived 介绍及部署

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

CentOS 系统安装 Keepalived 主要有两种安装方式:

  • yum 命令安装
  • 源码安装

yum 命令安装

代码语言:javascript复制
yum install -y  keepalived

该方式安装的 keepalived 版本为 1.3.5

使用 yum 安装方式安装不了最新版本的 Keepalived,可以使用以下命令卸载 Keepalived

代码语言:javascript复制
yum remove keepalived

源码安装

1. 下载源码

官网地址

代码语言:javascript复制
https://www.keepalived.org/

使用如下命令下载

代码语言:javascript复制
wget https://www.keepalived.org/software/keepalived-2.2.2.tar.gz

2. 解压 Keepalived

代码语言:javascript复制
tar -zxvf keepalived-2.2.2.tar.gz -C /usr/local

3. 进入 Keepalived 解压目录

代码语言:javascript复制
cd keepalived-2.2.2/

4. 编译

代码语言:javascript复制
./configure

如在编译过程中出现错误,可以先执行以下命令安装 Keepalived 所需的依赖

代码语言:javascript复制
yum install -y gcc openssl-devel popt-devel ipvsadm

编译成功的结果如下

5. 安装

代码语言:javascript复制
make && make install

6. 将 Keepalived 安装成 Linux 系统服务

代码语言:javascript复制
mkdir /etc/keepalived

cp /root/keepalived-2.2.2/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

cp /root/keepalived-2.2.2/keepalived/etc/init.d/keepalived /etc/init.d/

cp /root/keepalived-2.2.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

ln -s /usr/local/sbin/keepalived /usr/bin/

ln -s /usr/local/sbin/keepalived /sbin/

Keepalived 常用命令

代码语言:javascript复制
# 设置开机自动启动
systemctl enable keepalived.service
# 取消开机自动启动
systemctl disable keepalived.service 
# 启动
systemctl start keepalived.service
# 停止
systemctl stop keepalived.service
# 重启
service keepalived restart
# 状态
service keepalived status

0x02:主 Keepalive 配置

主 Keepalived 配置文件

代码语言:javascript复制
! 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 nginx01  # router_id  唯一标识符
   vrrp_skip_check_adv_addr
   vrrp_stricti
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script check_nginx {  
    script "/etc/keepalived/nginx_check.sh"   #nginx服务检查脚本
    interval 1
    weight -2
}

vrrp_instance VI_1 {
    state MASTER
    interface enp0s3 #指定VIP需要绑定的物理网卡,这里默认是eht0但是我的是enp0s3,如果报错了就改成自己物理网卡名字 
    virtual_router_id 52  #默认为51  配置完发现主备切换有问题 更改为52 发现好了  原因未知
    priority 150     #主备的优先级priority 
    advert_int 1     #检查时间1秒
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script  {
    check_nginx
    }

    virtual_ipaddress {
        192.168.56.120/24   #vip地址 
    }
}

nginx_check.sh 脚本

代码语言:javascript复制
#!/bin/bash

A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        pkill keepalived
    fi
fi

添加权限

代码语言:javascript复制
chmod 755 nginx_check.sh

启动 Keepalived

代码语言:javascript复制
systemctl start keepalived.service

检查是否启动成功

查看 IP 地址变[ 启动前 ]

查看 IP 地址变[ 启动后 ]

0x03:备 Keepalived 配置

同样按照步骤 0x01 安装 keepalived,然后按照如下步骤配置。

Keepalived 配置文件

代码语言:javascript复制
! Configuration File for keepalived

global_defs {
   router_id NodeB
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight 20
}

vrrp_instance VI_1 {
    state BACKUP
    interface enp0s4
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1314
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.56.120/24
    }
}

nginx_check.sh 脚本

代码语言:javascript复制
#!/bin/bash

A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        pkill keepalived
    fi
fi

添加权限

代码语言:javascript复制
chmod 755 nginx_check.sh

nginx_check.sh 脚本说明:

脚本逻辑为检测进程如果没有 nginx 就尝试启动一次,然后 sleep 两秒,再检测,如果还没有上进程就结束 keepalived 进程。这样 VIP 就会移动到备份节点。如果 yum 安装的 nginx,可以直接使用 nginx 命令可以启动 nginx,如果是源码安装,或者需要配置下环境变量或者更改下启动命令和绝对路径,并测试是否能正常启动 nginx。

启动 Keepalived

代码语言:javascript复制
systemctl start keepalived.service

检查是否启动成功

查看 IP 地址变[ 启动前 ]

查看 IP 地址变[ 启动后 ]

另外,如果 keepalived 启动不成功,可以在keepalived日志文件 /var/log/messages 查看是否存在配置文件的错误。

0x04:验证

防火墙开启vrrp

keepalived 是基于 vrrp 做到虚拟 ip 漂移的,这里不开启的话,主备均会认为对方挂掉了,会造成主备都能获取到虚拟ip ( vip )

代码语言:javascript复制
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload

首先在主备服务器分别执行 service keepalived start 开启 keepalived

  • 通过 ip addr 命令分别查看主备两台机器,只有主服务器可以看到 vip
  • 在主服务器执行 service keepalived stop 停止 keepalived
  • 通过 ip addr 命令查看备服务的 ip, 会发现可以看到 vip
  • 在主服务器执行 service keepalived start ,再次启动 keepalived
  • 通过 ip addr 命令分别查看主备两台机器,只有主服务器可以看到 vip

0 人点赞