跳到主要内容

集成keepalived

目录​


一、Keepalived简介​

Keepalived 诞生于 2001 年,用来解决 LVS 的高可用问题。后来,它基于 VRRP 协议发展成一款通用的高可用工具,可以自动管理虚拟 IP,实现主备切换。在网络高可用和 VIP 漂移方面,Keepalived 是 Linux 系统里最经典、最稳定的选择。

LVS(inux Virtual Server,Linux 虚拟服务器):Linux 内核提供的四层(L4)负载均衡技术,用于将客户端请求分发到多台后端服务器,实现高可用和高性能服务集群。LVS 本身依赖 Linux 内核,默认模块可能没有加载,需要手动加载。

VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议):一种标准网络协议(L3),用于实现主备节点间的虚拟 IP 漂移,提高路由或服务器的高可用性。

1. Keepalived的定位​

Keepalived 主要基于 VRRP 协议实现 VIP(虚拟 IP)漂移,加上健康检查,来保证高可用。

2. Keepalived与负载均衡​

Keepalived 本身不提供负载均衡算法,但提供对 LVS 的管理功能。

  • Keepalived(提供 VRRP 实现) = 主备高可用(HA)。

  • Keepalived + LVS = 四层负载均衡(L4 LB),实现IP 层、TCP/UDP 转发,比如:按照源 IP、目标 IP、端口做分发。

  • 实现应用层负载均衡(L7 LB),可以使用TongHttpServer(简称:THS,与Nginx的作用相同),实现基于 HTTP 头、URI、Cookie 等更灵活的规则转发请求。

TongHttpServer是东方通的高性能服务代理中间件(已经被集成在TUS中,只为TUS提供服务;若用于TUS之外的系统,需要单独购买),支持OSI四层七层协议,可作为静态资源服务器、正向代理服务器、反向代理服务器、负载均衡服务器使用,支持带权轮询、IP哈希、最小连接、随机、哈希等多种负载均衡算法,满足企业构建高可用、高扩展性、高性能的应用服务集群需求。

常见部署模式

ESB 主备(单活):
客户端 → VIP (Keepalived 提供) → ESB主备 → 后端应用

Nginx主备(单活) + ESB 集群(双活)
客户端 → VIP (Keepalived 提供) → THS主备 → ESB集群 → 后端应用

Nginx集群(双活) + ESB 集群(双活)
客户端 → VIP (Keepalived 提供) → LVS(L4调度) → THS集群 → ESB集群 → 后端应用

二、环境准备​

系统:Linux localhost.localdomain 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

服务器A(主节点):10.10.83.121

服务器B(备节点):10.10.83.122

虚拟IP:10.10.83.100

三、安装/检查 keepalived​

注: 主备节点均需安装 keepalived

1. 安装​

sudo yum install -y keepalived

2. 检查​

keepalived -v

keepalived_check

四、配置keepalived​

1. 主节点配置​

(/etc/keepalived/keepalived.conf)

global_defs {
router_id LVS_MASTER # 唯一标识
}

# Java进程检测脚本
vrrp_script chk_java {
script "/etc/keepalived/check_java.sh"
interval 2 # 每2秒检查一次
weight -20 # 失败时优先级降低20
}

vrrp_instance VI_1 {
state MASTER # 主节点
interface ens33 # 网络接口
virtual_router_id 51 # 主备必须相同
priority 100 # 优先级(100-254),主高于备

# 主备通信认证
authentication {
auth_type PASS
auth_pass 1111 # 密码,主备需一致
}

# 虚拟IP配置
virtual_ipaddress {
10.10.83.100/24 dev ens33
}

# 引用Java检测脚本
track_script {
chk_java
}

# 状态切换通知(可选)
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}

2. 备节点配置​

(/etc/keepalived/keepalived.conf)

global_defs {
router_id LVS_BACKUP
}

vrrp_script chk_java {
script "/etc/keepalived/check_java.sh"
interval 2
weight -20
}

vrrp_instance VI_1 {
state BACKUP # 备节点
interface ens33
virtual_router_id 51 # 与主节点相同
priority 90 # 优先级低于主节点

authentication {
auth_type PASS
auth_pass 1111
}

virtual_ipaddress {
10.10.83.100/24 dev ens33
}

track_script {
chk_java
}

notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}

3. 创建Java进程检测脚本​

(两台服务器相同)

创建 /etc/keepalived/check_java.sh:

#!/bin/bash

# 检查Java进程是否存在
if pgrep -f "ESBServer" > /dev/null; then
exit 0
fi

# 两者都不存在则返回错误
exit 1

​ 赋予执行权限:

sudo chmod +x check_java.sh

4. 创建状态通知脚本(可选)​

创建 /etc/keepalived/notify.sh:

#!/bin/bash

TYPE=$1
LOG_FILE="/var/log/keepalived-status.log"
VIP="10.10.83.100"

echo "[$(date +'%Y-%m-%d %H:%M:%S')] $TYPE state entered" >> $LOG_FILE

case $TYPE in
master)
# 成为主节点时的操作
echo "VIP $VIP activated on $(hostname)" | mail -s "Keepalived Master Activated" admin@example.com
;;
backup)
# 成为备节点时的操作
;;
fault)
# 故障状态时的操作
echo "Keepalived FAULT state on $(hostname)" | mail -s "Keepalived Fault Alert" admin@example.com
;;
esac

​ 赋予执行权限:

sudo chmod +x notify.sh
  1. (可选)防火墙配置(两台服务器)
# 允许VRRP协议
sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent

# 允许组播通信(可选)
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="224.0.0.0/24" accept' --permanent

# 重载防火墙
sudo firewall-cmd --reload

五、TongESB Server keepalived 支持​

1. 修改配置文件​

(/etc/keepalived/check_java.sh)

#!/bin/bash

# 检查Java进程是否存在
if pgrep -f "ESBServer" > /dev/null; then
exit 0
fi

# 两者都不存在则返回错误
exit 1

2. 主节点验证​

keepalived_master_check

3. 备节点验证​

keepalived_slave_check

4. vip验证​

keepalived_vip_check

如上图通过虚拟ip 10.10.83.100 访问到了主节点服务。

5. 关闭主节点,通过vip验证​

keepalived_slave_vip_check

如上图通过虚拟ip 10.10.83.100 访问到了备节点服务。

6. 重启主节点,通过vip验证​

keepalived_restart_master_vip_check