Keepalived高可用负载均衡

Keepalived 高可用负载均衡解决方案

一、Keepalived 概述

1.1 什么是 Keepalived?

Keepalived 是一款用 C 语言编写的路由软件,旨在为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载均衡和高可用性功能。它最初是专为 LVS(Linux Virtual Server)负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。

1.2 核心功能

Keepalived 主要实现两大核心功能:

| 功能模块 | 描述 |

|---------|------|

| **负载均衡** | 基于 LVS(IPVS)内核模块,提供 Layer4 传输层负载均衡 |

| **高可用性** | 通过 VRRP(虚拟路由冗余协议)实现路由器故障转移 |

| **健康检查** | 实现对真实服务器的健康检查,自动隔离故障节点 |

1.3 工作原理

**VRRP协议机制**:

  • Keepalived 使用 VRRP 协议实现虚拟路由器的冗余

  • 多台路由器中,一台作为 MASTER 负责处理流量,其他作为 BACKUP 监控 MASTER 状态

  • MASTER 定期发送 VRRP 通告(心跳);如果 BACKUP 在指定时间收不到通告,则接管虚拟 IP

  • 虚拟 IP(VIP)会在主节点故障时自动"漂移"到备用节点,确保服务连续性

**健康检查机制**:

  • Keepalived 通过多种检查方式监控真实服务器状态

  • 当某台服务器故障时,自动将其从 LVS 拓扑中移除

  • 故障恢复后,自动重新加入服务器池

1.4 软件架构

Keepalived 采用模块化设计,守护进程分为三个进程:

```

PID 111 Keepalived <-- 父进程(监控子进程)

112 \_ Keepalived <-- VRRP子进程

113 \_ Keepalived <-- Healthchecking子进程

```

  • **父进程**:负责监控子进程状态,定期发送心跳包

  • **VRRP子进程**:负责 VRRP 协议实现,处理故障转移

  • **健康检查子进程**:负责对真实服务器进行健康检查

二、Keepalived 安装部署

2.1 在 openEuler/CentOS/RHEL 系统安装

```bash

使用 yum/dnf 安装

dnf install -y keepalived

验证安装

keepalived --version

rpm -qa keepalived

```

2.2 在 Ubuntu/Debian 系统安装

```bash

更新软件源

apt-get update

安装 keepalived(不安装 ipvsadm 可选)

apt-get install -y keepalived

如果需要 LVS 负载均衡功能,安装 ipvsadm

apt-get install -y ipvsadm

```

2.3 源码编译安装

```bash

下载最新稳定版

wget http://www.keepalived.org/software/keepalived-2.2.8.tar.gz

解压

tar zxvf keepalived-2.2.8.tar.gz

cd keepalived-2.2.8

配置(指定安装路径)

./configure --prefix=/usr/local/keepalived

编译安装

make && make install

```

#三、Keepalived 配置文件详解

Keepalived 的配置文件通常位于 `/etc/keepalived/keepalived.conf`。

3.1 配置文件结构

```

全局定义(global_defs)

├── VRRP实例配置(vrrp_instance)

│ ├── 虚拟IP配置(virtual_ipaddress)

│ ├── 脚本跟踪(track_script)

│ └── 状态通知(notify)

└── 虚拟服务器配置(virtual_server)

├── 真实服务器(real_server)

└── 健康检查(HTTP_GET/TCP_CHECK等)

```

3.2 完整配置示例

```bash

! Configuration File for keepalived

全局配置

global_defs {

故障通知邮件(可选)

notification_email {

acassen@firewall.loc

failover@firewall.loc

}

发件人地址

notification_email_from Alexandre.Cassen@firewall.loc

SMTP服务器

smtp_server 192.168.200.1

smtp_connect_timeout 30

路由器标识,集群内唯一

router_id LVS_MASTER

VRRP多播地址

vrrp_mcast_group4 224.0.0.18

}

脚本定义(用于服务监控)

vrrp_script chk_nginx {

script "/etc/keepalived/check_nginx.sh" # 检查脚本

interval 2 # 检查间隔(秒)

weight -20 # 失败时优先级降低值

fall 2 # 失败次数阈值

rise 1 # 成功次数阈值

}

VRRP实例配置

vrrp_instance VI_1 {

节点状态(MASTER/BACKUP)

state MASTER

绑定网卡

interface ens33

虚拟路由ID(同一组必须一致,范围0-255)

virtual_router_id 51

优先级(MASTER高于BACKUP)

priority 100

通告间隔(秒)

advert_int 1

认证配置

authentication {

auth_type PASS

auth_pass 1111 # 认证密码(最多8位)

}

虚拟IP地址

virtual_ipaddress {

192.168.10.100/24 dev ens33

192.168.10.101/24 dev ens33

}

跟踪脚本

track_script {

chk_nginx

}

非抢占模式(默认抢占)

nopreempt

状态通知脚本

notify_master "/etc/keepalived/notify.sh master"

notify_backup "/etc/keepalived/notify.sh backup"

notify_fault "/etc/keepalived/notify.sh fault"

}

LVS虚拟服务器配置(可选,与LVS集成)

virtual_server 192.168.10.100 80 {

健康检查间隔(秒)

delay_loop 6

调度算法 rr|wrr|lc|wlc|lblc|sh|dh

lb_algo rr

LVS模式 NAT|DR|TUN

lb_kind DR

持久连接超时(秒)

persistence_timeout 50

协议

protocol TCP

后备服务器(所有RS都故障时使用)

sorry_server 192.168.10.200 80

真实服务器1

real_server 192.168.10.11 80 {

weight 1

HTTP健康检查

HTTP_GET {

url {

path /index.html

status_code 200

}

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

真实服务器2

real_server 192.168.10.12 80 {

weight 1

HTTP_GET {

url {

path /index.html

status_code 200

}

connect_timeout 3

}

}

}

```

