LVS(Linux Virtual Server)简述

一、简介

LVS(Linux Virtual Server)是一个基于Linux操作系统的高性能、可扩展的负载均衡器。它提供了一种可靠的、高可用的解决方案,用于将来自客户端的请求分发到多个后端服务器,以实现负载均衡和高可用性。

lvs工作在 OSI 模型的传输层,即四层负载均衡,LVS主要由两部分组成,ipvs和ipvsadm。

  • ipvs:工作在内核空间,它是LVS的核心组件,负责实际处理负载均衡和流量调度的功能。IPVS通过拦截并重定向传入的网络连接,将连接请求分发到后端的真实服务器。IPVS实现了负载均衡算法和网络连接管理,以确保请求在后端服务器之间均衡分发。
  • ipvsadm:工作在用户空间,它是一个命令行工具,用于管理和配置IPVS。IPVSADM提供了一组命令,用于添加、修改和删除虚拟服务器、后端服务器和负载均衡规则。通过IPVSADM,管理员可以在用户空间灵活地配置和管理IPVS的各个组件,以定义集群服务和后端真实服务器。

 

1.1 相关名词

  • DS(Director Server):前端负载均衡器节点
  • RS(Real Server):后端真实的工作服务器
  • VIP:向外部直接面向用户请求,作为用户请求的目标IP地址
  • DIP(Director Server IP):主要用于和内部主机通讯的IP地址
  • RIP(Real Server IP):后端服务器的IP地址
  • CIP(Client IP):客户端的IP地址

 

1.2 工作原理

  1. 当客户端发起请求时,请求首先到达 LVS 负载均衡器,它是网络流量的入口
  2. 调度器将请求发往至内核空间
  3. PREROUTING 链首先会接收到用户请求,判断目标 IP,确定是本机 IP,将数据包发往 INPUT 链
  4. 当用户请求到达 INPUT 时,ipvs检查数据包里面的目的ip及端口,对比现有的规则,符合的话ipvs会强行修改数据包里的目标 IP 地址及端口,并将新的数据包发往 POSTROUTING 链
  5. POSTROUTING 链接收数据包后,将数据包最终发送给相应的后端服务器
  6. 后端服务器接收到请求后,根据请求的内容进行处理,并生成响应,响应经过相同的路径返回到负载均衡器
  7. 负载均衡器收到后端服务器的响应后,将响应转发给发起请求的客户端

 

1.3 调度算法

负载均衡器根据负载均衡算法把请求转发到后端真实服务器上,以下列举一些常用的调度算法:

  • 轮询调度 rr(Round Robin):按照轮询的方式依次将请求分发给后端服务器。每个请求依次分发给下一个服务器,循环往复。
  • 加权轮询调度(Weighted Round Robin):为每个后端服务器分配一个权重值,根据权重值决定分发请求的比例。权重值越高的服务器,分配到的请求越多。
  • 最少连接调度(Least Connection):将请求分发给当前连接数最少的后端服务器。通过监测服务器的连接数,将请求发送到当前负载最轻的服务器。
  • 加权最少连接调度(Weighted Least Connection):为每个后端服务器分配一个权重值,权重值越高的服务器,其连接数越少。请求将优先发送到权重值高且连接数少的服务器。
  • 散列调度(Hash):根据请求的某个特定属性(如源 IP、目标 IP、URL 等)计算哈希值,然后将请求分发到对应的后端服务器。相同属性的请求始终被分发到同一台服务器。
  • 最短响应时间调度(Shortest Response Time):通过测量服务器的响应时间,将请求发送到响应时间最短的服务器。

 

1.4 ipvsadm

下载

yum -y install ipvsadm

命令选项:

  • -A:添加一个新的虚拟服务器配置
  • -D:删除虚拟服务器配置
  • -a:添加一个后端真实服务器
  • -d:删除一个后端真实服务器
  • -L:列出当前的IPVS表,包括虚拟服务器和后端真实服务器的配置
  • -n:以数字格式显示IP地址和端口号
  • -t <VIP:Port>:指定虚拟服务器的IP地址和端口号
  • -r <RIP:Port>:指定后端真实服务器的IP地址和端口号
  • -s <Scheduling_Algorithm>:指定调度算法,如rr(轮询)、wrr(加权轮询)、lc(最少连接)、wlc(加权最少连接)等
  • -g:指定lvs的工作模式,使用DR模式
  • -m:使用NAT模式
  • -i:使用TUN模式
  • -w <Weight>:指定后端真实服务器的权重,用于负载均衡的算法
  • -C:清除IPVS表中的所有配置

