阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Keepalived+Nginx实现高可用(HA)

233次阅读
没有评论

共计 4334 个字符,预计需要花费 11 分钟才能阅读完成。

keepalived 的 HA 分为抢占模式和非抢占模式,抢占模式即 MASTER 从故障中恢复后,会将 VIP 从 BACKUP 节点中抢占过来。非抢占模式即 MASTER 恢复后不抢占 BACKUP 升级为 MASTER 后的 VIP。下面分别介绍 CentOS7 下抢占模式和非抢占模式的配置方式:

1、方案规划

VIP IP 主机名 Nginx 端口
192.168.1.210 192.168.1.201 nginx-01 80
192.168.1.210 192.168.1.202 nginx-02 80

两台服务器的 VIP 为:192.168.1.210

分别在两台 WEB 服务器安装 nginx 和 keepalived:
1、安装 Nginx,请参考《Nginx 源码安装 http://www.linuxidc.com/Linux/2017-02/140418.htm》
2、安装 Keepalived,请参考《Keepalived 安装与配置 http://www.linuxidc.com/Linux/2017-02/140421.htm》
3、防火墙添加 arrp 组播规则,或关闭防火墙
1> iptables

shell> vi /etc/sysconfig/iptables  
-A INPUT -p vrrp -d 224.0.0.18/32 -j ACCEPT

2> firewall

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp4s0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload

4、关闭 selinux

shell> vi /etc/sysconfig/selinux
# 修改:
SELINUX=disabled
#setenforce 0

2、抢占模式配置

编辑 /etc/keepalived/keepalived.conf 配置文件

1> MASTER(192.168.1.201):

global_defs {router_id nginx_01  # 标识本节点的名称,通常为 hostname
}

## keepalived 会定时执行脚本并对脚本执行的结果进行分析, 动态调整 vrrp_instance 的优先级。
## 如果脚本执行结果为 0, 并且 weight 配置的值大于 0, 则优先级相应的增加。如果脚本执行结果非 0,
## 并且 weight 配置的值小于 0, 则优先级相应的减少。其他情况, 维持原本配置的优先级, 即配置文件中 priority 对应的值。
vrrp_script chk_nginx {script "/etc/keepalived/nginx_check.sh"
       interval 2  # 每 2 秒检测一次 nginx 的运行状态
       weight -20  # 失败一次,将自己的优先级 -20
}

vrrp_instance VI_1 {state MASTER                  # 状态,主节点为 MASTER,备份节点为 BACKUP
    interface enp0s3              # 绑定 VIP 的网络接口,通过 ifconfig 查看自己的网络接口
    virtual_router_id 51          # 虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一段使用, 相同的 VRID 为一个组, 他将决定多播的 MAC 地址
    mcast_src_ip 192.168.1.201    # 本机 IP 地址
    priority 100                  # 节点优先级,值范围 0~254,MASTER 要比 BACKUP 高
    advert_int 1                  # 组播信息发送时间间隔,两个节点必须设置一样,默认为 1 秒
    # 设置验证信息,两个节点必须一致
    authentication {auth_type PASS
        auth_pass 1111
    }
    # 虚拟 IP,两个节点设置必须一样。可以设置多个,一行写一个
    virtual_ipaddress {192.168.1.210
    }

    track_script {chk_nginx  # nginx 存活状态检测脚本
    }
}

2> BACKUP(192.168.1.202)

global_defs {router_id nginx_02}

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

vrrp_instance VI_1 {
    state BACKUP
    interface enp0s3
    virtual_router_id 51
    mcast_src_ip 192.168.1.202
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {192.168.1.210}

    track_script {chk_nginx}
}

3> 创建 nginx 服务检测脚本