3.3 健康检查脚本示例

```bash

#!/bin/bash

/etc/keepalived/check_nginx.sh

检查 Nginx 进程是否运行

if pgrep nginx > /dev/null; then

exit 0

else

exit 1

fi

```

3.4 状态通知脚本示例

```bash

#!/bin/bash

/etc/keepalived/notify.sh

STATE=$1

VIP="192.168.10.100"

LOGFILE="/var/log/keepalived-notify.log"

case $STATE in

master)

echo "(date): 切换到 MASTER 状态,VIP: VIP" >> $LOGFILE

可以在这里启动相关服务

;;

backup)

echo "(date): 切换到 BACKUP 状态" \>\> LOGFILE

可以在这里停止相关服务

;;

fault)

echo "(date): 切换到 FAULT 状态" \>\> LOGFILE

故障处理

;;

*)

echo "(date): 未知状态: STATE" >> $LOGFILE

;;

esac

```

四、Keepalived 配置参数说明

4.1 VRRP实例关键参数

| 参数 | 说明 | 注意事项 |

|------|------|----------|

| `state` | 实例初始状态(MASTER/BACKUP) | 同一组只能有一个MASTER |

| `interface` | 绑定网卡接口 | VIP会绑定到此网卡 |

| `virtual_router_id` | 虚拟路由ID(0-255) | 同一组必须一致 |

| `priority` | 优先级(1-255) | 数值越高越可能成为MASTER |

| `advert_int` | 通告间隔(秒) | 默认1秒 |

| `nopreempt` | 非抢占模式 | 禁止高优先级节点抢占 |

| `preempt_delay` | 抢占延迟(秒) | 默认300秒 |

4.2 健康检查类型

| 检查类型 | 适用场景 | 特点 |

|----------|----------|------|

| `TCP_CHECK` | 通用TCP服务 | 检查端口是否可连接 |

| `HTTP_GET` | Web服务 | 检查HTTP状态码或页面内容MD5 |

| `SSL_GET` | HTTPS服务 | 同HTTP_GET,使用SSL连接 |

| `MISC_CHECK` | 自定义服务 | 执行自定义脚本检查 |

| `SMTP_CHECK` | 邮件服务器 | 检查SMTP服务 |

五、Keepalived 高可用实战案例

5.1 双主高可用架构

主备配置示例:

**MASTER节点配置**:

```bash

vrrp_instance VI_1 {

state MASTER

interface ens33

virtual_router_id 51

priority 150

advert_int 1

virtual_ipaddress {

192.168.10.100/24

}

}

```

**BACKUP节点配置**:

```bash

vrrp_instance VI_1 {

state BACKUP

interface ens33

virtual_router_id 51

priority 100

advert_int 1

virtual_ipaddress {

192.168.10.100/24

}

}

```

5.2 Nginx + Keepalived 高可用

```bash

1. 创建健康检查脚本

cat > /etc/keepalived/check_nginx.sh << 'EOF'

#!/bin/bash

if curl -I http://localhost/ 2>/dev/null | grep "200 OK" >/dev/null; then

exit 0

else

Nginx 故障,尝试重启

systemctl restart nginx

sleep 2

if curl -I http://localhost/ 2>/dev/null | grep "200 OK" >/dev/null; then

exit 0

else

exit 1

fi

fi

EOF

chmod +x /etc/keepalived/check_nginx.sh

  1. 配置 keepalived

vrrp_script chk_nginx {

script "/etc/keepalived/check_nginx.sh"

interval 2

weight -20

}

vrrp_instance VI_1 {

state MASTER

interface ens33

virtual_router_id 51

priority 100

advert_int 1

track_script {

chk_nginx

}

virtual_ipaddress {

192.168.10.100/24

}

}

```

