Google Maglev 牛逼的网络负载均衡器(转)
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 牛逼的网络负载均衡器(转)的更多相关文章
- 我喜欢ASP.NET的MVC因为它牛逼的9大理由(转载)
我很早就关注ASP.NET的mvc的,因为最开始是学了Java的MVC,由于工作的原因一直在做.Net开发,最近的几个新项目我采用了MVC做了,我个一直都非常喜欢.Net的MVC.我们为什么使用MVC ...
- 科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生
科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生 黑科技,还是要提D.E.Shaw Research这个奇异的存在. 要讲这个黑科技,我们可能要扯远一点,先讲讲D.E. Shaw这个人是怎 ...
- 从苦逼到牛逼,详解Linux运维工程师的打怪升级之路
做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感 ...
- SQL才是世界上最牛逼的语言!
身处互联网行业,SQL 可能是你需要掌握的核心技能之一. 最早的时候,SQL 作为一门查询数据库的语言,是程序员的必备技能,运维.开发.Web 以及数据等从业人员都需要用到 SQL,毕竟只有查询到正确 ...
- 【转载】可能是世界上最牛逼的网站统计程序——Matomo
大家做网站的时候一般都会使用网站统计程序.通常,国内网站会使用百度统计.CNZZ等,而国外网站则会使用Google Analytics等统计.国内的统计程序普遍功能不太丰富,且响应速度一般.Googl ...
- 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?
为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...
- 最牛逼android上的图表库MpChart(三) 条形图
最牛逼android上的图表库MpChart三 条形图 BarChart条形图介绍 BarChart条形图实例 BarChart效果 最牛逼android上的图表库MpChart(三) 条形图 最近工 ...
- 最牛逼android上的图表库MpChart(二) 折线图
最牛逼android上的图表库MpChart二 折线图 MpChart折线图介绍 MpChart折线图实例 MpChart效果 最牛逼android上的图表库MpChart(二) 折线图 最近工作中, ...
- 最牛逼android上的图表库MpChart(一) 介绍篇
最牛逼android上的图表库MpChart一 介绍篇 MpChart优点 MpChart是什么 MpChart支持哪些图表 MpChart效果如何 最牛逼android上的图表库MpChart(一) ...
随机推荐
- L2-014. 列车调度(set的使用,最长递增子序列)
L2-014. 列车调度 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 火车站的列车调度铁轨的结构如下图所示. Figure ...
- Unreal Engine 4的常见Tips
转自:http://www.unrealchina.net/portal.php?mod=view&aid=66 退出游戏: UKismetSystemLibrary::QuitGame(th ...
- leetcode590
树的后序遍历. class Solution { public: vector<Node> Tree; void postTree(Node node) { for (auto n : n ...
- scrapy xpath 节点关系
父节点 子节点 兄弟节点 先辈节点 后代节点
- myeclipse实用快捷键
笔者这里总结的是个人在使用myeclipse时常用的快捷操作,总结如下: 1.Ctrl + / :为选中的一段代码加上或去掉注释符 Ctrl + Shift + / :( ...
- C#高级参数ref的使用
ref关键字用于将方法内的变量改变后带出方法外.具体我们通过例子来说明: 例子中,将变量n1和n2交换了.如果没有加ref参数,由于没有swadDemo()方法没有返回值,调用后,n1和n2是不会交换 ...
- dubbo错误排查之No provider available for the service
今天搞的一个dubbo服务,暴漏出来了,但是consumer端启动就报这个错,排查过程记录一下 一.启动zkCli 利用命令查看 ls / ls /dubbo 继续查看 ls /dubbo/com.w ...
- css的relative与absolute(一)
relative与absolute是position的两个值,本文对这两个值得关系进行了一个小实验 实验一: 首先定义了两个div元素,代码如下所示: <!doctype html> &l ...
- SpringBoot表单验证
需求:年龄在18岁以下的女生不能注册 处理器中的写法: 实体类中的写法:
- 基于IFC的大型三维城市群体——智慧城市模拟