实例:

#添加虚拟服务器配置
ipvsadm -A -t 192.168.1.100:80 -s wlc

#添加后端真实服务器
ipvsadm -a -t 192.168.1.100:80 -r 10.0.0.1:80 -g

#查看当前的IPVS表
ipvsadm -L -n

#删除虚拟服务器配置
ipvsadm -D -t 192.168.1.100:80

 

1.5 优缺点

优点:

  • 高性能:LVS能够实现高吞吐量和低延迟的负载均衡,通过将请求分发到多个后端服务器来提高系统的处理能力和性能
  • 可扩展性:LVS支持横向扩展,可以轻松地添加更多的后端服务器以应对不断增长的流量和负载
  • 可靠性:LVS支持多种负载均衡算法,如轮询、加权轮询和最少连接等,以确保请求能够均匀地分发到后端服务器,并提供高可用性和容错能力
  • 灵活性:LVS提供了多种工作模式,如DR(Direct Routing)、NAT(Network Address Translation)和TUN(IP隧道)等,以适应不同的网络架构和需求
  • 开源和免费:LVS是一个开源项目,可以免费使用和定制,使其成为小型和中型组织的经济有效的负载均衡解决方案

缺点:

  • 配置复杂:LVS的配置相对复杂,需要对网络和负载均衡概念有一定的了解,并且需要进行相应的网络设置和调整
  • 缺乏图形界面:LVS主要是通过命令行工具(如ipvsadm)进行配置和管理,缺乏直观的图形界面,对于非技术人员来说可能有一定的学习曲线
  • 有限的支持和文档:相比于商业解决方案,LVS的支持和文档资源相对有限,可能需要依赖社区和在线资源来获取支持和解决问题
  • 依赖于Linux内核:LVS是一个基于Linux内核的解决方案,因此它的使用受限于支持LVS的Linux发行版和内核版本

 

二、工作模式

lvs常用的工作模式有NAT、DR、TUN、FULLNAT四种,最常用的是DR模式。

  NAT DR TUN FULLNAT
优点 支持端口转换 性能好 跨网段 支持端口转换,支持跨网段
缺点 DS易成性能瓶颈 不支持跨网段 需要支持ip隧道 性能差
网络 private(私网) LAN(私网) LAN/WAN(私网/公网) private(私网)
RS数量 少量 大量 大量 少量
RS网关 LVS内网地址 Own router(网工定义) Own router(网工定义) Own router(网工定义)
RS服务器限制 无限制 限制ARP 需支持ip隧道 无限制

 

2.1 NAT(Network Address Translation)模式

在LVS的NAT模式中,LVS主机通过修改请求和响应的IP地址和端口信息来实现负载均衡。NAT模式是LVS中最常用的一种模式,它可以将多个真实服务器隐藏在LVS主机后面,并使用一个虚拟IP地址对外提供服务。

下面是NAT模式的工作原理:

  1. 客户端发送请求:客户端向LVS主机的虚拟IP地址发送请求。

  2. 请求到达LVS主机:LVS主机接收到请求后,根据预先配置的负载均衡调度算法(如轮询、加权轮询、最少连接等),选择一个后端真实服务器进行处理。

  3. 修改IP地址和端口:LVS主机将客户端请求的目标IP地址和端口修改为后端真实ip和端口。然后,将修改后的请求转发给后端真实服务器。

  4. 后端服务器处理请求:后端真实服务器接收到请求后,根据请求的目标IP地址和端口进行处理,并生成响应。

  5. 后端服务器将响应报文发送至LVS主机。
  6. 修改IP地址和端口:LVS主机将响应中的源ip跟端口,修改为自己主机的vip跟端口。

  7. 响应返回给客户端:LVS主机将修改后的响应返回给客户端。对客户端而言,它看到的响应来自于LVS主机的虚拟IP地址。

