【Linux-云原生-笔记】keepalived相关

一、概念

Keepalived 是一个用 C 语言编写的、轻量级的高可用性和负载均衡解决方案软件。 它的主要目标是在基于 Linux 的系统上提供简单而强大的故障转移 功能,并可以结合 Linux Virtual Server 提供负载均衡


1、Keepalived 主要提供两大功能:

  1. 高可用性:

    • 原理: 基于 VRRP 协议

    • 工作方式:

      • 一组服务器(通常是两台或更多)运行 Keepalived 守护进程,形成一个 VRRP 实例

      • 这些服务器被配置为拥有一个或多个共享的虚拟 IP 地址。这个 VIP 是客户端实际访问的 IP 地址。

      • 其中一台服务器被选举为 MASTER ,其他服务器处于 BACKUP 状态。

      • MASTER 节点

        • 持有共享的 VIP。

        • 定期发送 VRRP 通告给组内的其他节点,宣告自己还活着。

        • 负责处理所有发送到该 VIP 的流量。

      • BACKUP 节点

        • 监听 MASTER 发来的 VRRP 通告。

        • 如果在一段时间内(advert_int 间隔 + 超时时间)没有收到 MASTER 的通告,BACKUP 节点会认为 MASTER 发生了故障。

        • 此时,优先级最高的 BACKUP 节点会发起选举,将自己提升为新的 MASTER,并通过 ARP 广播宣告自己接管了 VIP。

      • 故障转移: 这个过程实现了自动故障转移。当主服务器宕机时,备份服务器几乎可以瞬间(毫秒级)接管 VIP 和服务,对客户端来说服务几乎是连续的(短暂中断或 TCP 重连)。

    • 优势: 简单、高效、切换速度快。

  2. 负载均衡:

    • 原理: 集成并管理 LVS

    • 工作方式:

      • Keepalived 自身不直接处理负载均衡流量

      • 它利用 Linux 内核的 LVS 框架来实现第四层(传输层,如 TCP/UDP)的负载均衡。

      • Keepalived 负责:

        • 配置 LVS 规则: 在 MASTER 节点上,根据配置文件自动设置 LVS 的虚拟服务器、后端真实服务器池、调度算法(如轮询 rr、加权轮询 wrr、最少连接 lc 等)和健康检查机制。

        • 管理 LVS 状态: 当发生主备切换时,新的 MASTER 会接管并重新配置 LVS 规则,确保负载均衡服务不中断。

        • 健康检查: 对后端真实服务器进行健康检查(支持 TCP_CHECK, HTTP_GET, SSL_GET, MISC_CHECK 等多种方式)。如果检测到某个真实服务器故障,Keepalived 会将其从 LVS 池中移除;当服务器恢复时,再将其添加回来。

      • 架构: Keepalived 节点(运行 VRRP 的 MASTER)通常作为 LVS Director ,接收客户端请求,并根据调度算法将请求转发给后端的 Real Servers。客户端访问的是 Keepalived 节点持有的 VIP。


2、主要配置文件

  • /etc/keepalived/keepalived.conf: 核心配置文件,包含:

    • global_defs:全局配置(如通知邮件)。

    • vrrp_script:定义用于跟踪接口或进程状态的自定义脚本。

    • vrrp_instance:定义 VRRP 实例(组 ID、虚拟路由器 ID、状态、优先级、认证、VIP 等)。

    • virtual_server:定义 LVS 虚拟服务器(VIP + 端口)及关联的后端真实服务器池、调度算法和健康检查配置。

二、实验

1、前期的配置与安装

安装keepalived

安装完后,先修改配置文件:

注意:interface那一行是写你的网卡名字,可以ip a查看,写错了的话服务是起不来的

其后面的所有都注释

wq保存

测试

2、独立keepalived日志

将 Keepalived 日志从系统日志(如 /var/log/messages)中分离出来,是生产环境运维的关键实践。

必配独立日志的四大场景

