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、启动

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      # 如果条件成立,权重-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
    }
}

查看 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、自动检测 nginx_check.sh

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

#!/bin/bash

A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then

   echo `date`':  nginx is not healthy, try to killall keepalived' >> /etc/keepalived/keepalived.log
   systemctl stop keepalived
fi

6、两台机器开启防火墙 

#增加ant表链
*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

测试

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

Keepalived 实现 Nginx 高可用_高可用

此时尝试 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

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

Keepalived 实现 Nginx 高可用_其他_02