1\. 引言
LVS (Linux Virtual Server) 虚拟服务器,是 Linux 内核中实现的负载均衡技术,以其高性能、高可靠性和高可用性而闻名。LVS 工作在 TCP/IP 协议栈的第四层 (传输层),通过将流量分配到多个后端服务器,提高系统性能、可用性和可靠性。LVS 被广泛应用于各种场景,例如网站、数据库、游戏服务器等,是构建高可用、高性能 Web 服务的利器。
2\. LVS 的工作原理
LVS 集群主要由两部分组成:
- 调度器 (Director Server): 负责接收客户端请求,并根据负载均衡算法将请求转发到后端服务器。调度器通常被称为 "虚拟服务器" (VS)。
- 服务端服务器 (Real Server): 负责处理实际的业务请求。服务端服务器也称为 "节点服务器" (RS)。
LVS 的工作流程如下:
- 客户端发送请求到调度器 (VS)。
- 调度器 (VS) 根据负载均衡算法选择一个服务端服务器 (RS)。
- 调度器 (VS) 将请求转发到选定的服务端服务器 (RS)。
- 服务端服务器 (RS) 处理请求,并将响应返回给客户端。
- 响应数据包通过调度器 (VS) 返回给客户端。
3\. LVS 集群中的术语
术语 | 描述 |
VS (Virtual Server) | 调度器,负责接收客户端请求,并根据负载均衡算法将请求转发到后端服务器。 |
RS (Real Server) | 服务端服务器,负责处理实际的业务请求。 |
CIP (Client IP) | 客户端请求的 IP 地址。 |
VIP (Virtual IP) | 虚拟 IP 地址,通常为公网 IP,直接面向用户的 IP 地址。 |
DIP (Director Server IP) | 调度器的内网 IP 地址,用于与后端服务器通信。 |
RIP (Real Server IP) | 后端服务端服务器的 IP 地址。 |
4\. LVS 的工作模式
LVS 主要有四种工作模式,每种模式都有其特点和适用场景:
- NAT 模式 (Network Address Translation):
- 请求和响应数据包都需要经过调度器 (VS)。
- 调度器 (VS) 成为系统瓶颈,性能受限。
- 支持端口映射,可以修改请求报文的目标端口。
- 服务端服务器 (RS) 可以是任意操作系统。
- 原理: 调度器 (VS) 修改请求报文的目标 IP 地址,将请求转发到后端服务器 (RS)。
- 特点:
- 适用场景: 适合小型集群,对性能要求不高,且需要修改目标端口的场景。
- DR 模式 (Direct Routing):
- 请求数据包经过调度器 (VS),响应数据包直接返回给客户端。
- 调度器 (VS) 性能压力较小,适合大型集群。
- 服务端服务器 (RS) 需要配置 VIP 地址,并设置
arp_ignore
和arp_announce
参数。 - 服务端服务器 (RS) 需要在同一个物理网络中。
- 原理: 调度器 (VS) 只修改请求报文的目的 MAC 地址,将请求转发到后端服务器 (RS)。
- 特点:
- 适用场景: 适合大型集群,对性能要求较高,且不需要修改目标端口的场景。
- TUN 模式 (IP Tunneling):
- 请求和响应数据包都需要经过调度器 (VS)。
- 调度器 (VS) 性能压力较大,适合跨网络的集群。
- 服务端服务器 (RS) 可以是任意操作系统。
- 原理: 调度器 (VS) 通过 IP 隧道将请求转发到后端服务器 (RS)。
- 特点:
- 适用场景: 适合跨网络的集群,需要将请求转发到不同的网络。
- Full-NAT 模式:
- 请求和响应数据包都需要经过调度器 (VS)。
- 调度器 (VS) 性能压力较大,适合需要隐藏服务端服务器 IP 地址的场景。
- 服务端服务器 (RS) 可以是任意操作系统。
- 原理: 调度器 (VS) 修改请求报文的源和目标 IP 地址,将请求转发到后端服务器 (RS)。
- 特点:
- 适用场景: 适合需要隐藏服务端服务器 IP 地址,且对性能要求不高的场景。
5\. LVS 的调度算法
LVS 支持多种调度算法,每种算法都有其特点和适用场景:
- 静态调度算法:
- RR (Round Robin): 轮询调度,将请求依次分配到后端服务器。
- WRR (Weighted Round Robin): 加权轮询调度,可以为每个服务器设置权重,权重越大,分配到的请求越多。
- SH (Source Hashing): 源地址哈希调度,根据客户端 IP 地址进行哈希,将请求分配到固定的服务器。适合解决 Session 共享问题。
- DH (Destination Hashing): 目标地址哈希调度,根据请求的目标地址进行哈希,将请求分配到固定的服务器。适合用于缓存服务器的负载均衡。
- 动态调度算法:
- LC (Least Connections): 最小连接数调度,将请求分配到连接数最少的服务器。适合用于长连接应用。
- WLC (Weighted Least Connections): 加权最小连接数调度,根据服务器的权重和连接数进行调度。
- SED (Shortest Expected Delay): 最短延迟调度,根据服务器的权重和连接数进行调度,优先调度延迟最小的服务器。适合用于需要快速响应的应用。
- NQ (Never Queue): 将请求分配到空闲的服务器,如果所有服务器都有连接,则使用 SED 算法。适合用于需要高吞吐量的应用。
- LBLC (Locality-Based Least Connections): 动态的 DH 算法,根据负载状态实现正向代理。适合用于需要根据负载状态进行动态调度的场景。
- LBLCR (LBLC with Replication): 带复制功能的 LBLC,解决 LBLC 负载不均衡问题。适合用于需要高可用性的场景。
6\. ipvsadm 工具
ipvsadm 是 LVS 的管理工具,用于添加、删除、修改 LVS 虚拟服务器和服务端服务器,以及查看 LVS 状态信息。
常用命令:
ipvsadm -A -t <VIP:端口> -s <算法>
: 添加虚拟服务器。ipvsadm -D -t <VIP:端口>
: 删除虚拟服务器。ipvsadm -a -t <VIP:端口> -r <RIP:端口> <模式>
: 添加服务端服务器。ipvsadm -d -t <VIP:端口> -r <RIP:端口>
: 删除服务端服务器。ipvsadm -l
: 查看 LVS 虚拟服务器列表。ipvsadm -n
: 以数字形式显示地址、端口等信息。
7\. LVS-NAT 负载均衡部署
架构图:
步骤:
- 配置调度器:
- 添加一块网卡,设置为仅主机模式。
- 开启路由转发功能:
net.ipv4.ip_forward = 1
- 安装 ipvsadm 软件:
yum install ipvsadm
- 添加虚拟服务器:
ipvsadm -A -t 12.0.0.1:80 -s rr
- 添加服务端服务器:
ipvsadm -a -t 12.0.0.1:80 -r 192.168.204.20:80 -m
- 添加服务端服务器:
ipvsadm -a -t 12.0.0.1:80 -r 192.168.204.30:80 -m
- 配置服务端服务器:
- 安装 Web 服务 (例如 Apache 或 Nginx)。
- 设置网关为调度器的内网 IP 地址。
- 配置客户端:
- 设置网关为调度器的内网 IP 地址。
8\. LVS-DR 负载均衡部署
示例:
- 配置调度器:
- 配置虚拟网卡,设置 VIP 地址:
IPADDR=192.168.204.188
,NETMASK=255.255.255.255
- 开启路由转发功能:
net.ipv4.ip_forward = 1
- 安装 ipvsadm 软件:
yum install ipvsadm
- 添加虚拟VIP:
ipvsadm -A -t 192.168.204.188:80 -s rr
- 添加服务端服务器IP:
ipvsadm -a -t 192.168.204.188:80 -r 192.168.204.20:80 -g
- 添加服务端服务器IP:
ipvsadm -a -t 192.168.204.188:80 -r 192.168.204.30:80 -g
- 配置服务端服务器:
- 安装 Web 服务 (例如 Apache 或 Nginx)。
- 配置回环网卡,设置 VIP 地址:
IPADDR=192.168.204.188
,NETMASK=255.255.255.255
- 设置
arp_ignore
和arp_announce
参数:net.ipv4.conf.all.arp_ignore = 1
,net.ipv4.conf.all.arp_announce = 2
- 配置客户端:
- 设置网关为调度器的内网 IP 地址。
9\. LVS 性能优化
- 优化调度算法: 选择合适的调度算法,例如 WRR 或 WLC,根据服务器的权重和连接数进行调度,提高性能和负载均衡。
- 优化健康检查: 合理设置健康检查间隔时间,避免过频繁的健康检查,减少调度器对后端服务器的压力。
- 使用
spread-checks
指令: 延迟发送健康检查,错峰处理,减少调度器对后端服务器的压力。 - 优化硬件配置: 使用高性能服务器、SSD 硬盘,提高 LVS 集群的整体性能。
10\. Keepalived + LVS 高可用负载均衡
Keepalived 是一款开源的高可用软件,专为 LVS 和 HAproxy 设计,提供故障自动切换 (Failover) 和节点健康状态检查 (Health Checking) 功能。它通过 VRRP (Virtual Router Redundancy Protocol) 协议实现高可用性,确保当调度器出现故障时,可以自动切换到备用调度器,保证服务的连续性。
Keepalived 的核心组件:
- VRRP stack: 负责发送心跳线,通告虚拟 IP (VIP) 和其他信息。
- Checkers: 负责检查后端服务器的健康状态。
- System call: 提供通用的模块,用于在 VRRP 协议状态转换时调用脚本。
- SMTP: 邮件组件,用于发送报警邮件。
- IPVS wrapper: 自动生成 LVS 规则。
- Netlink Reflector: 网络接口,用于将虚拟 IP (VIP) 地址漂浮到主调度器。
- WatchDog: 监控进程,确保 Keepalived 进程正常运行。
Keepalived 的工作原理:
Keepalived 通过 VRRP 协议实现高可用性,VRRP 协议是一种虚拟路由冗余协议,它将多个路由器虚拟成一个组,并选举出一个主路由器,负责处理流量。当主路由器出现故障时,备用路由器会自动接管主路由器的职责,确保服务的连续性。
Keepalived 的工作流程如下:
- Keepalived 启动后,会加入一个 VRRP 组,并选举出一个主节点。
- 主节点会定期发送心跳线,通告虚拟 IP (VIP) 和其他信息。
- 备用节点会接收心跳线,并根据优先级判断是否需要接管主节点。
- 当主节点出现故障时,备用节点会自动接管主节点的职责,并成为新的主节点。
- 当主节点恢复正常时,会根据抢占模式决定是否重新成为主节点。
VRRP 协议相关术语:
- 虚拟路由器: 不是真正存在的路由器,而是由多个物理路由器虚拟出来的一个组。
- 虚拟路由器标识 (VRID): 用于标识虚拟路由器组,同一个组的路由器才能使用 VRRP 协议。
- VIP (Virtual IP): 虚拟 IP 地址,也就是网关,对外提供服务的地址。
- VMAC (Virtual MAC): 虚拟路由器的 MAC 地址。
- Master: 主节点,负责处理流量。
- Backup: 备用节点,当主节点出现故障时,会自动接管主节点的职责。
- Priority: 优先级,优先级高的节点会成为主节点。
- Advert\_int: 心跳线报文发送间隔时间,单位为秒。
Keepalived 的三种抢占模式:
- 抢占式 (Preempt): 当主节点出现故障时,备用节点会接管主节点的职责。当主节点恢复正常时,会立即抢占主节点的职责。
- 非抢占式 (No Preempt): 当主节点出现故障时,备用节点会接管主节点的职责。当主节点恢复正常时,不会重新成为主节点,而是继续作为备用节点。
- 延迟抢占模式 (Preempt Delay): 当主节点出现故障时,备用节点会接管主节点的职责。当主节点恢复正常时,会延迟一段时间,等待主节点稳定后,再重新成为主节点。
Keepalived 的安装:
6.1 Yum 安装
注意: Yum 安装的 Keepalived 版本可能较旧,建议使用编译安装方式。
6.2 编译安装
7\. Keepalived 的配置文件
Keepalived 的配置文件通常位于 /etc/keepalived/keepalived.conf
,包含以下几个部分:
- 全局配置块 (GLOBAL CONFIGURATION): 定义邮件配置、
router_id
、VRRP 配置、组播地址等。 - 虚拟路由器设置 (VRRP CONFIGURATION): 定义 VRRP 协议中,每个 VRRP 虚拟路由器的规则、基本信息。
- LVS 设置 (LVS CONFIGURATION): 定义调度服务器和服务端服务器的规则设置。
8\. Keepalived 的配置示例
9\. Keepalived + LVS 的实验
实验环境:
- 主节点 (Master): 7-1 (192.168.125.100)
- 备用节点 (Backup): 7-2 (192.168.125.120)
- 服务端服务器1: 7-3 (192.168.125.130)
- 服务端服务器2: 7-5 (192.168.125.150)
- 虚拟 IP (VIP): 192.168.125.123
- 客户端: 7-6 (192.168.125.160)
步骤:
- 配置服务端服务器 (7-3 和 7-5):
- 安装 Web 服务 (例如 Apache 或 Nginx)。
- 创建访问页面,例如
echo "7-3 keepalived" > index.html
。 - 关闭长连接:
keepalive off
。
- 配置主节点 (7-1):
- 复制配置文件并备份:
cp keepalived.conf keepalived.conf.bak
。 - 编辑配置文件,设置
router_id
、interface
、virtual_ipaddress
等参数。 - 设置 LVS 模式为 DR:
lb_kind DR
。 - 设置服务端服务器信息,包括
weight
和TCP_CHECK
。 - 安装 ipvsadm 和 keepalived:
yum install ipvsadm keepalived
。 - 启动 ipvsadm 服务:
systemctl start ipvsadm
。 - 验证服务端服务器是否配置成功:
curl 192.168.125.130
和curl 192.168.125.150
。 - 配置 Keepalived:
- 重启 Keepalived 服务:
systemctl restart keepalived.service
。 - 查看虚拟 IP:
ip a
。
- 配置备用节点 (7-2):
- 安装 ipvsadm 和 keepalived:
yum install ipvsadm keepalived
。 - 启动 ipvsadm 服务:
systemctl start ipvsadm
。 - 复制主节点的 Keepalived 配置文件到备用节点。
- 编辑配置文件,将
state
设置为BACKUP
,priority
设置为低于主节点的优先级。 - 重启 Keepalived 服务:
systemctl restart keepalived.service
。
- 配置客户端 (7-6):
- 设置网关为调度器的内网 IP 地址。
- 测试主备切换:
- 关闭主节点的 Keepalived 服务,验证备用节点是否接管主节点职责。
- 重新启动主节点的 Keepalived 服务,验证主节点是否重新成为主节点。
10\. 抢占模式
Keepalived 支持三种抢占模式,可以根据实际需求选择合适的模式:
- 立即抢占模式 (Preempt): 当主节点出现故障时,备用节点会接管主节点的职责。当主节点恢复正常时,会立即抢占主节点的职责。
- 非抢占模式 (No Preempt): 当主节点出现故障时,备用节点会接管主节点的职责。当主节点恢复正常时,不会重新成为主节点,而是继续作为备用节点。
- 延迟抢占模式 (Preempt Delay): 当主节点出现故障时,备用节点会接管主节点的职责。当主节点恢复正常时,会延迟一段时间,等待主节点稳定后,再重新成为主节点。
11\. 修改单播和多播地址
- 修改多播地址: 在 Keepalived 配置文件中,使用
vrrp_mcast_group4
指令修改多播地址。 - 修改单播地址: 在 Keepalived 配置文件中,使用
unicast_src_ip
和unicast_peer
指令修改单播地址。
12\. 主备切换的通知脚本
Keepalived 可以通过脚本通知管理员主备切换事件。
- 定义脚本: 在 Keepalived 配置文件中,使用
notify_master
、notify_backup
和notify_fault
指令定义脚本路径。 - 编写脚本: 编写脚本,实现发送邮件、记录日志等功能。
13\. 脑裂问题
脑裂问题是指在高可用集群中,由于网络故障或其他原因,导致两个节点都认为自己是主节点,从而导致数据不一致或服务中断。
预防脑裂问题的方法:
- 使用双心跳线: 使用串行电缆和以太网电缆连接,确保即使一条线路断开,另一条线路也能正常工作。
- 使用 Fencing 设备: 使用 Fencing 设备,当检测到脑裂时,强行关闭一个心跳节点,避免两个节点都认为自己是主节点。
14\. Nginx + Keepalived 实验
实验环境:
- 调度服务器: 7-1 (192.168.125.100)
- 备用调度服务器: 7-2 (192.168.125.120)
- 服务端服务器1: 7-3 (192.168.125.130)
- 服务端服务器2: 7-5 (192.168.125.150)
- 虚拟 IP (VIP): 192.168.125.123
- 客户端: 7-6 (192.168.125.160)
步骤:
- 配置服务端服务器 (7-3 和 7-5):
- 安装 Web 服务 (例如 Apache 或 Nginx)。
- 创建访问页面,例如
echo "7-3 nginx" > index.html
。
- 配置服务端服务器 (7-1):
- 复制配置文件并备份:
cp keepalived.conf keepalived.conf.bak
。 - 编辑配置文件,设置
router_id
、interface
、virtual_ipaddress
等参数。 - 使用
vrrp_script
模块,定义一个脚本,用于检测 Nginx 是否正常运行。 - 使用
track_script
指令,将脚本添加到 Keepalived 的监控列表中。 - 编辑 Nginx 配置文件,添加
upstream
和location
配置。 - 安装 Nginx 和 Keepalived:
yum install nginx keepalived
。 - 启动 Nginx 服务:
systemctl start nginx
。 - 配置 Nginx 负载均衡:
- 复制 Nginx 配置文件到备用调度服务器 (7-2)。
- 配置 Keepalived:
- 重启 Keepalived 服务:
systemctl restart keepalived.service
。
- 配置备用调度服务器 (7-2):
- 复制配置文件并备份:
cp keepalived.conf keepalived.conf.bak
。 - 编辑配置文件,将
state
设置为BACKUP
,priority
设置为低于主调度服务器的优先级。 - 使用
vrrp_script
模块,定义一个脚本,用于检测 Nginx 是否正常运行。 - 使用
track_script
指令,将脚本添加到 Keepalived 的监控列表中。 - 安装 Nginx 和 Keepalived:
yum install nginx keepalived
。 - 启动 Nginx 服务:
systemctl start nginx
。 - 复制主调度服务器的 Nginx 配置文件到备用调度服务器。
- 配置 Keepalived:
- 重启 Keepalived 服务:
systemctl restart keepalived.service
。
- 配置客户端 (7-6):
- 设置网关为调度器的内网 IP 地址。
- 测试主备切换:
- 关闭主调度服务器的 Nginx 和 Keepalived 服务,验证备用调度服务器是否接管主调度服务器职责。
- 重新启动主调度服务器的 Nginx 和 Keepalived 服务,验证主调度服务器是否重新成为主节点。
15\. 总结
Keepalived + LVS 是构建高可用负载均衡集群的常见方案,可以有效地提高系统的性能、可用性和可靠性。通过本文档,您应该已经了解了 Keepalived 和 LVS 的基本概念、工作原理、部署步骤和性能优化等内容。希望这份指南能够帮助您更好地理解和使用 Keepalived + LVS,构建高性能、安全可靠的 Web 服务。
16\. 进一步学习
- Keepalived 官方网站: https://www.keepalived.org/
- Keepalived 文档: https://www.keepalived.org/
- LVS 官方网站: http://linuxvirtualserver.org/
- LVS 文档: http://linuxvirtualserver.org/
- LVS 模块: http://linuxvirtualserver.org/
注意:
- 以上配置示例仅供参考,请根据您的实际需求进行调整。
- 在进行任何配置更改之前,请务必备份您的配置文件,并进行测试以确保更改不会影响 LVS 或 Keepalived 的正常运行。
Keepalived + LVS 示例图:
说明:
- Keepalived 通过 VRRP 协议实现调度器的高可用性,主节点和备用节点之间通过心跳线进行通信,确保当主节点出现故障时,备用节点可以自动接管主节点的职责。
- LVS 负责将流量分配到多个服务端服务器,提高系统的性能和可靠性。
- 客户端只访问虚拟 IP (VIP),而不会直接访问服务端服务器。SS