• LB服务,软LB的服务能力(下)


    【摘要】 现在常用的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

  • 相关阅读:
    python—内置函数-filter,map,reduce
    python—模块-练习
    python—模块-re正则表达式
    python—模块-logging
    python—模块-subprocess
    python—模块-hashlib加密
    python—模块-configparser
    SpringBoot结合设计模式(观察者模式、策略模式)- 个人记录
    Spring事务-随笔
    Servlet、Tomcat、SpringMVC-整理-随笔
  • 原文地址:https://www.cnblogs.com/uestc2007/p/10871241.html
Copyright © 2020-2023  润新知