Wave Spread...

Linux 运维手册之 NGINX 高可用配置

分类:Linux 评论: 0

集群管理中保证集群高可用的一个服务软件,用来防止单点故障。

负载高可用概述

什么是高可用

负载均衡器作为用户体验结构中最重要的一环,负责用户请求的分发。因此一旦宕机导致的后果很严重,因此需要最高程度上保证负载均衡器的可用性。一般采用双机或者多机热备,这些机器上配置的服务完全相同,可以保证随时接管负载主机的业务。

什么场景使用

需要最大限度保证服务不宕机的场景,如:金融、支付、服务类网站。这类场景下都适用负载均衡的高可用配置。


配置高可用

本文演示环境为两台机器作为主从配置,更多数量操作步骤雷同。

环境准备

服务器 角色 IP 主机名
Node 1 MASTER 192.168.1.5 lb01
Node 2 SLAVE 192.168.1.6 lb02

本文使用发行版为 CentOS 7,其他系统请替换相关命令语句。

安装 Keepalived 环境

在每台机器上都进行操作

# yum install keepalived -y

配置 Keepalived 环境

配置主负载(MASTER)

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {     
    router_id lb01   
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 50
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
}
    virtual_ipaddress {
        192.168.1.3/24 dev eth0
    }
}

小贴士:virtual_ipaddress 为虚拟 IP,是生成负载主从关系后的IP,请选择一个贴近负载并且没有被占用的地址。

配置从负载(SLAVE)

[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 {
        192.168.1.3/24 dev eth0
    }
}

小贴士:state 配置了主从关系 interface 配置了挂载网卡 ````

配置参数说明:

键值 说明 注意事项
state 主从角色 只能存在一主
interface 挂载网卡 仅可使用外网网卡
virtual_router_id 虚拟标识符 保持一致
priority 优先级 主大于从

启动 Keepalived 服务

在每台机器上进行操作

# systemctl enable keepalived
# systemctl start keepalived

检查服务运行状态

测试 Keepalive 工作是否正常

检查主地址

[root@lb01 ~]# ip addr | grep 192.168.1.3
    inet 192.168.1.3/24 scope global secondary eth0

提示:正常应该会有输出信息。

检查从地址

[root@lb02 ~]# ip addr | grep 192.168.1.3

提示:正常不会有输出信息。

可以看到目前主机生效,正在工作。

模拟故障

停止主机上的 keepalived , 检查虚拟地址是否存在。

[root@lb01 ~]# systemctl stop keepalived
[root@lb01 ~]# ip addr | grep 192.168.1.3

可以看到虚拟地址已经消失,接下来检查从机。

[root@lb02 ~]# ip addr | grep 192.168.1.3
    inet 192.168.1.3/24 scope global secondary eth0

高可用脑裂

“脑裂”概念

在涉及到高可用性时,经常会听到“脑裂”,到底什么是“脑裂”?

简而言之:当两(多)个节点同时认为自已是唯一处于活动状态的服务器从而出现争用资源的情况,这种争用资源的场景即是所谓的“脑裂”(split-brain)或“区间集群”(partitioned cluster)。

如何解决“脑裂”

可以在从机(SLAVE)上设置检测脚本,实时监测主从状态,出现脑裂立即解决。

[root@lb02 ~]# cat > check_split_brain.sh <<'EOF'
#!/bin/sh
virtual_ip=192.168.1.3
master_ip=192.168.1.5
while true;do
    ping -c 2 -W 3 $master_ip &>/dev/null
    if [ $? -eq 0 -a `ip a | grep "$virtual_ip" | wc -l` -eq 1 ];then
        echo "Split brain"
    else
        echo "Nothing Happen"
    fi
sleep 5
done
EOF

如果 HTTP 服务宕机, 会导致用户请求失败, 但 Keepalived 并不会进行切换, 所以需要编写一个脚本检测服务存活状态, 如果不存活则杀掉服务以进行地址漂移。

# cat > check_web.sh <<'EOF'
#!/bin/sh
while true
do
NGINX_PID=$(ps -C nginx --no-header | wc -l)
if [ $NGINX_PID -eq 0 ];then
    systemctl start nginx
    sleep 5
    NGINX_PID=$(ps -C nginx --no-header | wc -l)
    if [ $NGINX_PID -eq 0 ];then
        systemctl stop keepalived
        exit 1
    fi
fi
    sleep 5
done

脚本授权

# chmod a+x *.sh

在 keepalived 配置文件中调用此脚本,主从都需要进行操作。

# cat /etc/keepalived/keepalived.conf
global_defs {
         router_id LVS_01
      }
vrrp_script check_web {
   script "/server/scripts/check_web.sh"
   interval 2
   weight 50
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.3/24 dev eth0
    }
    track_script {
        check_web
    }
}

参考链接

回复