一、高可用集群
1.1.集群类型
集群是由多台独立服务器通过网络协同工作,对外表现为一个整体的系统。常见类型包括:
- 负载均衡集群(LBC):将流量分发到多台节点,提升并发处理能力,如 Nginx、LVS。
- 高可用集群(HAC):通过冗余节点消除单点故障,保证服务持续可用,如 Keepalived、Pacemaker。
- 高性能计算集群(HPC):用于科学计算,通过并行处理提升算力,如 MPI 集群。
- 分布式存储集群:提供大容量、高可靠的数据存储,如 Ceph、GlusterFS。
1.2.系统可用性
系统可用性是衡量服务持续运行能力的核心指标,通常用 "几个 9" 表示:
- 99%(2 个 9):年停机时间约 3.65 天
- 99.9%(3 个 9):年停机时间约 8.76 小时
- 99.99%(4 个 9):年停机时间约 52.56 分钟
- 99.999%(5 个 9):年停机时间约 5.26 分钟
计算公式:可用性=总运行时间/(总运行时间 + 故障停机时间总运行时间)×100%
1.3.系统故障
系统故障是导致服务中断的常见原因,主要分为:
- 硬件故障:服务器宕机、硬盘损坏、网卡失效、电源故障等。
- 软件故障:应用崩溃、内核 panic、配置错误、依赖服务异常。
- 网络故障:链路中断、路由抖动、防火墙策略错误、DDoS 攻击。
- 人为故障:误操作、配置变更失误、运维脚本执行异常。
1.4.实现高可用
实现高可用的核心思路是冗余 + 故障检测 + 自动切换,关键技术包括:
- 冗余部署:主备节点、多活节点、多机房部署,避免单点故障。
- 故障检测:通过心跳检测、端口探测、服务状态检查,及时发现节点异常。
- 自动切换:故障发生时,自动将流量或资源切换到备用节点,如 VIP 漂移、服务重启。
- 状态同步:主备节点间同步会话、数据或配置,确保切换后服务一致性。
- 告警通知:故障时触发邮件、短信或平台告警,便于运维人员介入。
1.5.VRRP:Virtual Router Redundancy Protocol
VRRP 是一种网络冗余协议,通过将多台路由器虚拟为一个 "虚拟路由器",实现网关的高可用,避免单点故障。

1.5.1.VRRP相关术语
- VRRP 路由器:运行 VRRP 协议的物理路由器或服务器。
- 虚拟路由器:由一组 VRRP 路由器组成的逻辑实体,拥有唯一的虚拟 IP(VIP)。
- 主路由器(Master):当前承担流量转发的 VRRP 路由器,负责响应 ARP 请求、转发数据包。
- 备路由器(Backup):处于待命状态的 VRRP 路由器,监控主路由器状态,故障时接管服务。
- 虚拟路由器 ID(VRID):标识同一虚拟路由器的唯一 ID,同一组内路由器 VRID 必须一致。
- 优先级(Priority):用于选举主路由器,范围 0-255,值越高优先级越高(255 为 IP 地址所有者专用)。
- ** Advertisement 报文 **:主路由器定期发送的广播报文,用于宣告自身状态,默认间隔 1 秒。
1.5.2.VRRP相关技术
- 主备选举机制 :
- 初始状态下,所有 Backup 路由器等待 Advertisement 报文。
- 若收到优先级更高的 Advertisement,则保持 Backup 状态;若在超时时间(默认 3 秒)内未收到报文,则触发选举,优先级最高的 Backup 成为新的 Master。
- VIP 漂移 :
- Master 路由器绑定虚拟 IP(VIP),对外提供服务。
- 当 Master 故障时,新选举的 Master 会自动接管 VIP,通过免费 ARP(Gratuitous ARP)更新网络设备的 ARP 表,实现流量无缝切换。
- 抢占模式(Preempt Mode) :
- 开启抢占模式后,高优先级的 Backup 路由器发现当前 Master 优先级更低时,会主动抢占成为新的 Master。
- 关闭抢占模式时,只有当前 Master 故障后,Backup 才会接管,避免频繁切换。
- 认证机制 :
- 支持明文认证和 MD5 认证,防止恶意设备伪造 VRRP 报文干扰集群状态。
- 与 Keepalived 的关系 :
- Keepalived 基于 VRRP 协议实现高可用,通过配置 VRRP 实例,管理 VIP 漂移和节点切换,同时支持对后端服务的健康检查,实现更灵活的高可用场景。
二、keepalived部署
2.1.keepalived简介
Keepalived 是一款基于 VRRP 协议 实现的高可用工具,主要用于解决单点故障问题,广泛应用于负载均衡集群(如 LVS、Nginx)和网关服务的高可用场景。