分别在主备服务器 /etc/keepalived 目录下创建 nginx_check.sh 脚本,并为其添加执行权限chmod +x /etc/keepalived/nginx_check.sh。用于 keepalived 定时检测 nginx 的服务状态,如果 nginx 停止了,会尝试重新启动 nginx,如果启动失败,会将 keepalived 进程杀死,将 vip 漂移到备份机器上。

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [$A -eq 0 ];then
    /opt/nginx/sbin/nginx # 尝试重新启动 nginx
    sleep 2  # 睡眠 2 秒
    if [`ps -C nginx --no-header | wc -l` -eq 0 ];then
        killall keepalived # 启动失败,将 keepalived 服务杀死。将 vip 漂移到其它备份节点
    fi
fi

4> 启动 keepalived 服务

shell> service keepalived start
shell> ps -ef | grep keepalived
[root@localhost ~]# ps -ef | grep keepalived
root       865     1  0 23:36 ?        00:00:00 keepalived -D
root       869   865  0 23:36 ?        00:00:00 keepalived -D
root       870   865  0 23:36 ?        00:00:00 keepalived -D

如果看到如上进程信息,表示 keepalived 已经启动成功。下面用 ip add 命令查看 vip 绑定的情况,如下图所示:
Keepalived+Nginx 实现高可用(HA)
从上图可以看出,vip 地址 192.168.1.210 绑定在 MASTER(192.168.1.201)的 enp0s3 网卡上。

5> 测试故障转移

将 MASTER 上的 keepalived 停止,查看 vip 是否会漂移到 192.168.2.202 上。

停止 201 的 keepalived 服务:

shell> service keepalived stop
shell> ip addr

Keepalived+Nginx 实现高可用(HA)
从上图可以看出,vip 已经成功从 201 漂移到了 202。此时再将 201 的 keepalived 服务启动后,由于 201 是 MASTER,所以会将 202 的 VIP 抢占过来。

启动 201 的 keepalived 服务:

shell> service keepalived start

结���VIP 又回到了 201,如下图所示:
Keepalived+Nginx 实现高可用(HA)

3、非抢占模式

master 从故障中恢复后,不会抢占备份节点的 vip

1> MASTER(192.168.1.201):

global_defs {router_id nginx_01  #标识本节点的名称,通常为 hostname}

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

vrrp_instance VI_1 {
    state BACKUP                  
    interface enp0s3              
    virtual_router_id 51          
    mcast_src_ip 192.168.1.201    
    priority 100                  
    advert_int 1                  
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {192.168.1.210}

    track_script {chk_nginx  # nginx 存活状态检测脚本}
}

2> BACKUP(192.168.1.202)

global_defs {router_id nginx_02}

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

vrrp_instance VI_1 {
    state BACKUP
    interface enp0s3
    virtual_router_id 51
    mcast_src_ip 192.168.1.202
    priority 90
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {192.168.1.210}
    track_script {chk_nginx}
}

和非抢占模式的配置相比,只改了两个地方:
1> 在 vrrp_instance 块下两个节点各增加了 nopreempt 指令,表示不争抢 vip
2> 节点的 state 都为 BACKUP
两个 keepalived 节点都启动后,默认都是 BACKUP 状态,双方在发送组播信息后,会根据优先级来选举一个 MASTER 出来。由于两者都配置了 nopreempt,所以 MASTER 从故障中恢复后,不会抢占 vip。这样会避免 VIP 切换可能造成的服务延迟。

《Keepalived 权威指南》下载见 http://www.linuxidc.com/Linux/2012-05/60951.htm

Nginx+Keepalived 实现站点高可用  http://www.linuxidc.com/Linux/2016-12/137883.htm

Nginx+Keepalived 实现站点高可用(负载均衡)  http://www.linuxidc.com/Linux/2016-12/138221.htm

构建高可用集群 Keepalived+Haproxy 负载均衡 http://www.linuxidc.com/Linux/2016-12/138917.htm

CentOS6.5 下 Keepalived 高可用服务单实例配置 http://www.linuxidc.com/Linux/2016-12/138110.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-02/140422.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4334字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中