场景 问题 独立日志价值
高频健康检查 日志淹没系统日志,掩盖关键告警 避免 syslog 洪泛,精准定位问题
多节点集群排错 跨服务器查日志效率低下 单节点完整日志流,加速故障定位
安全审计合规 混合日志无法满足等保要求 独立存储VIP切换记录,满足审计追溯
性能瓶颈分析 无法统计VRRP报文延迟 记录毫秒级事件,定位网络抖动

(1)配置独立

(2)测试

先连通测试,再查看日志

这就是独立keepalived日志

3、独立子配置文件

当生产环境复杂时, /etc/keepalived/keepalived.conf 文件中内容过多,不易管理

将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中利用include 指令可以实现包含子配置文件

在 Keepalived 中配置独立子配置文件是管理复杂架构的核心实践,主要解决以下五大场景的配置痛点:

1. 多 VIP 多业务隔离

场景:单服务器承载多个业务(如 Web/DB 服务),需绑定不同 VIP

2. 多 VRRP 实例(双主/多主)

场景:实现双活架构(如跨机房双主)

3. 差异化健康检查策略

场景:不同业务需要独立检测机制

4. 环境差异化配置(开发/生产)

场景:不同环境使用不同检测阈值

5. 团队协作与权限分离

场景:网络团队管理 VIP,业务团队管理健康检查


子配置文件核心优势

优势 说明
故障隔离 单配置错误不会导致整个 keepalived 崩溃
部署效率提升 增删 VIP 只需操作独立文件,无需解析主配置
版本控制友好 可独立对 db_vip.conf 进行 Git 管理,不影响其他配置
动态加载 支持 reload 时热加载变更(需主配置开启 enable_dynamic_reload
安全审计 精细化监控关键配置变更(如 VIP 绑定)

(1)配置独立

设置KA1的配置文件

建立一个接收.conf文件的文件

进配置文件,把include下面的这一段(红框框住的)复制,然后删除(目的是为了设置独立子配置文件)

粘贴到这个里面:

这样就配置了独立子配置文件

(2)还原实验环境

把刚刚更改的全部还原(为了后续实验方便)

全部隐掉

还原完重启

这样就没啥问题了,还原成功

4、延迟抢占

Keepalived 的 延迟抢占(Delayed Preemption) 是一种精细化的故障恢复控制策略,用于解决主节点故障恢复后 立即切换(抢占) 可能引发的服务抖动问题。

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回VIP


1. 抢占(Preemption)
  • 定义 :高优先级节点恢复后,立即夺回 Master 角色。

  • 风险:若服务尚未完全启动,立即切换会导致二次中断。

2. 延迟抢占
  • 核心思想 :节点恢复后,等待指定时间再发起抢占,确保服务就绪。

  • 价值:提升故障恢复的平滑性。

(1)设置配置

两台KA都做

都设置成BACKUP,非抢占模式

(2)测试

先关闭KA1的keepalived服务

然后开个监视器,监视KA2的变化

目前的监视器是这样:

然后开多个窗口,在KA2上测试

可以发现在KA1关闭的情况下,KA2正在承接服务(都是60)

这时我们再开启KA1的keepalived服务

可以发现监视器变化了

可以看到,10秒过后(即刚刚设定的延迟抢占)由60变成50了,即KA2变成KA1

这就是延迟抢占

5、组播变单播

默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量

(1)还原实验环境

KA2保持不变,就删掉延迟抢占


(2)设置单播

KA1与KA2设置单播:

KA1:

KA2:

注意KA1与2ip不同,请注意

(3)测试

由此,组播变单播

6、邮箱配置

当keepalived的状态变化时,可以自动触发脚本的执行

所以我们做一个综合实验,此实验目的是在两台KA切换主备、或者开启停运时,通过邮箱来通知我们,告知我们他们的模式变化

(1)实验

主机名设置成这种

解释:

  • set smtp=smtp.163.com ------ 这里的163是因为博主的邮箱是网易的,如果你的是别的,如qq,那就写smtp.qq.com,其他邮箱类似
  • set smtp-auth=login ------ 登录
  • set smtp-auth-user=XXX@163.com ------ 这里输入自己的邮箱
  • set smtp-auth-password=ABCDEFG1234567 ------ 这里的码是你自己的邮箱stmp认证得到的码,待会详细说明怎么获得这个码
  • set from=XXX@163.com ------ 这里输入自己的邮箱
  • set ssl-verify=ignore ------ 忽略认证

如何获取stmp认证得到的码?(以网易为例)

网页登录你的邮箱官网,点设置里的这个:

点开启,这里博主启动过了,所以显示的是关闭,你们开启上面的那个IMAP/SMTP的,不是红框的那个

然后安装他的提示继续

之后就是输入验证码那些,完成后就会出现那个码了,复制到文件里

(3)测试

然后在自己的邮箱里找未读

测试成功

(4)实战例子:实现keepalived状态切换的通知邮箱脚本

进入输入这些:

复制代码
#!/bin/bash
mail_dest='XXX@163.com'

mail_send()
{
    mail_subj="$HOSTNAME to be $1 vip 转移"
    mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"
    echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 in
    master)
    mail_send master
    ;;
    backup)
    mail_send backup
    ;;
    fault)
    mail_send fault
    ;;
    *)
    exit 1
    ;;
