LVS原理详解及部署
一、LVS简介
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、haproxy,商业的硬件负载均衡设备F5、Netscale。这里主要是学习 LVS 并对其进行了详细的总结记录。
二、LVS基本原理
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间。
- PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链。
- IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链。
- POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器。
三、LVS组成
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm
IPVS(ip virtual server)
:一段代码工作在内核空间,叫IPVS,是真正生效实现调度的代码。IPVS的总体结构主要由IP包处理、负载均衡算法、系统配置与管理三个模块及虚拟服务器与真实服务器链表组成。ipvsadm
:另外一段是工作在用户空间,叫ipvsadm,即IPVS管理器,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)。
四、LVS技术术语
术语简写 | 术语含义 |
---|---|
Director Server | 负载均衡调度器 |
CIP | Client IP,访问客户端的IP地址(客户端的IP地址) |
DIP | Director Server IP,负载均衡器对应的实际IP地址 (主要用于和内部主机通讯的IP地址 ) |
VIP | Virtual IP,向外部直接面向用户请求,作为用户请求的目标的IP地址 (需在均衡器提供服务的地址) |
RIP | Real Server IP,后端服务器的IP地址 (提供服务的节点地址) |
LB | 负载均衡服务器 |
RS | Real Server ,节点服务器 (后端真实的工作服务器) |
DS | Director Server。指的是前端负载均衡器节点 |
五、LVS工作模式和原理
NAT模式
1、NAT模式工作原理
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时
报文的源IP为CIP,目标IP为VIP
。 - PREROUTING检查发现数据包的目标IP是本机,
将数据包送至INPUT链
。 - IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时
报文的源IP为CIP,目标IP为RIP
。 - POSTROUTING链通过选路,
将数据包发送给Real Server
。 - Real Server对比发现目标为自己的IP,开始
构建响应报文发回给Director Server
。 此时报文的源IP为RIP,目标IP为CIP
。 - Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时
报文的源IP为VIP,目标IP为CIP
。
LVS NAT原理:用户请求LVS到达 director,director将请求的报文的目标IP地址改成后端的 realserver IP 地址,同时将报文的目标端口也改成后端选定的 realserver相应端口,最后将报文发送到realserver,realserver 将数据返给director,director再把数据发送给用户。(两次请求都经过director,所以访问大的话(超过30台),director会成为瓶颈)(NAT为地址转换)
2、NAT特性
- RIP(
后端服务器的IP地址
)最好是内网IP - RS(
节点服务器
)的网关必须指向DIP(负载均衡器对应的实际IP地址
)。 - DIP(
负载均衡器对应的实际IP地址
)和RIP(后端服务器的IP地址
)必须在同一个网段内。 - 请求和回应的报文都必须经过director(
负载均衡调度器
),director容易成为瓶颈。 - nat支持端口转发。
DR模式
1、DR模式工作原理
- 首先用户用CIP请求VIP。
- 根据上图可以看到,不管是Director Server还是Real Server上都需要配置相同的VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,
请求数据包的源地址为CIP目标地址为VIP
,此时路由器会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server 接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Servrer
。 - 当用户请求到达Director Server,此时
请求的数据报文会先到内核空间的PREROUTING链
。 此时报文的源IP为CIP,目标IP为VIP
。 - PREROUTING检查发现数据包的目标IP是本机,
将数据包送至INPUT链
。 - IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的
源MAC地址修改为DIP的MAC地址
,将目标MAC地址修改RIP的MAC地址
,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址 - 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时
数据包将会发至Real Server
。 - RS发现请求报文的MAC地址是自己的MAC地址,
就接收此报文
。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
- 响应报文最终送达至客户端。
LVS DR原理:用户请求LVS到达director,director将请求的报文目标MAC地址改成后端的realserver MAC地址,目标IP为VIP(不变),源IP为用户IP地址(不变),然后Director 将报文发送到realserver,realserver检测到目标IP为自己的本地IP,如果在同一个网段,然后将请求直接返给用户。如果用户跟realserver不在同一个网段,则通过网关返回用户。(此种转发效率最高)
Tunnel模式
1、Tunnel模式工作原理
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时
报文的源IP为CIP,目标IP为VIP
。 - PREROUTING检查发现数据包的目标IP是本机,
将数据包送至INPUT链
。 - IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,
封装源IP为为DIP,目标IP为RIP
。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
。 - POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时
源IP为DIP,目标IP为RIP
。 - RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的
源IP地址为VIP,目标IP为CIP
。 - 响应报文最终送达至客户端
2、Tunnel模式特性
- RIP、VIP、DIP全是公网地址。
- RS的网关不会也不可能指向DIP
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
- 不支持端口映射
- RS的系统必须支持隧道
LVS TUN原理:跟LVS DR类似,也是改变封装MAC地址,多了一层隧道加密。实施环境复杂,比LVS DR模式效率略低。
六、LVS的调度算法
固定调度算法
:rr,wrr,dh,sh动态调度算法
:wlc,lc,lblc,lblcr固定调度算法
:即调度器不会去判断后端服务器的繁忙与否,一如既往得将请求派发下去。动态调度算法
:调度器会去判断后端服务器的繁忙程度,然后依据调度算法动态得派发请求。
1、rr:轮询(round robin)
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。这个调度的缺点是,不管后端服务器的繁忙程度是怎样的,调度器都会讲请求依次发下去。如果A服务器上的请求很快请求完了,而B服务器的请求一直持续着,将会导致B服务器一直很忙,而A很闲,这样便没起到均衡的左右。
2、wrr:加权轮询(weight round robin)
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
3、dh:目标地址散列调度算法 (destination hash)
简单的说,即将同一类型的请求分配给同一个后端服务器,例如将以 .jgp、.png等结尾的请求转发到同一个节点。这种算法其实不是为了真正意义的负载均衡,而是为了资源的分类管理。这种调度算法主要应用在使用了缓存节点的系统中,提高缓存的命中率。
4、sh:源地址散列调度算法(source hash)
即将来自同一个ip的请求发给后端的同一个服务器,如果后端服务器工作正常没有超负荷的话。这可以解决session共享的问题,但是这里有个问题,很多企业、社区、学校都是共用的一个IP,这将导致请求分配的不均衡。
5、lc:最少连接数(least-connection)
这个算法会根据后端 RS 的连接数(谁少给谁)来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1。这里问题是无法做到会话保持,即session共享。
6、wlc:加权最少连接数(weight least-connection)
这个比最少连接数多了一个加权的概念,即在最少连接数的基础上加一个权重值,当连接数相近,权重值越大,越优先被分派请求。
7、lblc:基于局部性的最少连接调度算法(locality-based least-connection)
将来自同一目的地址的请求分配给同一台RS如果这台服务器尚未满负荷,否则分配给连接数最小的RS,并以它为下一次分配的首先考虑。
8、lblcr:基于地址的带重复最小连接数调度 (Locality-Based Least-Connection with Replication)
这个用得少,可以略过。
转载至:https://www.cnblogs.com/dswy/p/8418515.html
来源:CSDN
作者:VillianTsang
链接:https://blog.csdn.net/VillianTsang/article/details/103791173