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

LB服务,软LB的服务能力(下)的更多相关文章

  1. spring-cloud-kubernetes服务发现之在k8s环境下开发spring cloud应用

    通常情况下,我们的线上的服务在迁移到k8s环境下的时候,都是采用平滑迁移的方案.服务治理与注册中心等都是采用原先的组件.比如spring cloud应用,在k8s环境下还是用原来的一套注册中心(如eu ...

  2. Windows 下 exe 服务注册到 service 服务中

    window 下注册 exe 程序.添加到 服务中. window 注册服务方式 一. regsvr 方式 直接在 程序目录执行: Regsvr 32 命令是Windows中控件文件 ( 如扩展名为D ...

  3. Windows下使用service.bat安装tomcat服务, 启动停止tomcat服务

    在项目开发过程中,以前只是在Eclipse中配置.启动.停止tomcat服务器 如果只想在机器中使用tomcat服务器,而不想安装MyEclipse,可以使用service.bat 将tomcat安装 ...

  4. 破解windows下MySQL服务启动不了的情况下不能对其进行全然卸载的解决方式

    下面的文章主要介绍的是在MySQL服务启动不了的情况下,不能对其进行全然卸载的实际解决的方法的描写叙述,下面就是对解决MySQL服务启动不了的情况下详细方案的描写叙述,希望在你今后的学习中会对你有所帮 ...

  5. 【Mongodb教程 第一课补加课2 】MongoDB下,启动服务时,出现“服务没有响应控制功能”解决方法

    如图,如果通过下列代码,添加服务后,使用net start命令出现这样的问题时,可以参考下我的解决方法. D:\MongoDB>mongod --dbpath D:\MongoDB\Data - ...

  6. 不能访问windows installer 服务,可能你在安全模式下运行 windows ,或者windows installer

    windows installer服务解决方案 很多朋友在安装MSI格式的文件包时,经常会遇到windows installer出错的情况,有如下几种现象: 1.所有使用windows install ...

  7. 微服务追踪SQL(支持Isto管控下的gorm查询追踪)

    效果图 SQL的追踪正确插入到微服务的调用链之间 详细记录了SQL的执行内容和消耗时间 搜索SQL的类型 多线程(goroutine)下的追踪效果 在 Kubernetes 中部署微服务后,通过 Is ...

  8. Windows下PHP+Eclipse开发环境搭建 及错误解决(apache2.2服务无法启动 发生服务特定错误:1)

    前言 Eclipse与php/apache的关系:Eclipse只是用来写代码的,如果想要在浏览器查看运行效果就要让php/apache的运行目录指向你的代码目录.Eclipse貌似不会自己和apac ...

  9. 阿里云容器服务--配置自定义路由服务应对DDOS攻击

    阿里云容器服务--配置自定义路由服务应对DDOS攻击 摘要: 容器服务中,除了slb之外,自定义路由服务(基于HAProxy)也可以作为DDOS攻击的一道防线,本文阐述了几种方法来应对普通规模的DDO ...

  10. [转]在 Azure 云服务上设计大规模服务的最佳实践

    本文转自:http://technet.microsoft.com/zh-cn/magazine/jj717232.aspx 英文版:http://msdn.microsoft.com/library ...

随机推荐

  1. JPA 分页处理

    1.要实现jpa分页管理首先得要正确配置jpa环境,在spring环境中的配置如下: 开启注解功能 <bean class="org.springframework.orm.jpa.s ...

  2. Spring-mvc 配置文件applicationContext.xml

    相关jar包(4.3.16.RELEASE) <!-- Spring mvc 基础jar包,maven 依赖 --> <dependency> <groupId>o ...

  3. css3及css技巧

    左右对齐:  

  4. jsp 循环数字

    <c:forEach var ="i" begin="1" end="${homeexamque.optionNum}" step=& ...

  5. JUC整理笔记一之细说Unsafe

    JUC(java.util.concurrent)的开始,可以说是从Unsafe类开始. Unsafe 简介 Unsafe在sun.misc 下,顾名思义,这是一个不安全的类,因为Unsafe类所操作 ...

  6. Argo 项目加入 CNCF 孵化器 | 云原生生态周报 Vol. 45

    作者 | 陈洁.高相林.陈有坤.敖小剑 业界要闻 Argo 项目加入 CNCF 孵化器 Argo 项目是一组 Kubernetes 原生工具,用于运行和管理 Kubernetes 上的作业和应用程序. ...

  7. npm audit fix 报错

    found 2504 vulnerabilities (1360 low, 1109 moderate, 29 high, 6 critical)  run `npm audit fix` to fi ...

  8. 获取cookie里面的sessionid

    做接口的时候我们需要获取一个令牌,类似于token以及sessionid这样的签名,也可以说是一个令牌. import urllib.request, urllib.parse, urllib.err ...

  9. Vue 百度地图显示规划路线

    Vue 百度地图显示规划路线 1.首选引入相应的文件(建议单页面引入)(如有问题找上一篇博客园) 2.区别就是需要多引入几根不同的文件 import { BaiduMap, BmScale, BmGe ...

  10. switch-case与if-else的转换

    对学会成绩大于60分的,输出合格,低于60分的输出不合格 import java.util.Scanner; public class TestSwitch3 { public static void ...