四、LVS四层负载均衡

一、lvs介绍

LVS,是Linux Virtual Server的简称,也就是Linux虚拟服务器,
是一个由国人章文嵩博士发起的自由软件项目。
中文站点:http://zh.linuxvirtualserver.org/

二、lvs构成

LVS 由于两部分构成
1、ipvs:ipvs负责核心的转发工作,工作于内核中netfilter INPUT钩子上,效率非常高,高于工作于用户态的nginx
2、ipvsadm:工作在用户空间的命令行工具,用于管理集群服务定义规则

详细点说说:
“IPVS通过在Netfilter框架中的不同位置(LOCAL_IN/FORWARD/LOCAL_OUT)注册自己的处理函数来捕获数据包,
并根据与IPVS相关的信息表对数据包进行处理,按照IPVS规则中定义的不同的包转发模式,对数据包进行不同的转发处理。”

现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,
使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无
需给内核打任何补丁,可以直接使用LVS提供的各种功能

LVS的核心ipvs在k8s的svc中也是在用它,效率很高

三、lvs的特点

七层负载可以做的 URL 解析等工作,LVS 无法完成,它支持到四层
接下来有两个问题

  • 1、为何lvs明明是改二层的mac,或改三层的ip,但是却叫四层负载均衡呢?
    因为lvs的一些负载均衡算法,比如最小链接调度,链接是传输层的概念是基于ip和端口的
    所以你不能单看lvs怎么改数据包的去判定它的层!而应该综合来看,他要识别与后端rs服务器的链接,那就是要工作到四层才可以
    要综合他所有的环节,取一个它可以处理到的最大层
  • 2、大家都说四层负载均衡比七层要快,就好像说层越低越高效一样,如果真是那样,那为啥不干脆三层得了呢?
    答:
    (1)因为用户的一次访问必须先与服务端建立连接后、才能交换数据包,如果在第三层也就是网络层做负载均衡,那么将失去「连接」的语义
    (2)软件负载均衡面向的对象应该是 一个已经建立连接的用户,而不是一个孤零零的 IP 包。
    (3)后面还会看到,实际上 LVS 的机器代替真实的服务器与用户通过 TCP 三次握手建立了连接,所以 LVS 是需要关心「连接」级别的状态的。

四、LVS的工作模式

LVS 的工作模式主要有 4 种

  • DR(效率最高)
  • NAT
  • TUN
  • Full-NAT

DR与NAT模式都限制主机必须在一个局域网里,为了打破这个限制才有TUN方案,但是TUN方案效率不如DR模式高

要详细了解下述lvs各个模式,有一个形象的比喻
1、数据包的发送过程—->寄快递
2、沿途的网络设备——>快递站、快递小哥

3、ip地址————->一个区域的地址
4、mac地址————>某个区域中、目标节点的具体地址

五、LVS的专业术语

节点角色简称

  • DS:director server,即负载均衡器,根据一定的负载均衡算法将流量分发到后端的真实服务器上
    BDS:backup director server,为了保证负载均衡器的高可用衍生出的备份.
  • RS:real server 真实的提供服务的server

不同作用的IP地址的简称

  • DIP: Director IP,配置在负载均衡器上、用于和内部服务器通讯的ip地址。
  • RIP: Real Server IP,即真实的提供服务的server的IP地址
  • VIP:向外部直接面向用户请求,作为用户请求的目标的ip地址。
  • CIP:Client IP

六、DR模式(只扎一次心)

file

一、简述-快速了解

DR 模式下需要 LVS 和 RS绑定同一个 VIP(RS 通过将 VIP 绑定在 loopback 实现)。
一个请求过来时,LVS 只需要将网络帧的 MAC 地址修改为某一台 RS 的 MAC,该包就会被转发到相应的 RS 处理,
注意此时的源 IP 和目标 IP 都没变,LVS 只是做了一下移花接木。

