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 install keepalived
注意: Yum 安装的 Keepalived 版本可能较旧,建议使用编译安装方式。
6.2 编译安装
yum install gcc curl openssl-devel libnl3-devel net-snmp-devel
wget https://keepalived.org/software/keepalived-2.2.2.tar.gz
tar xf keepalived-2.2.2.tar.gz
cd keepalived-2.2.2
./configure --prefix=/usr/local/keepalived
make
make install
7. Keepalived 的配置文件
Keepalived 的配置文件通常位于 /etc/keepalived/keepalived.conf
,包含以下几个部分:
-
全局配置块 (GLOBAL CONFIGURATION): 定义邮件配置、
router_id
、VRRP 配置、组播地址等。 -
虚拟路由器设置 (VRRP CONFIGURATION): 定义 VRRP 协议中,每个 VRRP 虚拟路由器的规则、基本信息。
-
LVS 设置 (LVS CONFIGURATION): 定义调度服务器和服务端服务器的规则设置。
8. Keepalived 的配置示例
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.125.123
}
}
virtual_server 192.168.125.123 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.201.100 443 {
```
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
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