5.3 与 LVS 集成(DR模式)

```bash

vrrp_instance VI_1 {

state MASTER

interface ens33

virtual_router_id 51

priority 100

virtual_ipaddress {

192.168.10.100/24

}

}

virtual_server 192.168.10.100 80 {

delay_loop 6

lb_algo rr

lb_kind DR

protocol TCP

real_server 192.168.10.11 80 {

weight 1

TCP_CHECK {

connect_timeout 3

}

}

real_server 192.168.10.12 80 {

weight 1

TCP_CHECK {

connect_timeout 3

}

}

}

```

六、Keepalived 运维管理

6.1 服务管理命令

```bash

启动服务

systemctl start keepalived

停止服务

systemctl stop keepalived

重启服务

systemctl restart keepalived

查看状态

systemctl status keepalived

设置开机自启

systemctl enable keepalived

查看日志

journalctl -u keepalived -f

tail -f /var/log/messages | grep Keepalived

```

6.2 配置验证与调试

```bash

检查配置文件语法

keepalived -t -f /etc/keepalived/keepalived.conf

以调试模式运行(前台)

keepalived -n -l -D

查看详细日志

keepalived -D

查看当前VIP

ip addr show | grep -A 2 vrrp

查看VRRP状态

ip -d link show | grep vrrp

```

6.3 状态监控命令

```bash

查看keepalived进程

ps aux | grep keepalived

查看VRRP组播状态

tcpdump -i ens33 -n vrrp

查看IPVS规则(如果使用LVS)

ipvsadm -L -n --stats

查看系统日志中的keepalived消息

grep Keepalived /var/log/messages

```

七、故障排查指南

7.1 常见问题及解决方法

| 问题现象 | 可能原因 | 解决方法 |

|---------|---------|---------|

| VIP 不生效 | 网卡配置错误 | 检查 `interface` 是否正确 |

| 双主同时存在 | 防火墙阻挡VRRP | 开放 VRRP 多播地址 224.0.0.18 |

| 频繁切换 | 网络不稳定 | 增加 `advert_int` 或设置 `nopreempt` |

| 健康检查失败 | 检查脚本错误 | 单独运行脚本测试 |

| 服务无法故障转移 | 优先级配置错误 | 确保 BACKUP 优先级低于 MASTER |

7.2 防火墙配置

```bash

开放 VRRP 多播(iptables)

iptables -I INPUT -d 224.0.0.18 -j ACCEPT

iptables -I OUTPUT -d 224.0.0.18 -j ACCEPT

firewalld

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

firewall-cmd --reload

```

八、Keepalived 与 LVS 对比总结

| 特性 | Keepalived 单独使用 | LVS + Keepalived |

|------|---------------------|------------------|

| **核心功能** | VRRP高可用、健康检查 | LVS负载均衡 + Keepalived高可用 |

| **适用场景** | 服务高可用(Nginx/MySQL等) | 四层负载均衡高可用集群 |

| **配置复杂度** | 简单 | 中等 |

| **资源消耗** | 低 | 较低 |

| **典型应用** | Web服务器高可用、数据库高可用 | LVS负载均衡器高可用 |

九、最佳实践建议

  1. **合理设置优先级**:主备优先级差距建议在30以上,避免网络波动导致误判

  2. **使用非抢占模式**:`nopreempt` 可避免主节点恢复后不必要的切换

  3. **健康检查要精确**:尽量模拟真实用户请求,避免误判

  4. **日志集中管理**:配置 syslog 集中收集 keepalived 日志

  5. **定期演练**:定期进行故障转移演练,验证高可用有效性

  6. **监控告警**:对接监控系统,及时掌握高可用状态

Keepalived 作为成熟的高可用解决方案,无论是单独使用还是与 LVS 结合,都能为关键业务提供可靠的服务连续性保障。

相关推荐
BullSmall2 小时前
Nginx(反向代理、负载均衡)安全加固
nginx·安全·负载均衡
运维小欣2 小时前
26年可观测性平台选型指南
运维
劳埃德福杰2 小时前
Windows电脑安装双系统如何切换默认开机系统
运维·windows·电脑
宁波阿成2 小时前
OpenClaw Docker 完整部署与排障总文档
运维·docker·ai·容器·openclaw
小王要努力上岸2 小时前
LVS DR 模式(Direct Routing)
linux·运维·lvs
gaize12132 小时前
个人博客 / 官网云服务器|简单好用不贵
运维·服务器
乾元3 小时前
RAG 架构: 利用向量数据库构建企业的安全知识库
运维·网络·数据库·人工智能·安全·网络安全·架构
somi73 小时前
Linux-基于网络爬虫技术的天气数据查询
linux·运维·服务器
J心流3 小时前
SSH远程连接 github/云效 的操作流程
运维·ssh·github