通过这种方式,NAT模式实现了负载均衡,将客户端的请求分发给后端的真实服务器,并将响应返回给客户端。

注意事项:

  • 在NAT模式下,LVS主机需要配置网络地址转换规则,将客户端的请求和后端服务器的响应正确地进行转换和转发
  • 后端真实服务器的默认网关应设置为LVS主机的内部IP地址,以确保响应能够正确返回给LVS主机。

NAT模式的优点包括简单易用、透明的负载均衡、支持双向通信等。然而,由于需要修改IP地址和端口,可能会引入一定的性能开销,同时也需要进行额外的网络配置和管理;并且,请求跟响应都经过DS,大流量场景下,DS易成为性能瓶颈。

 

实例

#增加一台虚拟服务器,使用轮询调度rr
ipvsadm -A -t 192.168.20.50:80 -s rr

#添加真实服务器记录在虚拟服务器表里
ipvsadm -a -t 192.168.20.50:80 -r 192.168.198.160:80 -m
ipvsadm -a -t 192.168.20.50:80 -r 192.168.198.161:80 -m

#在LVS服务器上开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward

#后端服务器网关指向LVS服务器同网段网卡
route add default gw 192.168.20.50

 

2.2 DR(Direct Routing)模式

在LVS的DR模式中(也称直接路由模式),LVS主机通过修改请求和响应的MAC地址来实现负载均衡。DR模式是一种高性能的负载均衡模式,它与NAT模式相比更加直接和高效。

下面是DR模式的工作原理:

  1. 客户端发送请求:客户端向LVS主机的虚拟IP地址发送请求。

  2. 请求到达LVS主机:LVS主机接收到请求后,根据预先配置的负载均衡调度算法(如轮询、加权轮询、最少连接等),选择一个后端真实服务器进行处理。

  3. 修改目标MAC地址:LVS主机将请求的目标MAC地址修改为后端真实服务器的MAC地址,并将请求转发给后端真实服务器

  4. 后端服务器处理请求:后端真实服务器接收到请求后,根据请求的目标IP地址进行处理,并生成响应。

  5. 响应返回给客户端:后端真实服务器将响应发送回客户端,响应数据包不经过LVS主机

在DR模式下,LVS主机仅负责修改请求和响应的MAC地址,不会修改IP地址和端口。因此,客户端请求的目标IP地址和端口与后端真实服务器之间的通信是直接的,响应也直接返回给客户端。这样可以减少LVS主机的处理负担,提高性能和吞吐量。

 

LVS DR注意事项:

  • 保证前端路由将目标地址为 VIP 报文统统发给 Director Server,而不是 RS
  • RS 可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对 RIP 进行直接访问
  • VIP与DIP,RIP可以不在同一网段中
  • 所有的请求报文经由 Director Server,但响应报文必须不能进过 Director Server
  • 不支持地址转换,也不支持端口映射
  • RS 可以是大多数常见的操作系统
  • RS 的网关绝不允许指向 DIP(因为我们不允许他经过 Director Server)
  • RS 上的 lo 接口配置 VIP 的 IP 地址
  • 限制于二层网络:LVS DR 模式要求负载均衡器和后端真实服务器在同一个二层网络中,共享相同的子网

下图尚存疑虑,仅供参考(网上都是INPUT链后修改源mac地址为DIP-MAC,经过RS后,经路由又修改成了VIP-MAC发送给客户端)

 

修改 RS 上内核参数(arp_ignore 和 arp_announce)将 RS 上的 VIP 配置在 lo 接口的别名上,并限制其不能响应对 VIP 地址解析请求。保证前端路由将目标地址为 VIP 报文统统发给 Director Server,而不是 RS。

arp_ignore:定义接收 ARP 请求时的响应级别

  • 0:响应任意网卡上接收到的对本机 IP 地址的 ARP 请求(包括环回网卡),不论目的 IP 地址是否在接收网卡上
  • 1:只响应目的 IP 地址为接收网卡地址的 ARP 请求
  • 2:只响应目的 IP 地址为接收网卡地址的 ARP 请求,且 ARP 请求的源 IP 地址必须和接收网卡的地址在同网段