- 核心功能 :
- 基于 VRRP 实现 IP 地址(VIP)的高可用漂移。
- 对后端服务或节点进行健康检查,故障时自动触发主备切换。
- 支持邮件、脚本等告警方式,便于运维监控。
- 应用场景 :
- 负载均衡器(LVS/Nginx)的主备高可用。
- 网关、DNS、数据库等核心服务的冗余部署。
- 多机房、多节点的服务高可用架构。
2.2.keepalived架构

Keepalived 采用用户态 + 内核态的分层设计:
- 用户态(User Space):负责控制平面、配置解析、健康检查、VRRP 协议栈等逻辑处理。
- 内核态(Kernel Space):通过 IPVS 和 Netlink 提供高性能的负载均衡和网络通信能力。
控制平面(Control Plane)
- Configuration file parser :配置文件解析器,负责解析
keepalived.conf,将配置转换为内部数据结构,驱动整个系统的行为。
调度与管理模块
- Scheduler - I/O Multiplexer:I/O 多路复用调度器,负责管理所有文件描述符(网络连接、定时器等),实现高效的事件驱动模型。
- Memory Mngt:内存管理模块,负责内存分配、回收和优化,确保系统高效稳定运行。
核心组件(Core components)
这是 Keepalived 的 "心脏",包含以下关键模块:
- **Checkers(健康检查器):**支持 TCP、HTTP、SSL、MISC(自定义脚本)等多种健康检查方式,周期性探测后端服务或节点状态,故障时触发主备切换或服务摘除。
- **IPVS wrapper:**对内核 IPVS 模块的封装,提供用户态接口,用于配置和管理 LVS 负载均衡规则。
- **WatchDog:**监控系统关键组件的运行状态,异常时尝试恢复或触发告警。
- **System call:**封装系统调用,为上层模块提供统一的系统接口。
- **SMTP:**邮件通知模块,健康检查失败或 VRRP 状态切换时,发送告警邮件。
- **VRRP Stack:**VRRP 协议栈的核心实现,负责主备选举、VIP 漂移、抢占模式等高可用逻辑。
- **Netlink Reflector:**与内核 Netlink 子系统交互,用于网络配置(如 IP 地址、路由)的同步和通知。
内核态组件
- **IPVS(IP Virtual Server):**内核中的负载均衡模块,实现 LVS 的核心转发功能,支持 NAT、DR、TUN 等模式。
- **NETLINK:**内核与用户态通信的机制,用于网络配置、状态通知等。
2.3.keepalived环境准备

- 各节点时间必须同步:ntp、chrony
- 关闭防火墙和selinux
- 各节点之间可通过主机名互相通信:非必须
- 建议使用/etc/hosts文件实现:非必须
- 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须

|-----|----------------|
| 主机名 | ip |
| RS1 | 192.168.174.10 |
| RS2 | 192.168.174.20 |
| KA1 | 192.168.174.50 |
| KA2 | 192.168.174.60 |
部署RS1和RS2(单网卡NAT模式)

测试连通性

设定KA1和KA2的本地解析,在所有主机中查看/etc/hosts



在KA1开启时间同步服务(在第26行和29行),重启chronyd服务,并开启开机自启



在KA2中使用KA1的时间同步服务,重启chronyd服务,并开启开机自启

查看当前 Chrony 时间同步服务 所使用的时间源(NTP 服务器)及其详细状态信息

