Google 是如何做负载均衡的?

标签: google 负载均衡 | 发表时间:2016-11-21 08:03 | 作者:
出处:http://oilbeater.com

Google 使用的技术一般都自带光环,吸引程序员的注意,基础设施方面的东西就更是如此,年初 Google 发布了篇论文介绍内部的负载均衡器的实现,让我们有机会一睹可能是全球最好的负载均衡器。

通常情况下的负载均衡要在灵活性和性能之间做权衡,用户态软件层面有 Haproxy 和 Nginx 这样的老牌负载均衡软件,他们一般配置和使用起来都比较容易,但是由于需要数据包从网卡到内核再到软件一层层向上处理,再一层层向下转发,堆栈比较深单机性能通常都比较一般。为了提高单机性能,减少堆栈层级就有了 Linux 里华人之光的 LVS,工作在内核层的负载均衡器,性能有着数量级的提高,然而配置起来相对也比较复杂而且对网络条件要求也有特殊要求。那 Google 有什么秘密的配方来达到高性能呢?

一般来说负载均衡器本身就是后端服务横向扩展的一个接入点,对于一般站点一个负载均衡器就够了,然而应对 Google 这种级别的流量,负载均衡器本身也要能横向扩展,还要处理负载均衡器的高可用,Google 又是如何做到的呢?

以我们访问 www.google.com 为例,第一步 DNS 服务器会根据请求的位置返回一个离请求地理位置最近的 VIP 地址,先在 DNS 这一层做一个横向扩展。接下来请求达到 VIP 对应的路由器,路由器通过 ECMP 协议,可以将请求平均分配到下面对等的多个负载均衡器上,这样在路由器这一层做了个负载均衡,让后面的负载均衡器也实现了横向扩展。再往下是一个类似于 LVS 中 DR 模式的分发,负载均衡器将请求包转发给服务器同时将源地址改为客户请求时的地址,服务器响应时将响应包的源地址改为 VIP 的地址直接打给路由器而不通过负载均衡器来降低负载均衡器压力。流程图如下

对了,Google 的这个负载均衡器叫 Maglev,磁悬浮列车的意思。自然是要做到极致的性能,只看流程似乎和 LVS 中 DR 模式很类似,但内部就完全不一样了。

简单的说虽然 LVS 已经做到 Linux 内核里了,但是在 Google 看来 Linux 是性能的瓶颈,到 LVS 之前还要经过完整的 TCP/IP 协议栈以及内核的一系列 filter 模块,而这些对于转发来说是没有必要的。于是 Google 的做法就是简单粗暴的绕过内核,把 Maglev 直接架在网卡上对接网卡的输入和输出队列,来一个数据包也不需要完整的 TCP/IP 协议栈的解析,进来的包只要分析前几个字节,拿出源地址,源端口,目标地址,目标端口和协议号这个五元组对于转发来说就已经足够了。剩下的诸如 payload,序列号之类的东西统统不关心直接塞到网卡输出口给后面就行了。

前几天听美团的介绍他们的负载均衡器是用的类似的思路用 DPDK 直接在网卡上编写应用,性能相对 LVS 就有数倍的提升。看 Maglev 的实现为了榨干性能是直接写在网卡上的,都没有 DPDK 之类的封装。绕过内核就可以自己分配内存管理内存就可以进一步的压榨性能。论文中可以看到 Maglev 是直接和网卡共享内存的,这样就不需要将数据包再从网卡进行一次复制到负载均衡器中,也不需要把数据包再从负载均衡器复制到网卡,网卡入口队列,负载均衡器,网卡出口队列共享一个数据池空间,三个指针不断的移动处理数据包,可谓是在内存这里做到了极致。

当然诸如 CPU 绑定,每个 CPU 专职处理一个线程来避免 cache miss,memory contention 这种常规优化也是都有的。最终的效果就是处理一个数据包平均需要 350ns,而性能发生抖动的情况一般是由于网卡发数据包是批量的或者要等待一个 timer 的中断,而这个中断的时间是 50us 所以当流量小的时候这个延迟可能会达到 50us。(我觉得 Google 这么写其实是在炫耀自己性能好,瓶颈在网卡刷新速度上,而不在负载均衡器上)

通常的负载均衡器都是一个单点,而 Maglev 是一个集群,集群就会碰到很多的问题。严格来说负载均衡器不能算是一个无状态的服务,因为 TCP 连接本身是有状态的,一组会话内的请求包必须转发到相同的后端服务器,不然服务器端的 TCP 会话就乱套了。对于单点的负载均衡器来说很好解决,记录个转发表里面有每个数据包的五元组和它第一转发到哪台机器,来一个新的数据包查这个表就知道给谁了。而像 Maglev 这样的集群数据包是通过路由器 ECMP 随机分发的,第一个数据包是这个 Maglev node 处理,下一个就不知道去哪个 Maglev node 了。而且集群就会涉及滚动式的更新和随机的故障,这样本机的转发表也就很可能会丢失。