esac

添加可执行权限

设完成之后,就会发现邮箱立马收到了邮件:

说明成功了,每当服务器主备转换,还有开启停机时,都会收到邮件


这个实验完成后,建议把设置还原:

7、RS的初步配置

我们介绍完了keepalived的基础,准备开始搞Real Server的配置,且为了后面的实验,我们也要把RS做了

(1)添加新ip

两个RS都做:


(2)配置KA1/2

两个KA都要做:

安装ipvsadm(两台KA都要)

复制代码
virtual_server 172.25.254.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP

    real_server 172.25.254.10 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            retry 3
            delay_before_retry 3
        }
    }

    real_server 172.25.254.20 80 {
        weight 1
        TCP_CHECK {

            connect_timeout 2
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

这样就有策略了

(3)测试

在KA1查看一下:

可以看到KA1是100ip的主,KA2是备

我们现在停掉KA1的keepalived,看它会不会自动转到KA2这个备上:

可以看到100ip已经从KA1转移到KA2这个备了

8、双主架构

(1)概念

"双主"(Dual-Master)在技术领域通常指两种不同场景的高可用架构,需根据上下文区分理解。


master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。

master/master 的双主架构:

即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高服务器资源利用率

(2)实验

我们做的是双主组播,所以

关掉单播

复制多一份上面的模板,改变这些:

让KA1做DBVIP的BACKUP

KA2是DBVIP的master:

(3)测试

在KA2上看,就能发现另一个组播,这就是双主

如果我们把KA2的keepalived关掉

那么就会变成KA1为MASTER:

测试成功

(4)数据库mariadb的双主实验

1)两台RS配置新的ip与启动mariadb服务

两台RS都要做,配置命令相同


然后开启两台RS的mariadb服务,最好systemctl status查看一下mariadb的服务是否开启

两台RS都做,配置命令相同

再搞个开机自启

两台RS都做,配置命令相同

2)两台KA配置数据库双主

两台KA都要做,配置命令相同

检测一遍,然后重启

查看一下策略

可以发现已有3306端口的策略

3)测试

在Client测试机上测试(该机子已经在先前博客出现过,配置了mariadb)

复制代码
mysql -ulee -plee -h 172.25.254.200 -e 'select @@server_id'

关掉RS2的mariadb服务再测试

过一会,再测试就会发现只剩RS1的10

重新开开

就又能轮询了


在KA2查看一下,就能看到200ip的主是KA2

所以我们:

关闭KA2的keepalived服务再测试

这是我们发现服务能够继续,因为服务已经从主迁移到备了,不影响

测试完记得重新起开

9、VRRP Script

(1)概念

