LVS简介
LVS (Linux Virtual Server) 是一个基于 Linux 内核的负载均衡集群技术。它通过 IP 负载均衡技术和基于内容请求分发技术,将访问请求分发到多个服务器上,从而实现整个服务器集群对外提供高可用性和高性能的服务。
作用
- 提高响应速度:通过将请求分发到多台服务器,可以显著减少单一服务器的压力,提高响应速度。
- 增加系统可用性:当某一台后端服务器出现问题时,LVS 可以将其从服务池中剔除,确保用户仍然能够访问其他健康的服务器。
- 负载均衡:合理分配流量,防止过载。
LVS的优势与不足
优势:
- 成本低:使用开源软件构建,无需额外购买昂贵的硬件或软件。
- 高性能:能够处理大量并发连接。
- 高可用性:通过故障检测机制确保服务不中断。
- 易于扩展:可以通过增加更多的后端服务器来轻松扩展系统。
不足:
- 配置复杂度较高:对于初学者来说可能需要花费较多的时间学习和配置。
- 调试困难:问题排查可能较为复杂,尤其是在大型部署环境中。
- 缺乏高级特性:与商业解决方案相比,在某些高级功能方面可能存在局限。
LVS专业术语
- Director:负责接收客户端请求并根据调度算法选择后端服务器进行转发。
- Real Server:实际处理客户端请求的服务节点。
- Scheduler:位于 Director 中的模块,用于决定将请求转发给哪个 Real Server。
集群简介
集群是指一组相互连接的计算机协同工作以完成特定任务的集合。集群可以提供更高的可用性、负载均衡和计算能力。
分布式简介
分布式系统是由多台独立计算机组成的网络,这些计算机通过通信协议相互通信和协作,共同完成一个或多个任务。分布式系统可以跨越不同的地理位置。
LVS集群体系结构
LVS 架构主要包括以下几个部分:
- 前端(Director):接收外部请求的入口。
- 后端(Real Server):处理实际业务逻辑的服务器。
- 调度器(Scheduler):决定如何将请求分发给后端服务器。
第一层:负载调度器(Load Balancer / Scheduler)
- 职责:接收客户端的请求,并根据一定的调度算法选择合适的后端服务器进行转发。
- 实现:在 LVS 中,这一层通常由运行在 Linux 内核中的调度器实现,例如 IPVS(IP Virtual Server)模块。
- 示例:NAT、DR 或 TUN 模式的调度器。
第二层:服务器池(Server Pool / Real Servers)
- 职责:处理负载调度器转发过来的请求,并返回结果。
- 实现:由一组实际的服务器组成,它们可以是物理服务器也可以是虚拟机。
- 示例:Web 服务器、应用服务器等。
第三层:共享存储(Shared Storage)
- 职责:提供数据的一致性和高可用性,确保所有服务器都能访问相同的最新数据。
- 实现:可以通过 NFS、SAN、NAS 或分布式文件系统等多种技术实现。
- 示例:NFS 共享文件系统、Ceph 分布式存储等。
LVS 集群体系结构示意图
这里是一个简化的 LVS 集群体系结构示意图:
+------------------+ +----------------+ +----------------+ | Load Balancer | ----> | Server Pool | ----> | Shared Storage | | (Scheduler) | | (Real Servers) | | | +------------------+ +----------------+ +----------------+
LVS 集群的工作流程
- 客户端发起请求:客户端向虚拟 IP 地址发送请求。
- 负载调度器接收请求:负载调度器接收到请求后,根据设定的调度算法选择一台合适的服务器。
- 请求转发:负载调度器将请求转发到选定的后端服务器。
- 服务器处理请求:后端服务器处理请求,并从共享存储中获取必要的数据。
- 响应返回:后端服务器处理完请求后,将响应发送回客户端。
- 负载调度器处理响应:在某些模式下(如 NAT 模式),负载调度器可能会参与响应的处理,以确保正确的 IP 地址转换。
注意事项
- NAT 模式:在 NAT 模式下,所有的请求和响应都需要经过负载调度器。
- DR 模式:在 DR 模式下,请求和响应直接在客户端和服务器之间传输,负载调度器仅负责请求的转发。
- TUN 模式:在 TUN 模式下,请求和响应也直接在客户端和服务器之间传输,负载调度器通过 IP 封装技术进行转发。
这种三层架构确保了 LVS 集群不仅能够高效地处理高并发请求,还能够保证数据的一致性和高可用性。
LVS集群的类型
LVS 支持三种基本的集群架构:
- NAT (Network Address Translation):通过 NAT 进行地址转换。
- DR (Direct Routing):直接路由。
- TUN (IP Tunneling):IP 封装隧道。
LVS负载均衡四种工作模式
NAT模式
- 在此模式下,Director 收到客户端的请求后,将请求的目的 IP 地址改为后端服务器的 IP 地址,并转发给该服务器。
- 后端服务器直接回应给 Director,Director 再将响应包中的源 IP 地址改回虚拟服务 IP,然后转发给客户端。
- 优点是简单易用,但 Director 是瓶颈,且后端服务器需要和 Director 在同一个子网内。
DR模式
- Director 和后端服务器共享同一个物理网络接口地址。
- Director 收到请求后,改变 MAC 地址并转发给后端服务器,后端服务器直接回应客户端。
- 适合大规模的集群环境,但所有服务器必须在同一广播域内。
TUN模式
- Director 使用 IP 封装技术将请求发送给后端服务器。
- 后端服务器解封装后处理请求,并直接回应客户端。
- 适合地理位置分散的集群。
Fullcone模式
- Fullcone 模式是在 DR 模式的基础上,允许 Director 对不同的客户端使用不同的 MAC 地址进行转发。
- 这种模式适用于需要在不同子网之间转发的情况。
LVS的调度算法
LVS 的调度算法决定了如何将请求分发到后端的 Real Server 上。这些算法可以根据不同的策略来优化负载均衡效果,提高系统的整体性能和可用性。LVS 支持多种调度算法,分为静态和动态两大类。
LVS静态调度算法
静态调度算法是指在调度过程中不考虑后端服务器的实际负载情况,而是按照一定的规则来进行调度。
- 轮询(Round Robin, RR):按顺序轮流将请求分发到每一台后端服务器。
- 加权轮询(Weighted Round Robin, WRR):为每台服务器分配一个权重值,按照权重比例轮流分发请求。
- 最少连接(Least Connections, LC):将新的请求分发给当前连接数最少的服务器。
- 加权最少连接(Weighted Least Connections, WLC):为每台服务器分配一个权重值,按照权重和当前连接数的比例来选择服务器。
LVS动态调度算法
动态调度算法是指在调度过程中考虑后端服务器的实际负载情况,以达到最优的负载均衡效果。
- 最短预期延迟(Shortest Expected Delay, SED):基于服务器的负载情况和历史响应时间,选择最合适的服务器。这要求 LVS 能够收集到每台服务器的实时状态信息。
- 加权最短预期延迟(Weighted Shortest Expected Delay, WSED):为每台服务器分配一个权重值,并结合服务器的当前负载和历史响应时间来选择服务器。
LVS常见调度算法
以下是 LVS 中一些常见的调度算法:
- 轮询(Round Robin, RR)
- 最少连接(Least Connections, LC)
- 最短预期延迟(Shortest Expected Delay, SED)
- 加权轮询(Weighted Round Robin, WRR)
- 加权最少连接(Weighted Least Connections, WLC)
- 加权最短预期延迟(Weighted Shortest Expected Delay, WSED)
ipvsadm
ipvsadm
是一个用于管理 LVS 的命令行工具。它可以用来创建、修改和删除 LVS 的服务定义和服务实例。以下是一些 ipvsadm
常见的操作命令:
语法
ipvsadm -A|E -t|u|f <集群服务地址> [-s <调度算法>] [-p <超时时间>] [-M <掩码>] [-b <标志>] ipvsadm -D -t|u|f <集群服务地址> ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f <集群服务地址> -r <真实服务器地址> [选项] ipvsadm -d -t|u|f <集群服务地址> -r <真实服务器地址> ipvsadm -L|l [options] ipvsadm -Z [-t|u|f <集群服务地址>] ipvsadm --set <超时时间> ipvsadm --start-daemon <主或备> [--mcast-interface <组播接口>] [--syncid <SID>] ipvsadm --stop-daemon <主或备> ipvsadm -h
子命令
--add-service -A 添加一个集群服务,需要使用选项 --edit-service -E 编辑一个集群服务,需要使用选项 --delete-service -D 删除指定集群服务,需要使用选项 --clear -C 删除所有集群服务,包括真实服务器转发策略规则 --restore -R 从标准输入中恢复策略规则 --save -S 保存策略规则到标准输出 --add-server -a 添加一个真实服务器,需要使用选项 --edit-server -e 编辑一个真实服务器,需要使用选项 --delete-server -d 删除一个真实服务器,需要使用选项 --list -L|-l 查看集群服务列表,包括真实服务器转发策略规则 --zero -Z 计数器清零。清除连接数、包转发等数量统计信息 --set <超时时间> 设置TCP、TCPFIN(TCP关闭连接状态)、UDP连接超时时间,用于 会话保持。一般情况下TCP和UDP超时时间保持默认就好,TCPFIN 可以根据情况设定,指定它则用户请求连接关闭,该连接则会变 为非活跃(InActive)空闲等待状态,在空闲等待时间内,如果 来自同一源IP的请求,则还会转发给后端的同一台真实服务器上 --start-daemon 开启连接同步守护进程。在选项后面指定自己是Master(主)还 是backup(备),主负载调度器会同步所有策略及连接状态到备 负载调度器,当主故障,备可以接替其工作 --stop-daemon 停止连接同步守护进程 --help -h 显示帮助信息
选项
--tcp-service -t <集群服务地址> 允许集群服务使用的传输协议为TCP。<IP:Port> --udp-service -u <集群服务地址> 允许集群服务使用的传输协议为UDP。<IP:Port> --fwmark-service -f <防火墙标识> 使用一个整数值来防火墙标识集群服务,而不是地址、 端口和协议使用它,我们可以通过结合IPtables将多 个以调度器为目标的端口定义成一个防火墙标识,由 ipvsdam通过此项关联标识,则可以实现对一个IP多 端口调度,即实现后端服务器可以开放多个服务 --scheduler -s scheduler 指定集群服务使用的调度算法:rr|wrr|lc|wlc|lblc |lblcr|dh|sh|sed|nq,默认为wlc --persistent -p <超时时间> 开启持久化服务,开启它则表示在指定时间内,来自同 一IP的请求都会转发到后端同一台真实服务器上 --netmask -M <网络掩码> 使用网络掩码来屏蔽持久化来源IP的地址范围,默认值 为255.255.255.255,即所有来源IP请求都会享受持久 化服务 --real-server -r <真实服务器地址> 指定真实服务器的主机IP与端口 --gatewaying -g 指定真实服务器转发工作模式,使用DR模式,默认 --ipip -i 指定真实服务器转发工作模式,使用TUN模式 --masquerading -m 指定真实服务器转发工作模式,使用NAT模式 --weight -w <权重值> 指定真实服务器的权重值 --u-threshold -x <上阀值> 设置转发请求的最大上连接阀值,范围为0~65535,当 当连接数超过指定上限时,LVS则不会转发请求 --l-threshold -y <下阀值> 设置转发请求的下连接阀值,范围为0~65535,当连接 数降低至指定值时,LVS则继续提供服务,默认值为0 --mcast-interface interface 设置用于连接同步守护进程的组播接口 --syncid sid 设置连接同步守护进程的SID号,用于标识,范围0~255 --connection -c 显示连接信息,一般与"-l"连用 --timeout 显示TCP、TCPFIN、UDP超时时间信息,一般与"-l"连用 --daemon 显示连接同步守护信息,一般与"-l"连用 --stats 显示统计信息,一般与"-l"连用 --rate 显示转发速率信息,一般与"-l"连用 --exact 显示数据包和字节计数器的确切值,扩大字符长度 --thresholds 显示阀值信息,一般与"-l"连用 --persistent-conn 显示持久化连接信息,一般与"-l"连用 --numeric -n 地址和端口以数字格式显示,一般与"-l"连用 --sched-flags -b <标识> 设置调度算法的范围标识,用于SH算法,有两个标识: sh-fallback,如果真实服务器不可用,则将其转发到 其他真实服务器上。 sh-port,将源地址的端口号也添加到散列键=值中
ipvsadm
提供了强大的灵活性来管理 LVS 的配置,使其成为 LVS 日常管理和维护的重要工具之一。
实验项目
第一部分 NAT模式
node | IP | VIP | role | method |
---|---|---|---|---|
LVS | 192.168.0.100 | 172.25.250.100 | 调度器 | NAT、仅主机 |
RS1 | 192.168.0.10 | 空 | 服务器1 | 仅主机 |
RS2 | 192.168.0.20 | 空 | 服务器2 | 仅主机 |
client | 172.25.250.200 | 空 | 客户端 | NAT |
网络配置信息
LVS网络配置
cat /etc/NetworkManager/system-connections/eth0.nmconnection cat /etc/NetworkManager/system-connections/eth1.nmconnection
(文件名可能不同,自行查看)
RS网络配置
同上查看方法
client网络配置
方便辨识以下更改主机名,方法如下:
hostnamectl set-hostname lvs
更改后重新打开终端即可
第二部分 在LVS中启用内核路由功能
[root@lvs ~]# sysctl -a | grep ip_forward net.ipv4.ip_forward = 0 net.ipv4.ip_forward_update_priority = 1 net.ipv4.ip_forward_use_pmtu = 0 [root@lvs ~]# [root@lvs ~]# vim /etc/sysctl.conf [root@lvs ~]# [root@lvs ~]# sysctl -p net.ipv4.ip_forward = 1 [root@lvs ~]# [root@lvs ~]# cat /etc/sysctl.conf # sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/. # # Vendors settings live in /usr/lib/sysctl.d/. # To override a whole file, create a new file with the same in # /etc/sysctl.d/ and put new settings there. To override # only specific settings, add a file with a lexically later # name in /etc/sysctl.d/ and put new settings there. # # For more information, see sysctl.conf(5) and sysctl.d(5). net.ipv4.ip_forward=1
安装ipvsadm
yum install ipvsadm -y
添加调度策略
ipvsadm -A -t 172.25.250.100:80 -s rr ipvsadm -a -t 172.25.250.100:80 -r 192.168.0.10:80 -m ipvsadm -a -t 172.25.250.100:80 -r 192.168.0.20:80 -m
查看调度策略
[root@lvs ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.25.250.100:80 rr -> 192.168.0.10:80 Masq 1 0 0 -> 192.168.0.20:80 Masq 1 0 0
保存策略
[root@lvs ~]# ipvsadm -Sn -A -t 172.25.250.100:80 -s rr -a -t 172.25.250.100:80 -r 192.168.0.10:80 -m -w 1 -a -t 172.25.250.100:80 -r 192.168.0.20:80 -m -w 1 [root@lvs ~]# cat /etc/sysconfig/ipvsadm -A -t 172.25.250.100:80 -s rr -a -t 172.25.250.100:80 -r 192.168.0.10:80 -m -w 1 -a -t 172.25.250.100:80 -r 192.168.0.20:80 -m -w 1
设置开机启动
systemctl enable --now ipvsadm.service
第三部分 RS1和RS2中配置服务并测试
设置web服务
安装httpdnf install httpd -y
[root@rs1 ~]# echo RS1 > /var/www/html/index.html [root@rs1 ~]# systemctl restart httpd [root@rs2 ~]# echo RS2 > /var/www/html/index.html [root@rs2 ~]# systemctl restart httpd
client客户端测试
测试LVS调度器的VIP
[root@client ~]# for i in {1..10} > do > curl 172.25.250.100 > done RS1 RS2 RS1 RS2 RS1 RS2 RS1 RS2 RS1 RS2
防火墙标签解决轮询错误
在RS中安装mod_ssl并重启apache
yum install mod_ssl -y systemctl restart httpd
设定端口标签
iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666
设定调度规则
[root@lvs ~]# ipvsadm -C [root@lvs ~]# ipvsadm -A -f 666 -s rr [root@lvs ~]# ipvsadm -a -f 666 -r 192.168.0.10 -g [root@lvs ~]# ipvsadm -a -f 666 -r 192.168.0.20 -g [root@lvs ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn FWM 666 rr -> 192.168.0.10:0 Route 1 0 0 -> 192.168.0.20:0 Route 1 0 0 [root@lvs ~]# systemctl restart ipvsadm.service [root@lvs ~]# cat /etc/sysconfig/ipvsadm -A -f 666 -s rr -a -f 666 -r 192.168.0.10:0 -g -w 1 -a -f 666 -r 192.168.0.20:0 -g -w 1
client客户端测试
[root@client ~]# curl -k https://192.168.0.200 RS1 [root@client ~]# curl -k https://192.168.0.200 RS2 [root@client ~]# curl -k https://192.168.0.200;curl 192.168.0.200 RS1 RS2