1.什么是集群
集群是将多台独立服务器通过网络组合成一组逻辑整体,对外统一提供服务,解决单台服务器性能上限、单点故障问题
核心目标:高性能、高可用、高伸缩。
2.集群分类
1. 按功能目标划分
- 负载均衡集群 LB Cluster多台服务器分摊用户请求,提升并发承载能力,代表:LVS、Nginx、HAProxy。
- 高可用集群 HA Cluster解决单点故障,节点故障自动切换,保障服务不中断,代表:Keepalived、Heartbeat。
- 高性能计算集群 HPC Cluster拆分超大计算任务分发至多节点并行运算,多用于科学计算、大数据。
2. 按 OSI 工作层级划分
- 四层集群(传输层):LVS,基于 IP + 端口转发,性能极高;
- 七层集群(应用层):Nginx/HAProxy,可解析 HTTP 协议,支持 URL、Cookie 分发。
3.lvs的作用
核心作用:
- 流量分发:接收客户端请求,通过调度算法转发至后端 RS,分摊并发压力;
- 统一入口:对外暴露单一 VIP,屏蔽后端多台服务器细节;
- 高吞吐:内核态处理数据包,转发性能远超七层代理,支持十万级并发;
- 故障隔离:自动检测后端 RS 健康状态,下线故障节点,避免无效转发;
- 跨机房调度:TUN 模式支持跨公网、跨机房部署后端服务器。
4.lvs的4种模式及原理
1. NAT 模式(网络地址转换)
- 原理:调度器双网卡,客户端请求到达 Director 后,修改目标 IP 为 RS 内网 IP;RS 回包时,源 IP 统一改为 VIP,所有进出流量都经过 LVS。
- 特点:配置简单、支持端口映射;瓶颈在 LVS,适合中小规模集群。
2. DR 模式(直接路由,生产最常用)
- 原理:仅修改二层 MAC 地址转发,IP 全程不变;RS 直接将响应包返回客户端,回包不经过 LVS。
- 特点:性能最优、吞吐量高;要求所有节点同网段,RS 需绑定 VIP 在 lo 回环网卡。
3. TUN 模式(IP 隧道)
- 原理:Director 给请求数据包新增一层 IP 隧道封装,通过公网转发至跨机房 RS;RS 解封装后直接回包客户端。
- 特点:支持跨机房、跨网段部署;需要 RS 内核开启 IP 隧道模块。
4. Full-NAT 模式(完整 NAT)
- 原理:同时修改请求包源 IP + 目标 IP,客户端 IP 转换为 LVS 内网 IP,RS 网关无需指向 Director;回包时反向转换。
- 特点:解决 NAT 模式 RS 网关限制,后端可跨网段;开销高于 DR,云环境常用。
5.lvs的13种算法
静态调度(4 种)
- RR 轮询:请求依次循环分发,不区分服务器负载;
- WRR 加权轮询:给服务器分配权重,权重越高分配请求越多;
- SH 源地址哈希:同一客户端 IP 永远调度至同一 RS,天然实现会话粘滞;
- DH 目标地址哈希:同一目标 IP 请求固定分发至同一 RS,多用于正向代理缓存。
动态调度(9 种)
- LC 最小连接:选择当前活跃连接数最少的 RS;
- WLC 加权最小连接(默认):按权重与连接数比值调度,权重高、连接少的服务器优先;
- LBLC 基于本地最小连接:缓存场景,优先分发访问过目标资源的 RS;
- LBLCR 带复制的本地最小连接:LBLC 优化,多节点共享缓存数据;
- SED 最短预期延迟:公式
(连接数+1)*1000/权重,数值最小优先; - NQ 永不排队:空闲 RS 优先分配,无空闲时使用 SED 算法;
- FO 加权公平队列:按权重分配队列长度;
- OVF 溢出调度:限制单节点最大连接阈值;
- MH 多目标哈希:支持源 IP + 目标 IP + 端口组合哈希,多端口场景专用。
6.lvs的多端口轮询问题解决方案
在Director上打防火墙标记
iptables -t mangle -A PREROUTING -d 192.168.1.100 -p tcp --dport 80 -j MARK --set-mark 6666
iptables -t mangle -A PREROUTING -d 192.168.1.100 -p tcp --dport 443 -j MARK --set-mark 6666
ipvsadm -A -f 6666 -s rr
添加RS1(同时服务80和443) ipvsadm -a -f 6666 -r 192.168.1.10 -g # 添加RS2(同时服务80和443) ipvsadm -a -f 6666 -r 192.168.1.11 -g
7.lvs的会话粘滞解决方案
[root@director ~]# dnf install -y ipvsadm
[root@director ~]# ip addr add 192.168.0.200/32 dev eth1 label eth1:0
[root@rs1 ~]# ip addr add 192.168.0.200/32 dev lo label lo:0
[root@rs1 ~]# sysctl -w net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_ignore = 1
[root@rs1 ~]# sysctl -w net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.lo.arp_announce = 2
[root@rs1 ~]# sysctl -w net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_ignore = 1
[root@rs1 ~]# sysctl -w net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.arp_announce = 2
RS2上同理
[root@rs1 ~]# dnf install -y httpd
[root@rs1 ~]# echo "RS1 (192.168.0.10)" > /var/www/html/index.html
[root@rs1 ~]# systemctl start httpd
client
[root@client ~]# for i in {1..10}; do curl 192.168.0.200; done
RS2 (192.168.0.20)
RS2 (192.168.0.20)
RS2 (192.168.0.20)
RS2 (192.168.0.20)
RS2 (192.168.0.20)
RS2 (192.168.0.20)
RS2 (192.168.0.20)
RS2 (192.168.0.20)
RS2 (192.168.0.20)
RS2 (192.168.0.20)