VRRP Script 是 Keepalived 中一个极其重要的功能模块,它允许你通过自定义脚本 来动态监控系统状态(如服务进程、资源利用率、网络连通性等),并将监控结果反馈给 VRRP 协议栈,从而影响 Master 节点的选举优先级触发状态切换 。它是实现基于应用健康状态的高可用性(HA) 的核心机制。


1)核心作用与原理
  1. 扩展监控能力:

    • 默认的 VRRP 只能监控 Keepalived 守护进程本身和网络接口的存活状态。

    • VRRP Script 让你能够监控任何你关心的东西:例如 Nginx/MySQL 进程是否在运行、Web 页面是否可访问、磁盘空间是否不足、CPU 负载是否过高、到某个关键服务的网络是否通畅等。

  2. 动态调整优先级:

    • 你定义一个脚本 (vrrp_script 块) 和一个监控间隔 (interval)。

    • Keepalived 会周期性地(每隔 interval 秒)执行这个脚本。

    • 脚本的退出状态码 (Exit Code) 决定了监控结果:

      • 0 (成功 / OK) : 表示被监控项健康。脚本可以什么都不做直接 exit 0

      • 1 (警告 / WARN)通常 也被视为健康(取决于配置),但可能用于记录日志或轻微通知。(实践中较少严格区分 1 和 0 的效果,主要关注非 0 是否触发故障)

      • >1 (错误 / FAIL): 表示被监控项不健康。

    • 根据脚本的退出码(特别是非 0),Keepalived 可以动态调整 该节点在 VRRP 实例 (vrrp_instance) 中的 priority 值。

  3. 触发状态切换:

    • 当一个节点的优先级因为 vrrp_script 检测到故障而降低时:

      • 如果它原来是 Master ,并且降低后的优先级低于某个 Backup 节点的优先级(通常是初始优先级),那么 Backup 节点会感知到 Master 优先级变低。

      • Backup 节点(现在拥有更高优先级)会发起选举,将自己提升为新的 Master,并接管 Virtual IP (VIP)。

    • 当故障恢复,脚本返回 0 时:

      • 节点的优先级会恢复到初始值。

      • 如果这个节点现在的优先级高于 当前 Master 的优先级(通常是因为原 Master 可能也降权了或者这个节点初始优先级就很高),它可能会重新夺回 Master 身份(取决于 nopreempt 配置)。


2)配置选项解释
复制代码
vrrp_script <SCRIPT_NAME> {
    script "<COMMAND_OR_PATH_TO_SCRIPT>" # 要执行的命令或脚本的完整路径
    interval <SECONDS>                   # 执行间隔(秒),如 2, 5, 10
    timeout <SECONDS>                    # 脚本执行超时时间(秒),超时视为失败
    weight <-254 TO 254>                 # 权重值(最重要!决定优先级如何变化)
    fall <INTEGER>                       # 连续失败多少次才认为故障 (默认 1)
    rise <INTEGER>                       # 连续成功多少次才认为恢复 (默认 1)
    user <USERNAME> [GROUPNAME]          # 以哪个用户(组)身份运行脚本(可选,默认 root)
}
  • script: 核心指令。可以是:

    • 一个简单的 shell 命令:script "killall -0 nginx" (检查 nginx 进程是否存在)

    • 一个自定义脚本的完整路径:script "/usr/local/bin/check_mysql.sh" (路径情况最普遍)

    • 脚本需要有可执行权限 (chmod +x)。

  • interval: 多久执行一次监控脚本。太短增加负担,太长延迟切换。常用 2-10 秒。

  • timeout: 脚本必须在此时长内完成,否则强制终止并视为失败。应略大于脚本预期执行时间。

  • weight (核心参数!): 脚本执行结果如何影响优先级 (priority)。

    • 正值 (e.g., weight 20):

      • 脚本成功 (exit 0): 给当前优先级 加上 weight 值。

      • 脚本失败 (exit > 0): 不改变 当前优先级。

      • 作用 : 健康时提高 本节点优先级,更容易成为/保持 Master。故障时只是失去"加分",如果初始优先级够高,可能还是 Master(需结合 fall/rise 判断)。

    • 负值 (e.g., weight -20):

      • 脚本成功 (exit 0): 不改变 当前优先级。

      • 脚本失败 (exit > 0)): 给当前优先级 加上 weight 值(即减去绝对值)。

      • 作用健康是常态,不额外加分。故障时直接惩罚(降权) 。这是最常用、最直观的方式!故障时优先级降低,更容易被 Backup 超越。

    • 值的大小: 绝对值通常设置为大于 VRRP 实例中 Master 和 Backup 之间初始优先级的差值。例如 Master 初始 prio=100, Backup=90,差值=10。那么 weight -25 是合理的,这样 Backup 在 Master 故障后优先级 (90) 会高于降权后的 Master (100 - 25 = 75)。如果 weight 绝对值太小(比如 -5),降权后 Master(95) 仍高于 Backup(90),就不会切换!

  • fall: 脚本连续失败多少次才触发降权操作(认为真的故障了)。默认为 1(一次失败就降权)。设置为 2 或 3 可以防止短暂抖动导致的误切换。

  • rise: 脚本连续成功多少次才触发恢复操作(认为真的恢复了)。默认为 1(一次成功就恢复)。设置为 2 或 3 可以确保服务稳定恢复后才提升优先级/尝试抢占。

  • user: 以非 root 用户运行脚本,提高安全性(如果脚本不需要 root 权限)。

