侧边栏壁纸
博主头像
路小飞博主等级

行动起来,活在当下

  • 累计撰写 72 篇文章
  • 累计创建 12 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Keepalived

路小飞
2024-09-07 / 0 评论 / 0 点赞 / 47 阅读 / 28804 字

1. 简介

Keepalived 是 Linux 下一个轻量级别的高可用解决方案,可以实现服务或者网络的高可用。

Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,如果某个服务器节点出现故障,Keepalived将检测到后自动将节点从集群系统中剔除,而在故障节点恢复正常后,Keepalived又可以自动将此节点重新加入集群中,这些工作自动完成,不需要人工干预,需要人工完成的只是修复出现故障的节点

后来又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有高可用集群功能。

2. 工作原理

Keepalived 的核心原理是基于 VRRP 协议的高可用性解决方案,它通过主备选举和虚拟 IP 地址漂移,确保节点故障时服务不中断。同时,通过健康检查功能确保只有健康的节点才能参与主备切换,从而提高系统的可靠性。

2.1 VRRP (虚拟路由冗余协议)

VRRP 是 Keepalived 的核心组件,它用于实现多个服务器间的高可用性,确保当主节点故障时,备份节点能够无缝接管虚拟 IP 地址(VIP),保证服务的持续可用性。

  • 虚拟路由器(Virtual Router):一组运行 VRRP 的服务器构成了一个虚拟路由器,组内服务器分为主节点(Master)和备节点(Backup)。主节点负责绑定和响应虚拟 IP,备节点在主节点故障时接管虚拟 IP。
  • 优先级:每个节点都有一个优先级(1-254)。优先级最高的节点成为主节点,负责接管 VIP。备节点定期监听主节点的 VRRP 心跳包。如果备节点无法在指定时间内接收到主节点的心跳包,备节点会启动抢占,成为新的主节点,接管 VIP。
  • VRRP 心跳机制:主节点会定期发送 VRRP 广播信息,备节点接收并确认主节点的健康状态。心跳的频率和超时时间可以通过配置文件设置。
  • VIP 的漂移:主节点故障后,备节点会通过 ARP 通告来更新网络中的 ARP 表,使网络设备知道 VIP 已经漂移到新的主节点。

2.2 健康检查机制

Keepalived 除了 VRRP 外,还提供了健康检查功能,用于检测主备节点上运行的服务(如 Nginx、MySQL 等)是否处于正常状态。健康检查确保只有健康的节点才会参与 VRRP 选举,避免将流量路由到故障节点上。

  • 本地健康检查:Keepalived 可以通过配置文件中的脚本或命令,对本地的服务状态进行检查,例如 Nginx 是否正常运行。
  • 远程健康检查:可以配置基于 ICMP、TCP、HTTP 等协议的远程健康检查。Keepalived 会周期性地检查目标服务的可用性。
  • 自定义脚本:用户可以编写自定义脚本来定义检查条件,脚本会返回退出码,根据返回值判断服务状态。

3. 抢占与非抢占模式

3. 1 抢占模式

在默认的抢占模式下,优先级更高的节点会在恢复健康状态后重新夺回主节点的角色,接管虚拟 IP。这有助于确保高优先级节点(通常是性能更好的服务器)负责处理流量。

抢占式情况 1
当 server1 的优先级大于 server2 时,Keepalived 启动后,server1 成为 master,server2 自动降级为 backup。如果 server1 宕机,server2 接管服务。当 server1 恢复后,它会重新成为 master,接管服务,server2 再次变为 backup。

抢占式情况 2
当 server1 为 master,server2 为 backup,且 server1 的优先级高于 server2。Keepalived 启动后,server1 成为 master,server2 为 backup。如果 server1 宕机,server2 接管服务。server1 恢复后,它会重新抢占服务,恢复为 master,server2 则降级为 backup。

抢占式情况 3
当 server1 的优先级低于 server2 时,Keepalived 启动后,server2 成为 master,server1 为 backup。如果 server2 宕机,server1 会接管服务。当 server2 恢复后,它会再次抢占成为 master,server1 降级为 backup。

3.2 非抢占模式

在非抢占模式下,即使高优先级的节点恢复正常,也不会自动重新接管 VIP,除非当前的主节点故障。这种模式适用于避免频繁切换 VIP 的场景。

server1和server2都为backup,且配置nopreempt项。我们要注意启动server服务的启动顺序,先启动的升级为master,与优先级无关。如果 server1 宕机,server2 接管服务。当 server1 恢复后,它会成为 backup而非 master。

