https://segmentfault.com/a/1190000009565788

Maglev 是什么

Maglev 是谷歌搞的一个工作在三层(IP层)的网络负载均衡器, 它是一个运行在普通的 Linux 系统上的巨大的分布式系统, 并且可以简单平滑的伸缩后端服务器数量, 谷歌在自己的数据中心便使用该方案做负载均衡, 后面又以论文的形式将 Maglev 的负载均衡方案分享了出来.

刚说 Maglev 是一个三层的负载均衡, 那么什么是三层的负载均衡呢?

就是当你访问一个负载均衡的 IP 的时候, 这个 IP 的后面是一个服务器组, 而不是单个服务器, 而这个服务器组中的任意一个服务器上面都可以监听该 IP 来提供对外服务, 这样达到的一个效果是不存在 IP 单点故障的问题, 并且该 IP 的服务能力可以通过增加机器来进行扩展.

它达到的效果如图所示:

Maglev 是如何工作的

首先, 我们来看一下 maglev 的数据包的流向图:

如图, 当一个用户访问一个带有 Maglev 负载均衡的服务的 VIP 的时候, 用户的请求首先通过 Internet 到达真实的服务节点所在的物理机房的核心交换机上, 也就是上图的 Router, 这个时候核心交换机通过 ECMP 的功能将请求该 VIP 的数据包均衡的发送给后面的 N 个 Maglev 节点(蓝色线1).

请求该 VIP 的数据包到达 Maglev 节点之后, Maglev 会知道该 VIP 对应哪些 Service Endpoint, 然后通过一种牛逼的一致性哈希算法选择一个 Service Endpoint 将数据包发过去(紫色线2), 而要返回给用户的数据包会由 Service Endpoint 直接返回到核心交换机上, 然后通过 Internet 返回给用户(红色线3).

以上简要的概括了数据包的是如何传输的, 看起来很简单, 那么整套体系要如何实现呢? 下面挑最重要的几个技术细节来详细讲解一下.

首先是 ECMP 等价路由功能, 它可以让交换机或者路由器使用多条不同链路而达到相同的目的地址, 一般的物理交换机都是支持该协议的, 只要打开该选项即可.

在物理交换机打开了 ECMP 的情况下, 对于同一个 VIP 地址, 只要有多个不同链路的路由信息, 交换机便可以工作, 那么这个路由信息是从哪里来的呢?

这个时候就轮到 Maglev 上场了, 首先每一个 Maglev 节点都会和核心交换机建立 BGP 连接, BGP 连接建立之后, Maglev 会通过该连接告诉交换机某某某 IP 我是可达的, 如果多个 Maglev 都告诉交换机说某某某 IP 我是可达的, 交换机上面便会记录多条类似于下面的路由条目:

<vip> via <Maglev1_IP> dev eth0
<vip> via <Maglev2_IP> dev eth0
<vip> via <Maglev3_IP> dev eth0
....

这个时候交换机在启用 ECMP 路由功能的情况下, 会根据上述的路由信息将数据包均衡的发送给多个 Maglev 节点, 好了, 这个时候数据包到了 Maglev 节点, 那么 Maglev 节点本身是如何处理这些数据包的呢? 如下图是数据包在 Maglev 节点上面的处理过程:

上面简要的说过, Maglev 要挑选一个 Service Endpoint 然后将数据包发给选中的 Service Endpoint, 那么两个问题, 如何挑? 如何发?

先说 Maglev 是如何挑选 Service Endpoint 的, 首先交换机会通过简单的一致性哈希算法将拥有相同5元组的 packet 发送给同一台 Maglev 节点, 然后 Maglev 通过 packet 目标 IP, 也就是 VIP 来选择对应的后端节点, 同样的在选择后端的时候 Maglev 也使用了一种一致性哈希算法, 这样便可以保证同一 TCP 连接上的所有的 packet 会打到相同的 Service Endpoint 上. 选择好后端之后, Maglev 会将该5元组对应的后端记录在自己的 connection tracking 表中, 等到下个数据包来的时候, 只要根据包的5元组直接查询这个 connection tracking 表即可. 那为什么有了一致性哈希选择后端, 还要有 connection tracking 呢? 这是因为当一个 VIP 对应的 Service Endpoint 扩容或者缩容的时候, 一致性哈希选择的结果会发生变化, 这样会导致同一连接上的包选择的后端不一致, 造成网络错误.

然后在说说 Maglev 是如何将数据包发送给挑好的 Service Endpoint 的, 从原理上来说, Maglev 会将收到的数据包封一层 GRE/IP 头然后发给 Service Endpoint, 相应的 Service Endpoint 端需要对收到的 packet 进行解包, 还有一种比较简单的修改方式, 如果 Maglev 节点和 Service Endpoint 是在一个二层网络里的话, 那么只要修改数据包的目标 mac 地址为选中的 Service Endpoint 的 mac 地址便可以将数据包发送过去, 后端也不需要进行解包. 修改好数据包之后, Maglev 只要把修改好的包从相应的网卡上发出去即可. 这里涉及到了读包写包的问题, 如果直接使用 Linux Kernel 提供的方法来直接读写 packet, 会发现性能不能满足需求, 在这里可以使用一些 Kernel Bypass 的技术来做, 比如 dpdk 或者其他 Kernel Bypass 的技术.