(2)实验------通过脚本控制haproxy(实现HAProxy高可用

1)注释之前配置的virtual-server配置

两台KA都配置

只要是virtual-server开头的都注释掉,两台KA都配置


注释后ipvsadm看一下

像这样没有策略就行

2)安装haproxy和编辑其配置文件

两台KA都安装

进入配置文件,修改编辑:

先注释掉后面这些:

创建新的Listen

配置开机自启

KA1与2配置命令相同,记得KA2也配置

2)配置非MASTER也有ip

两台KA都配置

复制红框

然后echo写进去:

执行一下

另一台KA一样配置


配置完后,查看一下haproxy的80端口

3)编写脚本

注意:这个keepalived底下的scripts目录是博主自己建立的,你们在做的时候自己记得建立

这个脚本写的是检测haproxy服务活不活的命令

wq

给脚本可执行权限

确保所有主机的SELinux和火墙是关闭状态


进入keepalived配置文件配置脚本

在KA1上配置

配置完重启:

4)测试

然后运行脚本

此时我们没停止KA1的haproxy时,脚本的返回值是正常,即为0

此时,我们关闭KA1的haproxy服务

脚本就会检测到haproxy停止,这时脚本的返回值应该是变成1

这样就说明脚本运行成功

测试完记得把KA1的haproxy开回来

相关推荐
你我约定有三3 小时前
前端笔记:同源策略、跨域问题
前端·笔记
果子⌂4 小时前
Kubernetes 服务发布进阶
linux·运维·服务器·云原生·容器·kubernetes·云计算
望获linux4 小时前
【Linux基础知识系列】第六十三篇 - 文件编辑器基础:vim
linux·运维·服务器·网络·嵌入式硬件·操作系统·嵌入式软件
智者知已应修善业4 小时前
【C# 找最大值、最小值和平均值及大于个数和值】2022-9-23
经验分享·笔记·算法·c#
末日汐5 小时前
Linux常见指令
linux·运维·服务器
!chen5 小时前
Linux dd命令 数据备份、转换与磁盘操作的终极工具
linux·数据库·tomcat
秋也凉5 小时前
关于JavaWeb的总结笔记
笔记
rzl025 小时前
SpringBoot6-10(黑马)
linux·前端·javascript
YGY Webgis糕手之路6 小时前
OpenLayers 快速入门(六)Interaction 对象
前端·vue.js·经验分享·笔记·web
overFitBrain6 小时前
数据结构-4(常用排序算法、二分查找)
linux·数据结构·算法