arp_announce:定义将自己地址向外通告时的通告级别

  • 0:允许任意网卡上的任意地址向外通告
  • 1:尽量仅向目标网络通告与其网络匹配的地址
  • 2:仅向与本地接口上地址匹配的网络进行通告

 

实例:

#DS
ip addr add 192.168.56.200/32 dev eth33
ipvsadm -A -t 192.168.56.200:80 -s wrr
ipvsadm -a -t 192.168.56.200:80 -r 192.168.56.102:80 -g -w 1
ipvsadm -a -t 192.168.56.200:80 -r 192.168.56.104:80 -g -w 3

#开启ip forward
echo 1 >/proc/sys/net/ipv4/ip_forward

#后端服务器
ip addr add 192.168.56.200/32 dev lo
ip route add 192.168.56.200 dev lo
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

 

2.3 TUN模式

LVS(Linux Virtual Server)的TUN模式是LVS的一种工作模式,也被称为IP隧道模式。在TUN模式下,LVS主机通过创建IP隧道来处理来自客户端的请求,并将这些请求转发到后端真实服务器

工作原理:

  1. 客户端发送请求至DS,目标ip为vip
  2. DS接收请求后,在input链将请求报文的首部再封装一层ip报文,封装源ip为DIP,目标ip为RIP,发送至POSTROUTING 链,即此时的ip报文有两层,外层首部里的源地址,目标地址为DIP,RIP,内层首部里的源地址,目标地址仍为CIP,VIP
  3. POSTROUTING 链根据最新封装的 IP 报文,将数据包发至 RS(因为在外层封装多了一层 IP 首部,所以可以理解为此时通过隧道传输)
  4. RS 接收到报文后,拆除掉最外层的 IP 后,会发现里面还有一层 IP 首部,而且目标是自己的 lo 接口 VIP,那么此时 RS 开始处理此请求,处理完成之后,通过 lo 接口送给 eth0 网卡,然后向外传递。 此时的源 IP 地址为 VIP,目标 IP 为 CIP
  5. 响应报文经过DS发送至客户端

LVS TUN模式的优点是可以实现高性能和可扩展性,因为LVS主机只需处理请求的转发,而不需要进行数据包的修改和检查。然而,配置和管理TUN模式可能会比较复杂,需要注意网络路由和IP隧道的设置。

 

模式特点:

  • 不改变请求数据包,而是在请求数据包上新增一层 IP 首部信息因此负载均衡器不能对端口进行转发,但可以和真实服务器不在同一局域网内,且真实服务器需要支持能够解析两层 IP 首部信息,即需要支持“IP Tunneling”或“IP Encapsulation”协
  • 真实服务器中的 VIP,只能被自己 “看见”,其他设备不可知。因此 VIP 必须绑定在真实服务器的 lo 网卡上,并且不允许将此网卡信息经过 ARP 协议对外通告
  • 请求的数据包经过负载均衡器后,直接由真实服务器返回给客户端,响应数据包不需要再经过负载均衡器
  • RS 的网关不会也不可能指向 DIP。

 

实例:

#DS
ip addr add 192.168.56.210/32 dev eth33
ipvsadm -A -t 192.168.56.210:80 -s rr
ipvsadm -a -t 192.168.56.210:80 -r 192.168.56.102:80 -i
ipvsadm -a -t 192.168.56.210:80 -r 192.168.56.104:80 -i

#RS
#启用ipip
modprobe ipip
#在接口 tunl0 上添加 IP 地址 192.168.56.210/32
ip addr add 192.168.56.210/32 dev tunl0
#启用网络接口 tunl0
ip link set tunl0 up
#添加路由规则
ip route add 192.168.56.210 dev tunl0

echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/tunl0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

 

2.4 FULLNAT模式