2.4.keepalived相关文件
Keepalived 安装后,核心文件路径如下(以 CentOS 为例):
主配置文件 :/etc/keepalived/keepalived.conf
- 所有高可用策略、健康检查、虚拟路由器配置均在此文件中。
日志文件:
- 默认输出到系统日志
/var/log/messages或/var/log/syslog。 - 可通过配置指定独立日志文件,如
/var/log/keepalived.log。
服务管理文件:
- Systemd 服务文件:
/usr/lib/systemd/system/keepalived.service。 - 用于控制服务启动、停止、开机自启等。
可执行文件:
/usr/sbin/keepalived:主程序二进制文件。/usr/bin/genhash:生成 MD5 认证哈希值的工具。
2.5.keepalived安装

2.6.keepalived配置说明
2.6.1.配置文件组成部分
keepalived.conf 主要由以下三部分组成:
- 全局配置(global_defs) :
- 定义全局参数,如路由器 ID、邮件告警、脚本用户等。
- 健康检查配置(vrrp_script /real_server) :
- 定义对后端服务或节点的健康检查规则。
- VRRP 实例配置(vrrp_instance) :
- 定义虚拟路由器实例,包括 VIP、优先级、抢占模式、认证等核心高可用策略。
但是在主配置文件中如果写入过多的配置不利于对主配置文件的阅读,所以我们可以独立一个子配置文件出来
先创建一个新目录,在里面创建子配置文件

