Keepalived 实现 Nginx 高可用

keepalived最初是为LVS负载均衡设计的,用来管理并监控LVS集群中各个节点的状态,后加入了实现高可用的VRRP功能。VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议,是为了解决静态路由中的单点故障问题,VRRP是一种基于优先级的竞选机制来完成处理,竞选出的主节点会一直发送广播包,备用节点一直监听这些广播包,当备用节点无法接受到主节点发出的广播包时就会再次竞选出一个新的主节点来提供服务,保证服务的高可用。

主机A: 192.168.1.72 (MASTER)
主机B: 192.168.1.73 (BACKUP)
虚拟IP: 192.168.1.100

需求:通过keepalived 实现主机A宕机后,主机B自动接管业务

1、两台机器需要安装 keepalived nginx

yum install keepalived -y

2、启动 keepalived

systemctl start keepalived

# keepalived正常运行后,会启动3个进程,其中一个是父进程,一个子进程,一个是vrrp子进程
ps -ef | grep keepalived
root       3039      1  0 10:27 ?        00:00:00 /usr/sbin/keepalived -D
root       3040   3039  0 10:27 ?        00:00:00 /usr/sbin/keepalived -D
root       3041   3039  0 10:27 ?        00:00:00 /usr/sbin/keepalived -D

3、MASTER 配置

vi /etc/keepalived/keepalived.conf

global_defs {
   router_id vm72            # 定义路由器标识信息,标识本节点的字符串,通常为hostname
}

# keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"     # 检测 nginx 状态的脚本路径
    interval 2               # 检测时间间隔
    weight -20               # 权重
}

vrrp_instance VI_1 {         # 定义实例
    state MASTER             # 状态参数 master/backup 仅表示说明,主节点为 MASTER
    interface ens33          # 与本机 IP 地址所在的网络接口相同
    virtual_router_id 51     # 虚拟路由的 ID 号, 两个节点设置必须一样
    priority 100             # 优先级决定是主还是备 --> 越大越优先,值范围 0-254
    advert_int 1             # 主备心跳通讯时间间隔,组播信息发送间隔,两个节点设置必须一样, 默认 1s
    authentication {         # 认证授权,设置验证信息,两个节点必须一致 
        auth_type PASS
        auth_pass 1111
    }

    # 将 track_script 块加入 instance 配置块 
    track_script {
        chk_nginx            # 执行 Nginx 监控的服务
    }

    virtual_ipaddress {
        192.168.1.100        # 虚拟VIP地址,允许多个
    }
}

4、BACKUP 配置

global_defs {
   router_id vm73
}

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

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_nginx
    }

    virtual_ipaddress {
        192.168.1.100
    }
}

(1)查看虚拟 ip

# 查看IP
[root@vm73 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:86:cf:b9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.73/24 brd 192.168.1.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.1.100/32 scope global ens33       # 出现虚拟地址
       valid_lft forever preferred_lft forever
    inet6 fe80::408a:3209:e8a5:2f1a/64 scope link 
       valid_lft forever preferred_lft foreve

 5、配置脚本

(1)vrrp_script中节点权重改变算法

        在Keepalived集群中,其实并没有严格意义上的主、备节点,虽然可以在 Keepalived 配置文件中设置state选项为MASTER状态,但是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的priority值,但并它并不控制所有节点的角色,另一个能改变节点角色的是在vrrp_script模块中设置的weight值,这两个选项对应的都是一个整数值,其中weight值可以是个负整数,一个节点在集群中的角色就是通过这两个值的大小决定的。

(2)不设置weight

        在vrrp_script模块中,如果不设置weight选项值,那么集群优先级的选择将由Keepalived配置文件中的priority值决定,而在需要对集群中优先级进行灵活控制时,可以通过在vrrp_script模块中设置weight值来实现。

(3)设置 weight,本例设置的是负数,采用第二种

        vrrp_script 里的script返回值为0时认为检测成功,其它值都会当成检测失败

        1、weight 为正时脚本检测成功时此weight会加到priority上,检测失败时不加

        主失败:

                主 priority < 从 priority + weight 时会切换

        主成功:

                主 priority + weight > 从 priority + weight 时,主依然为主

        2、weight 为负时,脚本检测成功时此weight不影响priority,检测失败时priority – abs(weight)

        主失败:

                主 priority – abs(weight) < 从priority 时会切换主从

        主成功:

                主 priority > 从priority 主依然为主

(4)主节点nginx宕机后,要想实现自动切换备节点,必须要先停止主节点的 keepalived 服务后,才会成功,所以通过脚本来实现一旦主节点 nginx 关闭后,keepalived 也自动关闭。

vim /etc/keepalived/nginx_check.sh

# 内容
#!/bin/bash

count = `ps -C nginx --no-header | wc -l`

if [ $count -eq 0 ];then
    echo `date`':  nginx is not healthy, try to killall keepalived' >> /etc/keepalived/keepalived.log
    systemctl stop keepalived
    exit 1
else
    exit 0
fi

6、两台机器开启防火墙 

# 增加nat表链
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -d 192.168.1.100/32 --dport 80 -j REDIRECT
COMMIT

7、测试

(1)访问虚拟IP 192.168.1.100,默认路由跳转到 主服务器192.168.1.72

(2)此时尝试 192.168.1.72上面的nginx停止服务

# 关闭nginx
[root@vm72 keepalived]# systemctl stop nginx

# 此时查看keepalived进程,也全部关闭了,说明脚本生效了
[root@vm72 keepalived]# ps -ef | grep keepalived
root       6580   2230  0 11:33 pts/0    00:00:00 grep --color=auto keepalived

(3)再次访问 192.168.1.100 此时自动切换到 192.168.1.73,至此,keepalived nginx 高可用成功

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值