目录
IPVS
1.1 简介
IPVS (IP Virtual Server)是在 Netfilter 上层构建的,并作为 Linux 内核的一部分,实现传输层负载均衡。
IPVS 集成在 LVS(Linux Virtual Server,Linux 虚拟服务器)中,它在主机上运行,并在物理服务器集群前作为负载均衡器。IPVS 可以将基于 TCP 和 UDP 服务的请求定向到真实服务器,并使真实服务器的服务在单个IP地址上显示为虚拟服务。
1、Netfilter
Netfilter 中定义了五个关于 IPv4 的 hook,对这些符号的声明可以在 https://elixir.bootlin.com/linux/v5.11.2/source/include/uapi/linux/netfilter_ipv4.h#L18 中找到,可用的 IP HOOK 如下:
#define NF_IP_PRE_ROUTING 0 // 在进行完整性检查之后,当数据包刚进入网络层还未进行路由选择时,可以截获接收的所有报文,包括目的地址是自己的报文和需要转发的报文;目的IP地址转换在此点,常用于源地址转换(SNAT)
#define NF_IP_LOCAL_IN 1 // 数据包经过路由决策后,如果目的是本机,则在传递给本地进程之前触发此 hook 点,可以截获目的地址是自己的报文,INPUT 包过滤在这里进行
#define NF_IP_FORWARD 2 // 当数据包的目的是其他机器,需要被路由器转发时触发此 hook 点,用于处理转发数据包的过滤 ,FORWARD 在这里进行过滤
#define NF_IP_LOCAL_OUT 3 // 可以截获自身发出的所有报文(不包括转发),当数据包从本机发出,在进入网络层之前触发此 hook 点,OUTPUT 过滤在这里进行
#define NF_IP_POST_ROUTING 4 // 数据包在即将离开主机通过网络设备发送出去之前触发此 hook 点,可以截获发送的所有报文,包括自身发出的报文和转发的报文,用于目的地址转换(DNAT)和最终的包处理
注:hook 是指在网络栈处理数据包的不同阶段提供给内核模块或用户空间程序介入的点。这些 hook 点允许对经过的数据包进行过滤、地址转换、监控等操作。
在 hook 函数完成了对数据包所需的任何的操作之后,它们必须返回下列预定义的 Netfilter 返回值中的一个:
#define NF_DROP 0 // 丢弃数据包,不在继续
#define NF_ACCEPT 1 // 正常传输报文
#define NF_STOLEN 2 // Netfilter 模块接管该报文,不再继续传输
#define NF_QUEUE 3 // 对该数据报进行排队,通常用于将数据报提交给用户空间进程处理
#define NF_REPEAT 4 // 再次调用该钩子函数
#define NF_STOP 5 // 继续正常传输报文
注:NF_ACCEPT 和 NF_STOP 都表示报文通过了检查,可以正常向下流通。
NF_ACCEPT 表示报文通过了某个 HOOK 函数的处理,下一个 HOOK 函数可以接着处理了
NF_STOP 表示报文通过了某个 HOOK 函数的处理,后面的 HOOK 函数你们就不要处理了
2、IPVS原理
IPVS工作原理如下:
- 1.IPVS通过拦截到达负载均衡器的数据包,并根据预先配置的规则进行转发。
- 2.IPVS维护一个虚拟服务地址(Virtual Service Address),将客户端的请求转发给后端的真实服务器(Real Server)。
- 3.IPVS支持多种负载均衡算法,如轮询、加权轮询、最少连接等,根据配置选择合适的算法进行转发。
- 4.IPVS还提供会话保持(Session Persistence)的功能,确保同一客户端的请求都转发到同一后端服务器,保持会话的连续性。
3、IPVS的功能和优势
- 高性能:IPVS是基于内核的负载均衡解决方案,具有卓越的性能和吞吐量。它利用多核处理、零拷贝技术等优化手段,能够应对高并发和大流量的网络环境。
- 扩展性:IPVS支持水平扩展,可以通过添加更多的真实服务器来增加系统的容量和负载能力。
- 灵活的负载均衡算法:IPVS提供多种负载均衡算法,可以根据实际需求选择合适的算法,如轮询、加权轮询、最少连接等,以实现更精细的负载均衡策略。
- 会话保持:IPVS支持会话保持功能,确保同一客户端的请求都转发到同一后端服务器,保持会话的连续性,适用于需要保持状态的应用场景。
- 高可用性:IPVS可以自动检测后端服务器的状态,当有服务器故障时,会自动将请求转发到其他正常的服务器,提供高可用性的服务。
4、IPVS转发模式
IPVS有三种转发模式:
- DR模式(Direct Routing):客户端的请求包到达负载均衡器的虚拟服务IP端口后,负载均衡器不会改写请求包的IP和端口,但是会改写请求包的MAC地址为后端RS的MAC地址,然后将数据包转发;真实服务器处理请求后,响应包直接回给客户端,不再经过负载均衡器。
- 特点:在Direct Routing模式下,LB(负载均衡器)不修改数据包的IP地址,而是修改数据包的MAC地址,直接将数据包转发到后端服务器。响应数据包直接从后端服务器返回给客户端,不经过LB。
- 使用场景:适用于客户端和服务器在同一个子网,且服务器需要处理大量并发连接的场景。例如,大规模Web服务或应用,其中每个请求都是独立的,不需要维持持久连接。
- NAT模式(Network Address Translation)
- 特点:在NAT模式下,负载均衡器(LB)对进入的数据包进行目的地址转换(DNAT),将目的IP改为后端服务器的IP。对传出的数据包进行源地址转换(SNAT),将源IP改为LB的IP。这种方式隐藏了后端服务器的真实IP地址。
- 使用场景:适用于客户端和服务器不在同一个网络子网,或者需要隐藏服务器真实IP地址的场景。例如,当需要对外提供一个统一的服务接口,同时后端有多个服务器处理请求时。
- IPIP模式(IP Tunneling):
- 特点:IP Tunneling模式通过在IP数据包内封装另一个IP数据包来实现跨网络的负载均衡。LB将原始数据包封装在一个新的IP数据包中,源地址和目的地址分别为LB和后端服务器的IP,然后转发给后端服务器。后端服务器解封装后处理原始数据包。
- 使用场景:适用于客户端和服务器不在同一个网络子网,需要跨子网进行负载均衡的场景。例如,当后端服务器分布在不同的子网或数据中心,而客户端需要访问统一的服务接口时
5、IPVS支持的调度算法
对于后端的RS集群,LB是如何决策应该把消息调度到哪个RS节点呢?这是由负载均衡调度算法决定的。IPVS常用的调度算法有:
- 轮询(Round Robin):LB认为集群内每台RS都是相同的,会轮流进行调度分发。从数据统计上看,RR模式是调度最均衡的。
- 加权轮询(Weighted Round Robin):LB会根据RS(真实服务器)上配置的权重,将消息按权重比分发到不同的RS上。可以给性能更好的RS节点配置更高的权重,提升集群整体的性能。
- 最小连接数(Least Connections):LB会根据和集群内每台RS的连接数统计情况,将消息调度到连接数最少的RS节点上。在长连接业务场景下,LC算法对于系统整体负载均衡的情况较好;但是在短连接业务场景下,由于连接会迅速释放,可能会导致消息每次都调度到同一个RS节点,造成严重的负载不均衡。
- 加权最小连接数(Weighted Least Connections):最小连接数算法的加权版
- 地址哈希(Address Hash):LB上会保存一张哈希表,通过哈希映射将客户端和RS节点关联起来
6、IPVS应用场景
IPVS广泛应用于各种网络应用中,特别适用于以下场景:
- 高访问量的Web服务:通过IPVS实现负载均衡,分摊请求压力,提升系统的响应速度和可用性。
- 分布式应用架构:在分布式环境中,使用IPVS可以轻松实现负载均衡和扩展性,提供高可用的服务。
- 实时时通信:IPVS可以作为负载均衡器,用于实时通信应用,如聊天、游戏等,确保稳定和低延迟的连接。
1.2 ipvsadm
在Linux服务器环境中,ipvsadm是管理IP虚拟服务器(IPVS)功能不可或缺的工具
1、ipvsadm命令说明
ipvsadm用于设置、维护或查看Linux内核中的虚拟服务表。它是在LVS(Linux Virtual Server)项目中使用的,主要用于实现服务器负载均衡。
2、基本语法
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [–pe persistence_engine] [-b sched-flags]
参数说明:
- –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:查看所有信息
- –set tcp tcpfin udp:设置连接超时时间
- –start-daemon:启动连接同步守护进程
- –stop-daemon:停止连接同步守护进程
- –help -h:获取帮助信息
- –tcp-service -t service-address:service-address 是 host[:port]
- –udp-service -u service-address:service-address 是 host[:port]
- –fwmark-service -f fwmark:Fwmark是一个大于0的整数
- –ipv6 -6:fwmark使用ipv6
- –scheduler -s scheduler:使用什么轮询算法,包括:rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认是 wlc
- –persistent -p [timeout]:持续的服务
- –netmask -M netmask:持久粒度掩码
- –real-server -r server-address:server-address是主机(和端口)
- –gatewaying -g:DR模式
- –ipip -i: ipip模式
- –masquerading -m:NAT模式
- –weight -w weight:权重
- –u-threshold -x uthreshold:连接上限阈值
- –l-threshold -y lthreshold:连接下限阈值
- –mcast-interface interface:连接同步的多播接口
- –syncid sid:连接同步的同步ID(默认=255)
- –connection -c:当前IPVS连接的输出 - 显示当前由IPVS管理的所有连接的状态和详细信息。
- –timeout:超时(TCP、TCPFIN、UDP)的输出 - 显示TCP、TCPFIN(TCP FIN包超时,用于关闭连接)和UDP连接的超时设置。
- –daemon:守护进程信息的输出 - 提供关于IPVS守护进程(如果适用)的状态和配置信息。
- –stats:统计信息的输出 - 显示有关负载均衡器性能和连接处理的统计数据
- –rate:速率信息的输出 - 提供关于流量速率和连接速率的详细信息
- –exact:展开数字(显示精确值) - 在输出中显示完整的数字,而不是简化的或格式化的值。
- –thresholds:阈值信息的输出 - 显示连接、负载等的阈值设置
- –persistent-conn:持久连接信息的输出 - 显示关于持久连接(客户端IP到服务器的映射在一段时间内保持不变)的详细信息。
- –nosort:禁用服务/服务器条目的排序输出 - 在显示服务或服务器列表时,不按照特定顺序(如字母顺序)进行排序。
- –sort:不执行任何操作,用于向后兼容 - 某些选项或参数可能保留在配置中,但不执行任何操作,以保持与旧版本或旧配置的兼容性。
- –ops -o:单包调度 - 一种调度算法,可能基于接收到的单个数据包的内容或属性来做出调度决策。
- –numeric -n:地址和端口的数字输出 - 在输出中,地址和端口号以数字形式(而不是尝试解析为主机名或服务名)显示。
- –sched-flags -b flags:调度器标志(逗号分隔) - 调度器使用的附加选项或标志,以逗号分隔的列表形式提供,用于调整调度器的行为。
3、常用示例
# 1、添加负载均衡服务
## 添加一个负载均衡服务,IP地址为192.168.0.1,端口为80,使用轮询(round-robin)算法:
ipvsadm -A -t 192.168.0.1:80 -s rr
# 2、关联真实服务器
### 添加实际处理请求的服务器到上述服务配置中
ipvsadm -a -t 192.168.0.1:80 -r 192.168.0.2:80 -g
ipvsadm -a -t 192.168.0.1:80 -r 192.168.0.3:80 -g
# -g指定了DR模式
# 3、查看配置
ipvsadm -L -n
#### 输出
# ipvs的版本
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.96.0.1:443 rr
-> 192.168.92.10:6443 Masq 1 3 0
TCP 10.96.0.10:53 rr
-> 10.244.206.193:53 Masq 1 0 0
-> 10.244.206.194:53 Masq 1 0 0
TCP 10.96.0.10:9153 rr
-> 10.244.206.193:9153 Masq 1 0 0
-> 10.244.206.194:9153 Masq 1 0 0
UDP 10.96.0.10:53 rr
-> 10.244.206.193:53 Masq 1 0 0
-> 10.244.206.194:53 Masq 1 0 0
### 参数解释
Prot:表示使用的协议类型,常见的值有 TCP、UDP 或 FWM(表示防火墙标记)。
LocalAddress:Port:表示虚拟服务器的本地地址和端口,也就是客户端连接的目标地址和端口。
Scheduler:表示使用的负载均衡调度算法,例如 rr(轮询)、lc(最少连接)、wrr(加权轮询)、wlc(加权最少连接)等。
Flags:显示虚拟服务器的特定标志,例如:
F 表示持久连接(floating forward),即连接请求被转发到同一个后端服务器。
T 表示TCP标志,如果是 U 则表示UDP。
M 表示多播。
N 表示NAT模式。
G 表示直接路由模式。
RemoteAddress:Port:表示转发到的后端真实服务器的地址和端口。
Forward:表示使用的转发方法,例如 Masquerade(源地址伪装)、Tunnel(隧道)、Direct Routing(直接路由)等。
Weight:表示后端服务器的权重,用于加权调度算法。
ActiveConn:表示当前活动连接的数量,即有多少个连接正在使用该后端服务器。
InActConn:表示非活动连接的数量,即处于非活动状态的连接数量。
总结
ipvs(IP Virtual Server)是LVS软件的核心,运行在Linux内核空间,负责实际的负载均衡处理。它是一个基于IP层的负载均衡器,能够处理TCP、UDP等协议的请求,并根据配置的调度算法将请求转发到后端的真实服务器(Real Server)。
ipvsadm是ipvs的用户空间管理工具,运行在用户空间,用于配置、维护和查看ipvs内核模块的状态和规则。它允许系统管理员添加、删除和修改虚拟服务以及真实服务器的配置,从而实现负载均衡的灵活管理。
ipvs和ipvsadm共同协作,实现了LVS负载均衡系统的核心功能