复制这段配置命令再粘贴到子配置文件里,然后主配置文件里的这段就可以删除了,在原来的地方添加这段命令:include /etc/keepalived/conf.d/*.conf,这里就是子配置文件的文件地址,确认没有错误后保存退出,然后重启生效



2.6.2.配置语法说明
2.6.2.1.全局配置(vim /etc/keepalived/keepalived.conf)
Keepalived 配置文件采用类 C 语言的块结构语法:
- 使用
{}包裹配置块,缩进用于增强可读性。 - 注释以
!或#开头,支持单行注释。 - 配置项名与值之间用空格分隔,字符串可加引号也可不加。

notification_email { ... }:定义故障切换时接收告警邮件的邮箱地址列表。- 这里配置了三个收件人邮箱:
acassen@firewall.loc、failover@firewall.loc、sysadmin@firewall.loc,邮箱可以是任意的,没有要求

- notification_email_from Alexandre.Cassen@firewall.loc:指定告警邮件的发件人 地址为
Alexandre.Cassen@firewall.loc。邮箱可以是任意的,没有要求,可以设置成自己的qq邮箱或者网易邮箱进行测试 - smtp_server 192.168.200.1:指定用于发送邮件的 SMTP 服务器地址 为
192.168.200.1。这里的ip可以换成其他的 - smtp_connect_timeout 30:设置连接 SMTP 服务器的超时时间为 30 秒,超时则放弃发送邮件。
- router_id LVS_DEVEL:为本节点设置一个唯一的标识
LVS_DEVEL,用于日志和告警中区分不同节点。 - vrrp_skip_check_adv_addr:跳过对 VRRP 通告报文源地址的检查,适用于复杂网络环境。
- vrrp_strict:启用严格的 VRRP 协议合规性检查,拒绝不符合协议规范的报文,提升安全性。
- vrrp_garp_interval 0:设置免费 ARP(Gratuitous ARP)报文的发送间隔为 0 秒,即立即发送,用于快速更新网络设备的 ARP 表。
- vrrp_gna_interval 0:设置免费 NA(Gratuitous Neighbor Advertisement,IPv6 下)报文的发送间隔为 0 秒,作用与 GARP 类似。

- vrrp_instance VI_1:这个块定义了一个名为
VI_1的虚拟路由器实例,用于实现高可用。 - state MASTER:指定本节点在 VRRP 实例
VI_1中的初始状态为 MASTER (主节点)。另一台备节点应设为BACKUP。 - interface eth0:指定 VRRP 报文在
eth0网卡上进行收发。 - virtual_router_id 51:设置虚拟路由器 ID 为
51。同一 VRRP 组内的所有节点,此 ID 必须相同。 - priority 100:设置本节点的优先级为
100。优先级越高,在选举时越容易成为 MASTER。备节点的优先级应低于此值。 - advert_int 1:设置 VRRP 通告报文的发送间隔为 1 秒。MASTER 每秒发送一次报文宣告自己存活。
authentication { ... }:配置 VRRP 报文的认证信息。auth_type PASS:使用简单密码认证方式。auth_pass 1111:设置认证密码为1111。同一 VRRP 组内的所有节点,此密码必须相同。virtual_ipaddress { ... }:定义本实例对外提供服务的虚拟 IP(VIP)地址。192.168.200.16、192.168.200.17、192.168.200.18:配置了三个 VIP,当本节点成为 MASTER 时,这些 IP 会被绑定到eth0网卡上。
2.6.2.2.配置虚拟路由器
在master上进行配置

- smtp_server 127.0.0.1 :Keepalived 不再依赖外部的 SMTP 服务器,而是直接通过本机(
localhost)上运行的邮件传输代理(MTA,如 Postfix、Sendmail 或 Mailx)来发送邮件。这是一种更常见的本地转发配置。 - vrrp_garp_interval 1 :当 VIP 发生漂移时,Keepalived 会每秒发送一次免费 ARP 包,用来更新网络中其他设备的 ARP 表。设置为
0表示立即发送,改为1秒是为了避免在网络不稳定时产生过多的 ARP 包。 - #vrrp_strict:关闭了严格的 VRRP 协议检查。Keepalived 现在会接受一些不符合协议规范的报文,这在某些兼容性场景下是必要的,但也略微降低了安全性。
- vrrp_gna_interval 1 :与
vrrp_garp_interval类似,用于 IPv6 环境下的地址解析表更新。 - vrrp_mcast_group4 224.0.0.44 :指定 VRRP 协议使用的 IPv4 组播地址。默认的 VRRP 组播地址是
224.0.0.18,这里修改为224.0.0.44,通常是为了避免与网络中其他 VRRP 实例冲突。

- virtual_ipaddress { 192.168.174.100/24 dev eth0 label eth0:0 }:定义虚拟 IP(VIP)
192.168.174.100/24:VIP 地址及子网掩码。
dev eth0:将 VIP 绑定到 eth0 网卡。
label eth0:0:为 VIP 设置网卡别名 eth0:0,便于在系统中识别和管理。
当本节点成为 MASTER 时,该 VIP 会自动绑定到网卡,对外提供服务;当节点切换为 BACKUP 时,VIP 会自动移除。
- accept :确保内核会接收所有发往
192.168.174.100的数据包,从而保证服务可以正常响应。
自启服务生效

同理,在KA2中设定配置文件

- router_id KA1 :将本节点的唯一标识(Router ID)设置为
KA1,用于日志和告警中区分不同节点。 - vrrp_mcast_group4 224.0.0.44 :指定 VRRP 使用的 IPv4 组播地址为
224.0.0.44,避免与其他 VRRP 实例冲突。 - state BACKUP :这是一台备用服务器,指定本节点在该实例中的初始状态为 BACKUP(备节点)。
- priority 80 :本节点的优先级为 80,低于 MASTER 节点的 100。在主备选举中,优先级高的节点会成为 MASTER,因此在 MASTER 正常运行时,本节点保持 BACKUP 状态。
- virtual_ipaddress { 192.168.174.100/24 dev eth0 label eth0:0 } :定义虚拟 IP(VIP)为
192.168.174.100/24,绑定到eth0网卡,网卡别名为eth0:0。当本节点成为新的 MASTER 时,该 VIP 会自动绑定到网卡,接管服务。
自启服务生效

keepalived有自带的检测错误的命令,没有提示说明刚刚配置的文件内容无误

验证配置:通过抓包,发现有数据包从KA1传输到KA2,证明配置成功

通过查看网络接口,发现有eth0:0的信息,证明配置无误

测试故障(在一个独立的shell中持续执行):

在kA1中模拟故障

在KA2中看vip是否被迁移到当前主机,发现不仅单独的shell中可以看到ip变成了KA2的ip,然后KA2中也出现了eth0:0的信息,证明虚拟路由配置成功


2.6.2.3.启用keepalived日志功能
keepalived日志分离
默认情况下,keepalived的日志会被保存在/var/log/messages文件里,这个文件包含了各种服务的日志信息,不利于对keepalived的日志进行查看,所以对其进行日志分离


保存退出,重启服务生效

接着去编写采集日志的规则

这个文件会自动生成

保存退出,重启rsyslog服务之后再重启keepalived服务产生日志信息,然后在 /var/log 下查看是否有keepalived的日志文件出现