RS 收到 LVS 转发来的包,链路层发现 MAC 是自己的,到上面的网络层,发现 IP 也是自己的,于是这个包被合法地接受,
RS 感知不到前面有 LVS 的存在。
而当 RS 返回响应时,只要直接向源 IP(即用户的 IP)返回即可,不再经过 LVS。
DR 模式是性能最好的一种模式。

二、特点总结:请求由 LVS 负载均衡器接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,即返回的时候不经过 LVS。

三、配置概况
1、lvs负载均衡器上:配置VIP与DIP,可以在同一块网卡上,并且是连着网线的真实物理网卡,用于接收流量
(1)VIP:用户请求访问的目标IP
(2)DIP:lvs负载均衡与集群内RS通信的ip地址
2、RS上:
(1)配置与DIP可通信的ip地址之外,还必须在lo网卡上添加一个vip地址,为何要在lo这种看似无用的网卡上配vip呢?下面解答
(2)关闭arp包的通告与响应

四、核心原理详解:LVS负载均衡器收到目标ip是自己的物理网卡上配置的vip地址,则响应请求,首先从集群的节点中选出一台RS,然后因为是DR模式,所以会将用户请求包的目标mac换成刚选的那台RS,注意只换目标mac,ip地址啥的都没有变,于是该包会在局域网内mac地址广播给目标RS,目标RS收到包后,发现目标mac是自己,并且目标ip地址为VIP地址,这个地址在自己的lo网卡上也能看到, 于是RS判定这个包就是自己的,所以开始响应包,返回包的时候源ip就是RS自己机器上配置的的vip地址,目标ip就是客户端的ip地址,所以请求直接返回给客户端,并不会走lvs负载均衡

1.请求走lvs负载均衡,响应不走lvs,直接回客户
2.负载均衡在正常网卡配置vip,rs服务器需要在lo网卡上配置vip,因为数据包是mac地址转发的,目标ip始终为vip不会变,
这就要求集群内每台机器都必须有vip才行,但负载均衡上的vip是配在真网卡上的,rs服务器是本地回环lo。
为何要配置在本地回环上?你应该你明白了。为何一定要在rs上配上vip,你应该明白了,
因为没有这个vip内核收到了报即便目标mac地址是自己,发现目标ip不是自己,也会丢掉这个包,所以一个系列操作都是为了骗过内核
3.关闭ARP转发(在所有RS上都需要同样的操作),为何要关闭呢?
同一个广播域: 配置了多个相同的VIP  是不允许的, 要想实现,就必须让外面的网络, 无法发现这个VIP的存在
       因此 在Linux里面, 可以修改内核参数,  实现接口IP的广播不响应、不广播
       arp_ignore = 1  表示只回答目标IP是访问本地网络对应接口的arp请求
       arp_announce = 2  只宣告本机网卡直连网络所在的ip的arp广播

配置示例:https://egonlin.com/?p=9312

七、NAT模式(来回扎两次心)

file

特点简述
1.请求与响应都走负载均衡
2.所有rs必须把网关指向负载均衡才行,否则无法回包,因为回包时的源ip是rs服务器自己,目标ip是客户端的ip所以必须有网关转发才行
细说:
NAT(Network Address Translation)是一种外网和内网地址映射的技术。
NAT 模式下,网络报的进出都要经过 LVS 的处理。LVS 需要作为 RS 的网关。
当包到达 LVS 时,LVS 做目标地址转换(DNAT),将目标 IP 改为 RS 的 IP。RS 接收到包以后,仿佛是客户端直接发给它的一样。
RS 处理完,返回响应时,源 IP 是 RS IP,目标 IP 是客户端的 IP。
这时 RS 的包通过网关(LVS)中转,LVS 会做源地址转换(SNAT),将包的源地址改为 VIP,这样,这个包对客户端看起来就仿佛是 LVS 直接返回给它的。客户端无法感知到后端 RS 的存在。

配置示例:https://egonlin.com/?p=9315

