IPVS简介
IPVS(IP Virtual Server)是一种基于Linux内核的四层负载均衡技术。它是LVS(LinuxVirtualServer)框架的一部分,基于Netfilter的内核空间的工具,专门用于处理大规模网络服务的负载均衡。相比于Iptables,IPVS能更好地支持大规模高并发的流量分发。
注意,IPVS只负责它所在的机器上,相关请求的负载均衡和转发动作,至于底层不同服务器上物理网络、虚拟网络等之间的流量转发,需要路由、虚拟网络等技术来实现。
IPVS工作原理
主要组件
IPVS的核心机制是将客户端的请求通过一个虚拟IP地址(VIP,VirtualIP)路由到真实的后端服务器(RealServer)。其主要组件包括:
虚拟服务器(VirtualServer):为客户端提供的服务入口,对应一个虚拟IP地址(VIP)。
真实服务器(RealServer):处理实际请求的服务器。
调度器(Scheduler):负责根据特定的负载均衡算法将请求分发到不同的真实服务器。
负载均衡算法
IPVS支持多种负载均衡算法来分配流量,以下是几种常见的算法:
轮询(RoundRobin,rr):将请求按顺序分发到后端服务器,每个服务器依次处理请求。
最少连接(LeastConnections,lc):优先将请求发送到当前连接数最少的服务器,适合长连接的场景。
加权轮询(WeightedRoundRobin,wrr):为不同的服务器设置不同的权重,权重高的服务器将处理更多的请求。
源地址哈希(SourceHashing,sh):根据客户端IP地址的哈希值分配请求,同一个客户端IP始终会被路由到同一台服务器。
调度模式
NAT模式(Network Address Translation)
NAT(网络地址转换)是IPVS最基础的负载均衡模式。在NAT模式下,负载均衡器不仅改变请求报文的目标IP地址,还会修改来自后端服务器响应的源IP地址。
工作原理:
客户端向负载均衡器发送请求,目标IP为虚拟IP(VIP)。
负载均衡器接收到请求后,将目标IP修改为某个后端真实服务器的IP,然后将请求转发给该服务器。
后端服务器处理完请求后,将响应发送回负载均衡器。
负载均衡器将后端服务器响应报文中的源IP地址修改为虚拟IP,然后将响应返回给客户端。
特点:
地址转换:负载均衡器负责修改请求和响应的IP地址。
全流量经过负载均衡器:请求和响应流量都必须通过负载均衡器。
负载均衡器的压力较大,特别是在高并发场景下。
TUN模式(IP Tunneling)
TUN模式也被称为IP隧道模式。在这种模式下,负载均衡器只负责处理请求的分发,而后端服务器直接将响应发送给客户端。
工作原理:
客户端向负载均衡器发送请求,目标IP为虚拟IP(VIP)。
负载均衡器将请求封装在IP隧道中,通过IPIP协议(IP over IP)将请求转发给某个后端真实服务器。
后端服务器处理请求后,直接将响应报文发回给客户端,而不经过负载均衡器。
特点:
负载均衡器的压力最小:只处理请求,不处理响应。
后端服务器需支持IP隧道协议(IPIP)。
DR模式(Direct Routing)
DR模式也叫做直接路由模式。在DR模式下,负载均衡器仅处理请求的分发,后端服务器直接将响应发送给客户端。与TUN模式类似,但无需封装IP隧道。
工作原理:
客户端向负载均衡器发送请求,目标IP为虚拟IP(VIP)。
负载均衡器将请求报文的目标MAC地址修改为某个后端服务器的MAC地址(但不修改目标IP地址),然后将请求直接转发给该服务器。
后端服务器处理请求后,直接将响应报文发回给客户端,而不经过负载均衡器。
特点:
不修改IP地址:负载均衡器只修改MAC地址,而IP地址保持不变。
负载均衡器的压力最小:只处理请求,不处理响应。
需要网络设备支持L2路由,即负载均衡器和后端服务器必须在同一个物理网络中(如同一个局域网)。
模式 | 负载均衡器处理流量 | 请求转发方式 | 后端服务器要求 | 适用场景 |
---|---|---|---|---|
NAT | 处理请求和响应 | 修改目标和源IP | 位于同一私有网络内 | 小规模、低负载的场景 |
TUN | 只处理请求 | 使用IP隧道转发 | 支持IPIP隧道 | 高并发、大流量的场景 |
DR | 只处理请求 | 修改MAC地址转发 | 与负载均衡器在同一网络内 | 超大规模、高性能分布式场景 |
IPVS与Iptables的区别
iptables是基于规则的包过滤和转发工具,适合较小规模的服务代理。随着服务规模增大,规则数量增多,iptables性能会逐渐下降。
IPVS则是专门为大规模网络服务的负载均衡设计的,利用哈希表存储规则,能够高效处理大量连接和请求,特别是在高并发场景中具有显著优势。
IPVS配置示例
检查IPVS是否已加载:
#检查IPVS是否已加载
lsmod | grep ip_vs
#如果系统中尚未加载IPVS模块,则需要手动加载必要的模块,如下
modprobe ip_vs
modprobe ip_vs_rr # 轮询调度算法
modprobe ip_vs_wrr # 加权轮询调度算法
modprobe ip_vs_lc # 最少连接调度算法modprobe nf_conntrack_ipv4 # 追踪IPv4连接
modprobe ip_vs_sed # 最短期望延迟调度算法
modprobe ip_vs_nq # 无队列调度算法
安装ipvsadm工具:
sudo yum install ipvsadm
添加虚拟服务器(VIP),在配置IPVS时,首先需要添加一个虚拟服务器(Virtual IP),并指定负载均衡算法。以轮询算法为例:
ipvsadm -A -t 192.168.100.1:80 -s rr
#这条命令的含义是:
#-A
表示添加一个虚拟服务器。
#-t
表示TCP协议,并指定虚拟IP和端口(192.168.100.1:80
)。
#-s rr
指定轮询(rr
)调度算法。
为虚拟服务器添加真实服务器,即后端服务器:
ipvsadm -a -t 192.168.100.1:80 -r 192.168.100.2:80 -m
ipvsadm -a -t 192.168.100.1:80 -r 192.168.100.3:80 -m#这条命令的含义是:
#-a
表示为虚拟服务器添加一个真实服务器。
#-r
指定真实服务器的IP和端口(例如192.168.100.2:80
)。
#-m
表示使用NAT模式(也可以使用-g
表示直接路由模式,或者-i
表示隧道模式)。
可以使用以下命令查看、保存当前的IPVS配置:
ipvsadm -L -n
ipvsadm-save > /etc/ipvs.rules
在系统启动时,通过脚本或服务加载此配置:
ipvsadm-restore < /etc/ipvs.rules