之前听美团的介绍,他们的做法是在多台机器之间做内存的同步每次更新都要进行一次同步来保证所有机器转发表的一致。而 Google 一帮人不愧是搞研究出身的,直接就上了一致性哈希这个大杀器。这样的话可以直接通过五元组散列到后端的一台固定服务器,这样硬生生的把有状态服务做成了无状态,如此一来 Maglev 层面个就可以随意的更新,上线下线了。顺便的一个好处就是后端增加下线服务器都只会影响到当前这台机器所处理的连接不会造成所有连接的 rehash。当然只用一个普通的一致性哈希算法也没啥意思,Google 为了自己的需求专门写了个 Maglev Hashing

论文里还介绍了很多负载均衡器运维方面的经验以及设计的过程和经验,还说了下一些新的发展方向,感兴趣的可以看一下 论文原文,当然你要翻下墙(逃

相关 [google 负载均衡] 推荐:

Google 是如何做负载均衡的?

- - Oilbeater
Google 使用的技术一般都自带光环,吸引程序员的注意,基础设施方面的东西就更是如此,年初 Google 发布了篇论文介绍内部的负载均衡器的实现,让我们有机会一睹可能是全球最好的负载均衡器. 通常情况下的负载均衡要在灵活性和性能之间做权衡,用户态软件层面有 Haproxy 和 Nginx 这样的老牌负载均衡软件,他们一般配置和使用起来都比较容易,但是由于需要数据包从网卡到内核再到软件一层层向上处理,再一层层向下转发,堆栈比较深单机性能通常都比较一般.

nginx负载均衡配置

- - 开心平淡对待每一天。热爱生活
  使用负载均衡的话,可以修改配置http节点如下:. #设定http服务器,利用它的反向代理功能提供负载均衡支持. #设定mime类型,类型由mime.type文件定义. #省略上文有的一些配置节点. #设定负载均衡的服务器列表. #weigth参数表示权值,权值越高被分配到的几率越大. server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口.

解析nginx负载均衡

- - 搜索研发部官方博客
摘要:对于一个大型网站来说,负载均衡是永恒的话题. 随着硬件技术的迅猛发展,越来越多的负载均衡硬件设备涌现出来,如F5 BIG-IP、Citrix NetScaler、Radware等等,虽然可以解决问题,但其高昂的价格却往往令人望而却步,因此负载均衡软件仍然是大部分公司的不二之选. nginx作为webserver的后起之秀,其优秀的反向代理功能和灵活的负载均衡策略受到了业界广泛的关注.

Haproxy+KeepAlived 负载均衡

- - CSDN博客系统运维推荐文章
软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现. LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. 还可以使用nginx来实现,不过nginx只工作在7层网络之上. 详细请参考 抚琴煮酒写的“ 软件级负载均衡器(LVS/HAProxy/Nginx)的特点简介和对比”这篇文章,简单很详细,很好.

lvs+keepalived 负载均衡

- - CSDN博客系统运维推荐文章
LVS是一个开源的软件,可以实现LINUX平台下的简单负载均衡. LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器. 目前有三种IP负 载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh).

负载均衡技术

- - ITeye博客
 Internet的规模每一百天就会增长一倍,客户希望获得7天24小时的不间断可用性及较快的系统反应时间,而不愿屡次看到某个站点"Server Too Busy"及频繁的系统故障.   网络的各个核心部分随着业务量的提高、访问量和数据流量的快速增长,其处理能力和计算强度也相应增大,使得单一设备 根本无法承担.

haproxy负载均衡 xtracluster

- - x-marker的博客
上一篇为xtracluster的安装(http://xmarker.blog.163.com/blog/static/226484057201472610520306/),本篇将记录下使用haproxy在三个数据节点做负载均衡,haproxy可以安装在数据节点,也可以安装在别的节点,如果安装在数据节点,需要注意端口号不能和mysql的3306冲突.

RabblitMQ Cluster + HAProxy(负载均衡)

- - 飞翔的荷兰人
        在本节中,我们主要来学习软件负载均衡器HAProxy在RabbitMQ集群中的使用.         软件负载均衡器HAProxy.         HAProxy的特点是:.         1、HAProxy是支持虚拟主机的,,并能支持上万级别的连接;.         2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;.

负载均衡之LVS

- - 标点符
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 是由章文嵩博士发起的自由软件项目. LVS主要用于多服务器的负载均衡. 它工作在网络层,可以实现高性能,高可用的服务器集群技术. 它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器.

负载均衡之HAPorxy

- - 标点符
HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案. HAProxy稳定性也是非常好,可以与硬件级的F5相媲美,根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom’s 10GbE NICs (Myri-10G PCI-Express),这个数值作为软件级负载均衡器是相当惊人的.