至此, Maglev 最重要的原理已经讲清楚了, 当然还有更细节的, 比如 Maglev 的一致性哈希算法是如何实现的等等, 这里不再赘述, 如果你想更加深入的了解可以看看 Maglev 的论文. 本文也是对 Maglev 论文的一个简单总结, 其中如果有理解错误或者不准确的地方也欢迎指正.

Maglev 论文下载

Maglev: A Fast and Reliable Software Network Load Balancer

最后, 你也可以到我自己搭建的博客上查看这篇文章:

http://codekiller.cn/2017/05/...

Google Maglev 牛逼的网络负载均衡器(转)的更多相关文章

  1. 我喜欢ASP.NET的MVC因为它牛逼的9大理由(转载)

    我很早就关注ASP.NET的mvc的,因为最开始是学了Java的MVC,由于工作的原因一直在做.Net开发,最近的几个新项目我采用了MVC做了,我个一直都非常喜欢.Net的MVC.我们为什么使用MVC ...

  2. 科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生

    科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生 黑科技,还是要提D.E.Shaw Research这个奇异的存在. 要讲这个黑科技,我们可能要扯远一点,先讲讲D.E. Shaw这个人是怎 ...

  3. 从苦逼到牛逼,详解Linux运维工程师的打怪升级之路

    做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感 ...

  4. SQL才是世界上最牛逼的语言!

    身处互联网行业,SQL 可能是你需要掌握的核心技能之一. 最早的时候,SQL 作为一门查询数据库的语言,是程序员的必备技能,运维.开发.Web 以及数据等从业人员都需要用到 SQL,毕竟只有查询到正确 ...

  5. 【转载】可能是世界上最牛逼的网站统计程序——Matomo

    大家做网站的时候一般都会使用网站统计程序.通常,国内网站会使用百度统计.CNZZ等,而国外网站则会使用Google Analytics等统计.国内的统计程序普遍功能不太丰富,且响应速度一般.Googl ...

  6. 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?

    为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...

  7. 最牛逼android上的图表库MpChart(三) 条形图

    最牛逼android上的图表库MpChart三 条形图 BarChart条形图介绍 BarChart条形图实例 BarChart效果 最牛逼android上的图表库MpChart(三) 条形图 最近工 ...

  8. 最牛逼android上的图表库MpChart(二) 折线图

    最牛逼android上的图表库MpChart二 折线图 MpChart折线图介绍 MpChart折线图实例 MpChart效果 最牛逼android上的图表库MpChart(二) 折线图 最近工作中, ...

  9. 最牛逼android上的图表库MpChart(一) 介绍篇

    最牛逼android上的图表库MpChart一 介绍篇 MpChart优点 MpChart是什么 MpChart支持哪些图表 MpChart效果如何 最牛逼android上的图表库MpChart(一) ...

随机推荐

  1. JS和OC间的通信(使用JavaScriptCore)

    JavaScriptCore 时代的通讯 iOS 7 开始,苹果提供了一个叫作 JavaScriptCore 的框架,使用 JavaScriptCore 框架可以实现 OC 和 JS 的互相调用,而不 ...

  2. 10-28SQLserver基础--数据库管理器(基础操作)

    C#基础--数据库(用来存储大量的数据) 操作数据库文件唯一途径 SQL server,结构化查询语言简称SQL. Analysis services:分析挖掘数据 Reporting service ...

  3. 监控和安全运维 1.4 nagios安装

    1. Nagios 简介是一个开源软件,可以监控网络设备网络流量.Linux/windows主机状态,甚至可以监控打印机它可以运行在Linux上或windows上基于浏览器的web界面方便运维人员查看 ...

  4. 部署和调优 2.5 tomcat配置和优化

    配置文件 vim /usr/local/tomcat/conf/server.xml 修改 <Connector port=" protocol="HTTP/1.1" ...

  5. c++ vector用法和迭代器

    1.在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. (1)头文件#include<vector>. (2)创建vector对象,vector<int> ...

  6. SQL server 2008安装教程

    下载SQL server 2008 r2(网上资源很多,这里给出一个:安装) 解压后右键以管理员权限打开set-up 这里可能会出现问题:.net framework 3.5未安装,可以参考 快速安装 ...

  7. 进程与进程之间通信Manager

    #!/usr/bin/env python from multiprocessing import Process,Manager #Manager进程与进程之间通信 def Foo(i,dic): ...

  8. js中的操作符

    写在前面 js语法 DOM对象(把body,div,p等节点树看成一个对象) BOM对象(把浏览器的地址栏历史记录DOM等装在一个对象) 浏览器是宿主,但js的宿主不限于浏览器,也可以是服务器,如no ...

  9. while 用法 for 循环的总结

    格式化输出.%s %d # name = input('请输入名字:') # age = input('请输入年龄:') # sex = input('请输入性别:') # # msg = '我的名字 ...

  10. 最短路dijkstra堆优化

    demo: #include<bits/stdc++.h> #define max_v 102000 #define inf 0x3f3f3f3f using namespace std; ...