【摘要】 现在常用的LB软件,主要是LVS和nginx。普通情况下,LVS主要负责四层负载均衡,nginx负责七层。当然,业界也有友商基于LVS做出了七层负载均衡。本篇主要讲一下LVS的工作模式及各种模式的缺陷。并试图描述一下ELB服务的方案。
现在常用的LB软件,主要是LVS和nginx。普通情况下,LVS主要负责四层负载均衡,nginx负责七层。当然,业界也有友商基于LVS做出了七层负载均衡。本篇主要讲一下LVS的工作模式及各种模式的缺陷。并试图描述一下ELB服务的方案。
LVS的工作模式,主要包含三种:DR、fullnat、tunnel。
DR
在DR模式下,LVS上会配置服务虚IP,同时要求后端的real server上也会配置该IP地址,即LVS与后端服务器处于同一个网段。当client有报文发送到LVS的时候,LVS不会修改报文的IP地址,而是修改了报文的目的mac地址为real server的地址,后往后端server上送。real server回包直接回给网关,后发给client,不再经过LVS。
可以认为,DR是一种基于后端mac地址的负载分发方式,LVS会将报文按照负载均衡算法,轮询给后端的不同mac地址。
DR模式的好处就是,回包不经过LVS,回城可以达到比较高的性能。缺点是,LVS与后端要求在一个二层网络中,部署不太灵活。
Fullnat
Fullnat模式下,服务虚IP配在LVS上,报文路由到LVS以后,LVS先根据负载均衡算法确定分给哪一个后端real server,然后对报文的源地址和目的地址都做了转换。目的地址改成real server的地址,源地址改成LVS自身地址。
报文路由到real server以后,real server回包报文目的地址为LVS的地址,报文会回到LVS上。LVS把报文源地址和目的地址还原成VIP和client地址,回给client。
由于报文在LVS出做了fullnat后,按照IP地址寻址转发,所以后端real server不再需要与LVS在同一个二层网络里面,支持更灵活的组网方案。
而fullnat模式的缺点,LVS做了源地址转换以后,服务端无法看到访问者的源IP,将无法针对访问者进行分析。而当今大多数的游戏等应用,都需要知道是谁访问的自己,做客户来源分析等。而源地址可见,却正是DR模式的优点。
Tunnel
前面说了,DR模式的优点是源地址可见,fullnat模式的优点是可以拉远部署,那是否存在一种方式,技能拉远部署又能保持源地址可见?当然有,那就tunnel模式。
Tunnel模式的原理是,报文到了LVS以后,LVS根据负载均衡算法,确定分给哪一个real server后,便将报文目的地址改成了real server的地址,源地址保持不变。LVS自己和后端所有的real server二层内(或VM的host)之间建立了隧道,报文在出LVS之间会匹配隧道规则进入相应的隧道到达可直接到real server的某个点上(一般是VM的host主机或者是real server自身)。Real server处理完成以后,回包从原先的隧道走回到LVS上。
在公有云上,一般LVS是跟host主机的VTEP IP建立隧道。
而隧道的选择,一般选择GRE隧道或者是VXLAN隧道。不同的友商根据自己的技术能力和场景不同,可以选择不同的协议。华为云选择什么?自然是VXLAN。
网上介绍LVS的文档基本上将到这里就完了,但作为一个物理网络虚拟网络都有一丁点认识的小兵,笔者在此再给各位读者吐槽一下LVS的一个坑人的地方。
ECMP引流
传统的四层交换,基本上都是主备部署。主备之间跑VRRP,对于上层路由设备来说,发送ARP请求,是可以很明确的学习到四层交换的实IP或者是虚IP的mac地址,进而指导传统的路由交换,将报文引给四层交换。
主备部署,平时工作的就只有主一台设备,这也是我们吐槽硬件设备的一个地方——无法平滑拓展。但是,LVS如何解决这个问题呢?LVS如果再主备部署,性能只会比硬件更加差。Linux程序员设计出来的负载均衡,那当然是集群部署了。
可是,在LVS集群部署的时候,多台LVS的配置完全一致,虚IP地址都是一样的,如何规避如下两个问题:
1、 IP地址/mac地址在一个二层网络内部冲突如何解决?
2、 上层设备,怎么知道应该路由给谁?
二层网络内,服务虚IP对于LVS来说,并不是接口IP,本身是不会发送ARP也不会响应ARP。避免IP地址冲突的问题,当然,也意味着二层内部是无法访问到虚IP的。
所有访问LVS虚IP的流量,都需要三层转发,而上层路由设备,需要通过等价路由ECMP给多台LVS分流。
如图,各个LVS服务器除了本身有相同的虚IP以外,还需要每台设备有唯一的接口IP地址,上层的网关设备上,根据路由将报文发送给接口IP。路由形成的方式有两种:静态配置等价路由、LVS与网关建立动态路由形成等价路由。
静态配置等价路由
如上图,可以手工在网关设备上配置静态路由,以指导流量转发
Ip route-static 10.10.10.10 255.255.255.255 192.168.1.10
Ip route-static 10.10.10.10 255.255.255.255 192.168.1.11
Ip route-static 10.10.10.10 255.255.255.255 192.168.1.12
当然,静态路由上需要增加NQA探测,以使得某台LVS故障以后,可以快速撤销对应的路由。
动态形成等价路由
LVS和网关设备之间建立动态路由协议邻居,LVS将本地虚IP地址通告给网关,网关上行成多条等价路由指导转发。
如图,LVS与网关之间跑OSPF或者BGP,将10.10.10.10的IP地址同时通告给网关,网关会形成3条等价路径。当某台设备故障时,协议之间心跳探测失败,路由自动撤销。
只有实现了ECMP引流以后,LVS才能横向拓展,通过N台设备的组合,实现亿级并发能力。
ELB服务
要使用华为云的ELB服务,有几个概念需要先理解一下
华为云的ELB和EIP是分开的,EIP申请了以后,可以挂到ECS上,也可以挂到ELB上,还可以挂到NAT网关上
申请ELB实例,需要创建监听器,监听器为ELB实例所对外提供服务的特性特点,如分发协议,保持方式等
对于后端服务器的检查,需要配置检查类型、协议、周期等。后端检查的方式
下面一张图简单描述
更多的ELB实例的材料可以在下面连接获取
https://static.huaweicloud.com/upload/files/pdf/20180115/20180115114304_63601.pdf
对应于传统的四层交换来说,LB有GSLB、LSLB、LLB。这里讲的LVS,替代的就是传统的LSLB。
那GSLB和LLB呢?
GSLB通过智能DNS来取代,华为的智能DNS还在开发中,敬请期待
LLB,通过BGP IP就已经可以实现了,不需要额外的负载均衡,下一期我们重点讲解一下公有云的动态BGP和静态BGP的概念。
资料来源:https://bbs.huaweicloud.com/blogs/1861921ba62411e89fc57ca23e93a89f
手机扫一扫
移动阅读更方便
你可能感兴趣的文章