3. 案例

3.1 简介

环境

IP地址角色作用服务
192.168.17.190反向代理服务器(主)反向代理和负载均衡Nginx,Keepalived
192.168.17.191反向代理服务器(备)反向代理和负载均衡Nginx,Keepaliced
192.168.17.192Web服务器1Web服务器Nginx
192.168.17.193Web服务器2Web服务器Nginx
192.168.17.200VIP(虚拟IP)客户端访问入口IP配置在两台反向代理服务器上

3.2 实验过程

1. Web服务器

1.1 安装 Nginx

# 下载源码包后传输到机器上
tar -xf nginx-1.26.2.tar.gz 
useradd -r -s /sbin/nologin nginx

# 安装依赖 C语言编译器、加密软件包、压缩软件包、Perl语言正则表达式库
yum -y install gcc gcc-c++ openssl openssl-devel zlib zlib-devel pcre pcre-devel

cd /root/nginx-1.26.2
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-stream

make && make install

ln -s /usr/local/nginx/sbin/nginx /sbin/nginx
mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
vi /usr/local/nginx/conf/nginx.conf

nginx.conf

user  nginx;
worker_processes  auto;


pid        logs/nginx.pid;


events {
    worker_connections  10240;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html/memo_project;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

1.2 部署 Web 应用

该项目是个纯静态页面,源码在附录中

项目文件结构:

memo_project/
    ├── index.html
    ├── style.css
    └── script.js
mkdir /usr/local/nginx/html/memo_project
cd /usr/local/nginx/html/memo_project
将index.htm、style.css、script.js三个文件复制到当前目录下
chown -R nginx:nginx /usr/local/nginx/html/memo_project

#设置防火墙规则
iptables -I INPUT -p tcp -s 192.168.17.0/24 --dport 80 -j ACCEPT
2. 反向代理服务器

2.1 安装 Nginx

# 下载源码包后传输到机器上
tar -xf nginx-1.26.2.tar.gz 
useradd -r -s /sbin/nologin nginx

# 安装依赖 C语言编译器、加密软件包、压缩软件包、Perl语言正则表达式库
yum -y install gcc gcc-c++ openssl openssl-devel zlib zlib-devel pcre pcre-devel

cd /root/nginx-1.26.2
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-stream

make && make install

ln -s /usr/local/nginx/sbin/nginx /sbin/nginx
mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
vi /usr/local/nginx/conf/nginx.conf

#设置防火墙规则
iptables -I INPUT -p tcp -s 192.168.17.0/24 --dport 80 -j ACCEPT

nginx.conf

user  nginx;
worker_processes  auto;
pid        logs/nginx.pid;

events {
    worker_connections  10240;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;

    upstream backend {
        server 192.168.17.192:80;
        server 192.168.17.193:80;
    }
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
	    proxy_pass http://backend;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

3. 配置 Keepalived(代理服务器上)

keepalived官网:https://www.keepalived.org

#将官网下载的安装包传到服务器上,进行编译安装
tar -zxvf keepalived-2.0.20.tar.gz
mv keepalived-2.0.20 /usr/local/keepalived
cd /usr/local/keepalived/
./configure
make && make install

mkdir /etc/keepalived
cp /usr/local/keepalived/keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/sbin/keepalived /usr/sbin/

#关闭SElinux
sed -i '/SELINUX/ s/enforcing/disabled/g' /etc/selinux/config
#验证是否安装成功
[root@localhost init.d]# /etc/init.d/keepalived start
Starting keepalived (via systemctl):                       [  确定  ]

#此时虽然安装成功,但是配置文件未进行编辑,服务是无法启动的
[root@localhost init.d]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[root@localhost init.d]# keepalived -t
(Line 15) number '0' outside range [1e-06, 4294]
(Line 15) vrrp_garp_interval '0' is invalid
(Line 16) number '0' outside range [1e-06, 4294]
(Line 16) vrrp_gna_interval '0' is invalid
(Line 21) WARNING - interface eth0 for vrrp_instance VI_1 doesn't exist
(Line 30) Default interface eth0 doesn't exist for static address 192.168.200.16.
(Line 31) Default interface eth0 doesn't exist for static address 192.168.200.17.
(Line 32) Default interface eth0 doesn't exist for static address 192.168.200.18.
Non-existent interface specified in configuration

master配置文件

global_defs {               
    router_id Nginx_01
}
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 5
    weight -20
    fall 3
    rise 2
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33                #设置实例绑定的网卡
    mcast_src_ip 192.168.17.190    #广播的原地址(本机IP)
    virtual_router_id 51           #同一实例下virtual_router_id必须相同
    priority 110                   #设置优先级,优先级高的会被竞选为Master
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {            #设置VIP
     192.168.17.200
    }
    track_script {                 #设置追踪脚本
    	check_nginx
    }
}

backup配置文件

在备用nginx服务器192.168.17.191上,有三点不同,一点必须相同,1. router_id 不同, 2. state BACKUP不同 ,3. priority不同。 4.virtual_router_id 必相同。 配置如下:

global_defs {               
   router_id Nginx_02
}
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 5
    weight -20
    fall 3
    rise 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    mcast_src_ip 192.168.17.191
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
      192.168.17.200
    }
    track_script {
    	check_nginx
    }
}

