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 结合,都能为关键业务提供可靠的服务连续性保障。

相关推荐
0xDevNull1 小时前
Linux服务器日志查看完全指南
linux·运维·服务器
songx_991 小时前
Linux基础1
linux·运维·服务器
菱玖1 小时前
Linux 系统性能排查常用指令
linux·运维·服务器
皮卡蛋炒饭.1 小时前
进程间通信
linux·运维·服务器
艾莉丝努力练剑2 小时前
【Linux系统:信号】线程安全不等于可重入:深度拆解变量作用域与原子操作
java·linux·运维·服务器·开发语言·c++·学习
w6100104662 小时前
CKAD-2026-Secret
运维·k8s·ckad
无巧不成书02182 小时前
基于WSL 2的Docker远程开发全栈实战指南
运维·docker·容器·docker desktop·wsl 2·vs code远程开发·容器化开发
一个天蝎座 白勺 程序猿2 小时前
踩坑生产后整理:KingbaseES表空间管理、auto_createtblspcdir参数深度解析与运维最佳实践
运维·数据库·kingbasees
赵庆明老师2 小时前
Linux Docker打包
linux·运维·docker
Eloudy2 小时前
docker pull ubuntu:22.04 失败的解决记录
运维·docker·容器