八、TUN模式

  • IP Tunnel(ip隧道)解决DR模式下RS和DS处于同一网段的问题。ip隧道可以理解为IP in IP, 即发送方在IP头的外部再包装一个IP头,接收方先解出第一层IP头,然后再按照正常流程处理剩下的的IP数据包。
  • 具体流程为: 1)给数据包添加新的IP头,重新封装数据包然后选路将数据包发送给Real Server 2)RS发现请求报文的IP地址是自己的eth0的IP地址,就剥掉IP隧道包头 3)RS发现请求报文的IP地址是自己的lo的IP地址,就接收此报文,处理请求后正常发送响应报文(源IP是VIP,目的IP是ClientIP),将响应报文通过lo接口传送给eth0网卡然后向外发出
  • lo:系统内部接收和发送数据包 127.0.0.1 eth0:网卡 MAC:网卡的物理地址 inet addr:网卡ip地址
  • 特点为:1)DS添加了IP头,但是不修改传输层数据,故TUN不支持端口映射 2)只要IP可达,RS完全可以分布到不同的机房和网段 3)RS需要绑定VIP到lo,避免映射混乱 4)会存在MTU的问题,如果一个数据包已经达到了mtu的大小,ip隧道添加一个ip头之后,包的大小就会超过MTU(解决方案为支持PMTUD协议或减小RS的MSS) 5)解决了RS的部署和扩展问题,但是DS的扩展问题无法解决,只能做主备高可用
    file

九、Full-NAT模式

无论是 DR 还是 NAT 模式,不可避免的都有一个问题:LVS 和 RS 必须在同一个 VLAN 下,否则 LVS 无法作为 RS 的网关。
这引发的两个问题是:

1、同一个 VLAN 的限制导致运维不方便,跨 VLAN 的 RS 无法接入。

2、LVS 的水平扩展受到制约。当 RS 水平扩容时,总有一天其上的单点 LVS 会成为瓶颈。

Full-NAT 由此而生,解决的是 LVS 和 RS 跨 VLAN 的问题,而跨 VLAN 问题解决后,LVS 和 RS 不再存在 VLAN 上的从属关系,可以做到多个 LVS 对应多个 RS,解决水平扩容的问题。

Full-NAT 相比 NAT 的主要改进是,在 SNAT/DNAT 的基础上,加上另一种转换,转换过程如下:

file

在包从 LVS 转到 RS 的过程中,源地址从客户端 IP 被替换成了 LVS 的内网 IP。
内网 IP 之间可以通过多个交换机跨 VLAN 通信。
当 RS 处理完接受到的包,返回时,会将这个包返回给 LVS 的内网 IP,这一步也不受限于 VLAN。
LVS 收到包后,在 NAT 模式修改源地址的基础上,再把 RS 发来的包中的目标地址从 LVS 内网 IP 改为客户端的 IP。
Full-NAT 主要的思想是把网关和其下机器的通信,改为了普通的网络通信,从而解决了跨 VLAN 的问题。采用这种方式,LVS 和 RS 的部署在 VLAN 上将不再有任何限制,大大提高了运维部署的便利性。

10、所有模式对比

file

11、ipvs调度算法

ipvs默认的调度算法是wlc,总共有八种调度算法如下所示

  • rr:Round Robin,轮询
  • wrr:Weight,加权轮询
  • lc:最少连接数调度(least-connection),IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS
  • wlc:加权最少连接数调度,(active256+inactive)/weighed,权重越大连接数越少,则连接至此rs
  • lblc:基于本地的最少连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑
  • lblcr:基于本地带复制功能的最少连接;对于已建立的请求,分配到同一台服务器;对于新请求,分配到连接数少的server
  • dh:destination hash目标地址hash,功能类似于sh,但应用场景不同
  • sh:source hash,源地址hash,根据hash表将来自同一IP请求发送至同一Real Server,这样在一定程度上破坏了负载均衡的效果;主要使用在电商网站,实现session affinity(会话绑定)
上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 帮助IT小伙伴学到真正的技术