/etc/keepalived/check_nginx.sh

#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/local/nginx/sbin/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        /etc/init.d/keepalived stop
        exit 1
    fi
fi

#启动服务
systemctl start keepalived
systemctl status keepalived
ip a

通过 IP 查询发现,此时 VIP 绑定在优先级高的机器上(192.168.17.190),浏览器访问 VIP 也能够访问到服务

[root@localhost keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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 group default qlen 1000
    link/ether 00:0c:29:aa:12:41 brd ff:ff:ff:ff:ff:ff
    inet 192.168.17.190/24 brd 192.168.17.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.17.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::71b8:266c:7bcf:5022/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::4d96:e5f1:682:f79b/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::6597:4e0d:79f9:f173/64 scope link tentative noprefixroute dadfaile 

4. 验证高可用行

客户端访问192.168.17.200(VIP),停掉 mastere (190)的 nginx 服务持续监测后端 web 服务器的日志

[root@localhost ~]# tail -f /usr/local/nginx/logs/access.log 
192.168.17.190 - - [07/Sep/2024:23:50:33 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0"
192.168.17.191 - - [08/Sep/2024:00:08:03 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0"

192.168.17.190 - - [08/Sep/2024:00:20:15 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0"

通过日志发现:

原本由代理服务器 190(主节点)向 Web 服务器发起请求。当 190 上的 Nginx 停止运行时,VIP 漂移至 191 接管流量。随后,当 190 的 Nginx 重启后,VIP 自动回迁至 190,恢复其主节点角色。

附录

master 启动日志
[root@localhost ~]# journalctl -u keepalived
-- Logs begin at 日 2024-09-08 00:36:00 CST, end at 日 2024-09-08 00:37:34 CST. --
9月 08 00:37:25 localhost.localdomain systemd[1]: Starting LVS and VRRP High Availability Monitor...
9月 08 00:37:25 localhost.localdomain Keepalived[1149]: Starting VRRP child process, pid=1150
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: Registering Kernel netlink reflector
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: Registering Kernel netlink command channel
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: Opening file '/etc/keepalived/keepalived.conf'.
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: SECURITY VIOLATION - scripts are being executed but script_security not enabled.
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: Assigned address 192.168.17.190 for interface ens33
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: Assigned address fe80::71b8:266c:7bcf:5022 for interface ens33
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: Registering gratuitous ARP shared channel
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: (VI_1) removing VIPs.
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: (VI_1) Entering BACKUP STATE (init)
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: VRRP sockpool: [ifindex(2), family(IPv4), proto(112), unicast(0), fd(11,12)]
9月 08 00:37:25 localhost.localdomain systemd[1]: Started LVS and VRRP High Availability Monitor.
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: VRRP_Script(check_nginx) succeeded
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: (VI_1) Receive advertisement timeout
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: (VI_1) Entering MASTER STATE
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: (VI_1) setting VIPs.
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: Sending gratuitous ARP on ens33 for 192.168.17.200
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.17.200
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: Sending gratuitous ARP on ens33 for 192.168.17.200
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: Sending gratuitous ARP on ens33 for 192.168.17.200
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: Sending gratuitous ARP on ens33 for 192.168.17.200
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: Sending gratuitous ARP on ens33 for 192.168.17.200
9月 08 00:37:34 localhost.localdomain Keepalived_vrrp[1150]: Sending gratuitous ARP on ens33 for 192.168.17.200
9月 08 00:37:34 localhost.localdomain Keepalived_vrrp[1150]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.17.200
9月 08 00:37:34 localhost.localdomain Keepalived_vrrp[1150]: Sending gratuitous ARP on ens33 for 192.168.17.200
9月 08 00:37:34 localhost.localdomain Keepalived_vrrp[1150]: Sending gratuitous ARP on ens33 for 192.168.17.200
9月 08 00:37:34 localhost.localdomain Keepalived_vrrp[1150]: Sending gratuitous ARP on ens33 for 192.168.17.200
9月 08 00:37:34 localhost.localdomain Keepalived_vrrp[1150]: Sending gratuitous ARP on ens33 for 192.168.17.200

  1. Keepalived 服务启动
9月 08 00:37:25 localhost.localdomain systemd[1]: Starting LVS and VRRP High Availability Monitor...
  • 说明:系统启动了 Keepalived 服务,该服务负责 LVS 和 VRRP 高可用性监控。
  1. VRRP 子进程启动
9月 08 00:37:25 localhost.localdomain Keepalived[1149]: Starting VRRP child process, pid=1150
  • 说明:Keepalived 启动了 VRRP 子进程(进程号 1150),这个进程负责处理 VRRP 协议。
  1. 加载配置文件并注册内核通道
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: Opening file '/etc/keepalived/keepalived.conf'.
  • 说明:Keepalived 正在加载其配置文件,以配置虚拟路由冗余协议(VRRP)和虚拟 IP 地址(VIP)。
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: Registering Kernel netlink reflector
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: Registering Kernel netlink command channel
  • 说明:Keepalived 注册了内核的 Netlink 反射器和命令通道,用于与操作系统通信以管理网络配置。
  1. 检测到安全问题
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: SECURITY VIOLATION - scripts are being executed but script_security not enabled.
  • 说明:Keepalived 检测到有脚本正在运行,但 script_security 没有启用。这是一项安全警告,建议在配置文件中启用 script_security 来确保脚本的安全执行。
  1. 初始化接口地址并进入备份状态
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: Assigned address 192.168.17.190 for interface ens33
9月 08 00:37:25 localhost.localdomain Keepalived_vrrp[1150]: (VI_1) Entering BACKUP STATE (init)
  • 说明:系统为网络接口 ens33 分配了地址 192.168.17.190,并初始化为备份(BACKUP)状态。
  1. 检测 VRRP 广告包超时并进入主状态
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: (VI_1) Receive advertisement timeout
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: (VI_1) Entering MASTER STATE
  • 说明:当前节点没有收到其他节点的 VRRP 广告包,超时后决定成为主节点,进入主状态。
  1. 设置虚拟 IP 并发送 Gratuitous ARP
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: (VI_1) setting VIPs.
9月 08 00:37:29 localhost.localdomain Keepalived_vrrp[1150]: Sending gratuitous ARP on ens33 for 192.168.17.200
  • 说明:Keepalived 设置了虚拟 IP 地址 192.168.17.200 并向网络中的其他设备发送 Gratuitous ARP 通告,以更新网络中的 ARP 表,确保其他设备知道 VIP 的位置。
  1. 多次发送 Gratuitous ARP
9月 08 00:37:34 localhost.localdomain Keepalived_vrrp[1150]: Sending gratuitous ARP on ens33 for 192.168.17.200
  • 说明:Keepalived 继续多次发送 Gratuitous ARP,确保 VIP 的所有权在网络中得到更新。
VIP 漂移日志解读
9月 08 00:09:12 localhost.localdomain Keepalived_vrrp[1147]: Script `check_nginx` now returning 1
9月 08 00:09:22 localhost.localdomain Keepalived_vrrp[1147]: VRRP_Script(check_nginx) failed (exited with status 1)
9月 08 00:09:22 localhost.localdomain Keepalived_vrrp[1147]: (VI_1) Changing effective priority from 110 to 90
9月 08 00:09:25 localhost.localdomain Keepalived_vrrp[1147]: (VI_1) Master received advert from 192.168.17.191 with higher priority 100, ours 90
9月 08 00:09:25 localhost.localdomain Keepalived_vrrp[1147]: (VI_1) Entering BACKUP STATE
9月 08 00:09:25 localhost.localdomain Keepalived_vrrp[1147]: (VI_1) removing VIPs.
9月 08 00:17:42 localhost.localdomain Keepalived_vrrp[1147]: Script `check_nginx` now returning 0
9月 08 00:17:45 localhost.localdomain Keepalived_vrrp[1147]: VRRP_Script(check_nginx) succeeded
9月 08 00:17:45 localhost.localdomain Keepalived_vrrp[1147]: (VI_1) Changing effective priority from 90 to 110
9月 08 00:17:46 localhost.localdomain Keepalived_vrrp[1147]: (VI_1) received lower priority (100) advert from 192.168.17.191 - discarding
9月 08 00:17:47 localhost.localdomain Keepalived_vrrp[1147]: (VI_1) received lower priority (100) advert from 192.168.17.191 - discarding
ost.localdomain Keepalived_vrrp[1147]: (VI_1) received lower priority (100) advert from 192.168.17.191 - discarding
9月 08 00:17:48 localhost.localdomain Keepalived_vrrp[1147]: (VI_1) Receive advertisement timeout
9月 08 00:17:48 localhost.localdomain Keepalived_vrrp[1147]: (VI_1) Entering MASTER STATE
9月 08 00:17:48 localhost.localdomain Keepalived_vrrp[1147]: (VI_1) setting VIPs.
9月 08 00:17:48 localhost.localdomain Keepalived_vrrp[1147]: Sending gratuitous ARP on ens33 for 192.168.17.200

这段日志展示了 Keepalived 在两个节点之间 VIP 漂移的过程,反映了主备状态切换以及 Nginx 服务的健康检查。以下是对各个日志片段的详细解读:

  1. Nginx 服务检测失败,优先级下降
9月 08 00:09:12 Keepalived_vrrp[1147]: Script `check_nginx` now returning 1
9月 08 00:09:22 Keepalived_vrrp[1147]: VRRP_Script(check_nginx) failed (exited with status 1)
  • 说明:Keepalived 执行了 check_nginx 脚本,该脚本返回状态码 1,表示 Nginx 服务不可用。
  • 原因:此时可能是 Nginx 服务宕机,或者健康检查脚本检测到 Nginx 状态异常。
9月 08 00:09:22 Keepalived_vrrp[1147]: (VI_1) Changing effective priority from 110 to 90
  • 说明:由于健康检查脚本失败,Keepalived 将节点的优先级从 110 降低到 90。这是 Keepalived 的正常行为,当主节点的健康检查失败时,它会通过降低优先级来触发备份节点接管 VIP。
  1. 收到备份节点的高优先级广告包,进入备份状态
9月 08 00:09:25 Keepalived_vrrp[1147]: (VI_1) Master received advert from 192.168.17.191 with higher priority 100, ours 90
9月 08 00:09:25 Keepalived_vrrp[1147]: (VI_1) Entering BACKUP STATE
  • 说明:当前节点(IP: 192.168.17.190)检测到备份节点(IP: 192.168.17.191)发送了更高优先级的广告包,表示备份节点准备接管 VIP。因此,当前节点进入备份状态。
9月 08 00:09:25 Keepalived_vrrp[1147]: (VI_1) removing VIPs.
  • 说明:当前节点开始移除虚拟 IP 地址(VIP),让位给备份节点接管服务。
  1. Nginx 服务恢复,优先级上升
9月 08 00:17:42 Keepalived_vrrp[1147]: Script `check_nginx` now returning 0
9月 08 00:17:45 Keepalived_vrrp[1147]: VRRP_Script(check_nginx) succeeded
  • 说明:check_nginx 脚本再次执行,并返回状态码 0,表明 Nginx 服务已经恢复正常。
9月 08 00:17:45 Keepalived_vrrp[1147]: (VI_1) Changing effective priority from 90 to 110
  • 说明:随着 Nginx 的恢复,Keepalived 将主节点的优先级从 90 恢复为 110,准备重新接管 VIP。
  1. 主节点重新接管 VIP,进入主节点状态
9月 08 00:17:46 Keepalived_vrrp[1147]: (VI_1) received lower priority (100) advert from 192.168.17.191 - discarding
  • 说明:当前主节点接收到了来自备份节点(192.168.17.191)的广告包,但优先级较低(100),因此忽略了这些广告包,表示当前节点仍然是主节点。
9月 08 00:17:48 Keepalived_vrrp[1147]: (VI_1) Entering MASTER STATE
9月 08 00:17:48 Keepalived_vrrp[1147]: (VI_1) setting VIPs.
  • 说明:当前节点(192.168.17.190)重新进入主节点状态并设置虚拟 IP 地址(VIP)。
9月 08 00:17:48 Keepalived_vrrp[1147]: Sending gratuitous ARP on ens33 for 192.168.17.200
  • 说明:为了通知网络中其他设备,主节点向网络接口 ens33 发送 Gratuitous ARP(免费 ARP),声明自己重新绑定了 VIP 192.168.17.200。
keepalived 配置文件详解
#全局配置
global_defs {
   # 邮件通知信息
   notification_email {
     # 定义收件人
     acassen@firewall.loc
   }
   # 定义发件人
   notification_email_from Alexandre.Cassen@firewall.loc
   # SMTP服务器地址
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
   router_id LVS_DEVEL
   # VRRP的ipv4和ipv6的广播地址,配置了VIP的网卡向这个地址广播来宣告自己的配置信息,下面是默认值
   vrrp_mcast_group4 224.0.0.18
   vrrp_mcast_group6 ff02::12
}

# 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换
vrrp_script SCRIPT_NAME {

}

# 一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance VI_1 {
    # 定义初始状态,可以是MASTER或者BACKUP
    state MASTER
    # 工作接口,通告选举使用哪个接口进行
    interface ens33
    # 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
    # ID还是虚拟MAC最后一段地址的信息,取值范围0-255
    virtual_router_id 51
    # 使用哪个虚拟MAC地址
    use_vmac XX:XX:XX:XX:XX
    # 监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
    track_interface {
        eth0
        ens33
    }
    # 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
    priority 100
    # 通告频率,单位为秒
    advert_int 1
    # 通信认证机制,这里是明文认证还有一种是加密认证
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了
    virtual_ipaddress {
        # IP/掩码 dev 配置在哪个网卡
        192.168.200.16/24 dev eth1
        # IP/掩码 dev 配置在哪个网卡的哪个别名上
        192.168.200.17/24 dev label eth1:1
    }
    # 虚拟路由,在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去
    virtual_routes {
        192.168.110.0/24 dev eth2
    }
    # 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
    nopreempt|preempt
    # 如果是抢占默认则可以设置等多久再抢占,默认5分钟
    preempt delay 300
    # 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
    track_script {

    }
    # 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
    notify_master ""
    notify_backup ""
    notify_fault ""
}

# 定义LVS集群服务,可以是IP+PORT;也可以是fwmark 数字,也就是防火墙规则
# 所以通过这里就可以看出来keepalive天生就是为ipvs而设计的
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    # 算法
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh 
    # LVS的模式
    lb_kind NAT|DR|TUN
    # 子网掩码,这个掩码是VIP的掩码
    nat_mask 255.255.255.0
    # 持久连接超时时间
    persistence_timeout 50
    # 定义协议
    protocol TCP
    # 如果后端应用服务器都不可用,就会定向到那个服务器上
    sorry_server 192.168.200.200 1358

    # 后端应用服务器 IP PORT
    real_server 192.168.200.2 1358 {
        # 权重
        weight 1
        # MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET这些都是
        # 针对应用服务器做健康检查的方法
        MISC_CHECK {}
        # 用于检查SMTP服务器的
        SMTP_CHEKC {}

        # 如果应用服务器不是WEB服务器,就用TCP_CHECK检查
        TCP_CHECK {
          # 向哪一个端口检查,如果不指定默认使用上面定义的端口
          connect_port <PORT>
          # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
          bindto <IP>
          # 连接超时时间
          connect_timeout 3
        }

        # 如果对方是HTTPS服务器就用SSL_GET方法去检查,里面配置的内容和HTTP_GET一样
        SSL_GET {}

        # 应用服务器UP或者DOWN,就执行那个脚本
        notify_up "这里写的是路径,如果脚本后有参数,整体路径+参数引起来"
        notify_down "/PATH/SCRIPTS.sh 参数"

        # 使用HTTP_GET方法去检查
        HTTP_GET {
            # 检测URL
            url { 
              # 具体检测哪一个URL
              path /testurl/test.jsp
              # 检测内容的哈希值
              digest 640205b7b0fc66c1ea91c463fac6334d
              # 除了检测哈希值还可以检测状态码,比如HTTP的200 表示正常,两种方法二选一即可
              status_code 200
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            # 向哪一个端口检查,如果不指定默认使用上面定义的端口
            connect_port <PORT>
            # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
            bindto <IP>
            # 连接超时时间
            connect_timeout 3
            # 尝试次数
            nb_get_retry 3
            # 每次尝试之间间隔几秒
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

Ref:Linux搭建nginx+keepalived 高可用(主备+双主模式)_nginx+keepalived需要几台机器-CSDN博客

0

评论区