FULLNAT模式可以看做是NAT模式的扩展,在NAT模式下DS需要先对请求进行目的地址转换(DNAT),然后对响应包进行源地址转换(SNAT),先后进行两次NAT,而 FULL-NAT则分别对请求进行和响应进行DNAT和SNAT,进行4次NAT,多次数的NAT会对性能大大削减,但是由于对请求报文的目的地址和源地址都进行了转换,后端的RS可以不在同一个VLAN下

 

工作原理:

  1. 客户端发送请求:客户端向LVS主机的虚拟IP地址发送请求。

  2. 请求到达LVS主机:LVS主机接收到请求后,根据预先配置的负载均衡调度算法(如轮询、加权轮询、最少连接等),选择一个后端真实服务器进行处理。

  3. 修改IP地址和端口:LVS主机将客户端请求的源ip修改为为DIP,目标ip修改为RIP。然后,将修改后的请求转发给后端真实服务器。

  4. 后端服务器处理请求:后端真实服务器接收到请求后,根据请求的目标IP地址和端口进行处理,并生成响应;此时源ip为RIP,目标ip为DIP

  5. 后端服务器将响应报文发送至LVS主机。
  6. 修改IP地址和端口:LVS主机将响应中的源ip修改为VIP,目标ip为CIP。

  7. 响应返回给客户端:LVS主机将修改后的响应返回给客户端。对客户端而言,它看到的响应来自于LVS主机的虚拟IP地址。

 

模式特点:

  • 负载均衡和NAT功能:LVS主机既实现了负载均衡,又提供了网络地址转换的功能,将请求和响应报文的IP地址和端口号进行转换。
  • 双向转换:FULLNAT模式会对请求和响应报文的源和目标IP地址进行转换,确保数据流在LVS主机上的转发和处理。
  • 网络隔离:LVS主机在客户端和后端真实服务器之间充当网关,实现了网络隔离,客户端无需直接与后端真实服务器通信。
  • 源地址保护:FULLNAT模式中,LVS主机会将请求报文的源IP地址进行转换,从而隐藏了真实的客户端IP地址,提供了一定的安全性和隐私保护。

 

三、持久性连接

在lvs中,持久连接是为了用来保证当来自同一个用户的请求时能够定位到同一台服务器,目的是为了会话保持。

lvs有三种持久连接方式

  1. PCC:基于客户端持久,将来自同一客户端的所有请求定向至此前选定的RS
  2. PPC:基于端口持久,将来自同一客户端对同一服务(端口)的请求,始终定向至此前选定的RS
  3. PFMC:基于防火墙标记连接持久,通过路由前给数据包打标记,将来自同一客户端对指定服务(端口)的请求,始终定向至此前选定的RS,可以将两个不相干的端口定义为一个集群服务

实例:

#PCC:当虚拟服务器在600秒内没有接收到请求时,连接会被关闭,端口0(表示所有端口)
ipvsadm -A -t 192.168.198.199:0 -s wrr -p 600

#PBC
ipvsadm -A -t 192.168.198.199:80 -s rr -p 200

#PFMC
iptabes -t mangle -A PREROUTING -d 192.168.198.199 -i ens33 -p tcp --dport 80 -j MARK --set-mark 3
#-f 经过iptables标记过的服务
ipvsadm -A -f 3 -s wrr -p 600
ipvsadm -a -f 3 -r 192.168.198.198 -g -w 2

 

四、LVS + Keepalived 高可用

lvs可以与keepalived一起做双机热备方案,只需要部署keepalived,配置好其 lb_algo 和 lb_kind 参数,即可使用lvs的负载均衡功能,将请求根据规则转发至相应的后端服务器中,无需再手动配置lvs。

而通过使用虚拟路由冗余协议(VRRP),Keepalived允许多台服务器组成一个虚拟路由器,并提供一个共享的虚拟IP地址,其中一台服务器被指定为主服务器(Master),负责处理所有的请求,而其他服务器则作为备份服务器(Backup)待命。

如果主服务器发生故障或不可用,备份服务器会自动接管主服务器的角色,并继续提供服务,实现高可用性。

详情请看:https://www.cnblogs.com/Xinenhui/p/18099841

 

posted @ 2024-05-09 17:24  心恩惠动  阅读(101)  评论(0编辑  收藏  举报