谷歌负载均衡Maglev实现简析
目录
简介
LB工作流程
Maglev内部架构
控制器
转发器
转发器实现
快速包处理
免拷贝
批处理
简介
参考资料:Maglev: A Fast and Reliable Software Network Load Balancer
https://storage.googleapis.com/pub-tools-public-publication-data/pdf/44824.pdf
自2008年起,google已经用Maglev来部署服务的负载均衡,这是一套与传统硬件负载均衡不同的软件网络负载均衡。而Maglev负载均衡器可以单独部署,也可以直接部署在server节点上。
LB工作流程
首先是通过DNS把请求分配到该用户相近的集群中(分配给用户的DNS解析IP为该集群vip)。集群的核心路由器将请求转发给Maglev(负载均衡器)。
集群中多个Maglev通过BGP(边界网管协议)向路由器报告自己所监听的vips, 核心路由器通过ECMP(等价多路径)协议将请求分发给Maglev, 而ECMP可以保证同一条流分发到同一个Maglev,可以保证用户数据流通畅。但是ECMP还有一个缺点,所有链路等价的(不能权重配置),必须所有Meglev处理能力是相近的,否则,可能会发生拥塞。
Maglev在收到请求后,再做负载均衡,分发给服务节点。在对请求选定服务节点之后,对该请求做封包处理,加上Gre header发给节点。节点将解封并处理请求,而返回的response直接以vip为源地址,用户地址为目的地址,发往路由器(DSR,Direct Server Return),不再经过Maglev. 这样又提高了Maglev一半的处理能力!
Maglev内部架构
Maglev分为两个部分:控制器和转发器
控制器
通过心跳检查转发器是否正常,并将所有的vips通过BGP通知给路由器
转发器
每一个vip关联到一个或多个后端池(BP: backend pool),每一个BP包含多个后端server的真实ip或者其他BP。同时对每一个后端server做健康检查,通过一些策略,将数据包均衡负载到各个健康的后端server上去。
转发器实现
转发器作作为核心模块通过steering module内核模块直接从网卡收发包,从而绕过了linux kernel协议栈,从而实现快速转发。
转发器收包时先将数据包五元组做哈希运算,并根据哈希值放入到不同的接收队列,每个接收队列的都有一个独立的线程处理其数据包重写(添加Gre header)的逻辑。
线程处理先做vip匹配过滤,再计算五元组哈希,查找连接跟踪表(每个线程都有一个独立的连接跟踪表),查到就直接用该连接信息添加Greheader,查不到就通过一致性哈希选择一个后端服务器,并添加对应Gre header,同时将该五元组的连接添加到连接跟踪表中去。数据包添加完Gre header之后,就将数据包发送到对应的发送队列(即一个处理线程对应一个接收队列和一个发送队列)。
muxing module内核模块通过poll轮询所有的发送队列,将数据包都发送到网卡。
快速包处理
免拷贝
steering module和muxing module使得收发包绕过了内核,避免了kernel昂贵的开销。且共享内存处理包,避免内存反复拷贝的开销。
启动时建立packet pool的共享内存池,steering和muxing各自有环形一个指针队列,每个指针指向packet pool中的一个packet对象。接收端有3个指针指向接收队列,
1. received指针: 网卡将接收到的数据包放在这个指针对应内存,并让received指针向前移动。
2. processed指针:steering将received数据包分发给处理线程,processed指针向前移动。
3. reserved指针: 将未使用的packet对象存环形队列,reserved指针向前移动。
发送端也有3个指针指向发送队列,
1. sent指针: 网卡将就绪的数据包发送,并让sent指针向前移动
2. ready指针:muxing将重写包头的数据包放入队列,改为就绪状态,ready指针前进
3. recyle指针:muxing将已发送数据包返回packet pool, 并将recyle指针前进
批处理
1. 因为各线程间没有锁,没有竞争,将每个处理线程固定到一个CPU核心,降低内核切换,提高线程效率
2. 转换器会对进来的包设置延迟时间,缓冲数据包,再进行批处理。批处理也会提高转换效率
后续如何一致性哈希选择后端服务器,错误处理,vip匹配,这些这里就不多讲了(因为我也没看那么细^_^),有兴趣的朋友可以去阅读原文,这里只做一个大体结构逻辑的描述。
谷歌负载均衡Maglev实现简析相关推荐
- SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测
之前和很多群友聊天发现对2016的无域和负载均衡满心期待,毕竟可以简单搭建而且可以不适用第三方负载均衡器,SQL自己可以负载了.windows2016已经可以下载使用了,那么这回终于可以揭开令人憧憬向 ...
- 从Google Maglev说起,如何造一个牛逼的负载均衡?
Maglev是谷歌为自己的数据中心研发的解决方案,并于2008开始用于生产环境.在第十三届网络系统设计与实现USENIX研讨会(NSDI '16)上, 来自谷歌.加州大学洛杉矶分校.SpaceX公司的 ...
- 从Google Maglev到UCloud Vortex,如何造一个牛逼的负载均衡?
Maglev是谷歌为自己的数据中心研发的解决方案,并于2008开始用于生产环境.在第十三届网络系统设计与实现USENIX研讨会(NSDI '16)上, 来自谷歌.加州大学洛杉矶分校.SpaceX公司的 ...
- 服务器集群负载均衡原理
当系统面临大量用户访问,负载过高的时候,通常会使用增加服务器数量来进行横向扩展,使用集群和负载均衡提高整个系统的处理能力. 而我们讨论的负载均衡一般分为两种,一种是基于DNS,另一种基于IP报文. 利 ...
- 转载和积累系列 - L4负载均衡的设计与实现
目录 简介 一.LVS的局限性 1. 数据包转发性能问题 2. HA-主备结构的浪费 3. 转发模式的优缺点 二.google maglev负载均衡 Maglev Consistent Hash Go ...
- CDN基于谷歌开源Katran四层负载均衡方案的应用 - 原理篇
CDN作为一种分布式缓存加速服务,对于访问量级大的区域,单个节点带宽建设一般可达百Gb量级,对外配置虚拟IP提供服务,节点内部需要通过多层负载均衡(LB)将请求分发到内部的若干台服务器进行处理.一般情 ...
- 深入浅出学习透析Nginx服务器的基本原理和配置指南「负载均衡篇」
负载均衡 之前的章节内容中[深入浅出学习透析Nginx服务器的基本原理和配置指南「初级实践篇 」]和 [深入浅出学习透析Nginx服务器的基本原理和配置指南「进阶实践篇」],我们采用的代理仅仅指向一个 ...
- 直追亚马逊,谷歌微软云服务添负载均衡功能
谷歌近日推出了其公共云服务的负载均衡功能,让客户能够自动缩放和关闭的虚拟机,以适应突发的高峰需求. 就在短短的几个月之前,微软已为其Azure公共云服务添加了新的自动缩放功能.现在,这两家公司都有效地 ...
- 刨析django----Nginx反向代理与负载均衡
目录结构 Nginx是什么 正向代理与反向代理 Nginx的安装 window安装 linux安装 配置反向代理 Ubuntu1804下遇到的问题 Nginx反向代理案例 Ubuntu1804 配置N ...
- 简谈docker swarm中负载均衡原理
同一集群内部的负载均衡模式 基于在swarm中创建节点即可分配内部域名的情况下: dnsrr 单纯通过内部DNS内部组件进行负载均,由于DNS缓存机制等问题,有局限性. VIP: 简单来讲是 (内部) ...
最新文章
- ASP.net session 使用总结(2)
- 立体匹配中的方法论和弱纹理恢复
- peewee创建mysql_python – peewee MySQL,如何创建包装SQL构建的ins的自定义字段类型?...
- 先序中序数组推后序数组
- Mask R-CNN抢车位,快人一步!
- CNN进行新闻文本分类代码实战,包含分类文本
- asp.net core 官方文档
- 拓端tecdat|R语言文本挖掘tf-idf,主题建模,情感分析,n-gram建模研究
- Sql Server 2005 开发版亲测可用下载地址
- VB程序设计—For循环结构
- mace micro 代码分析: netdef 和Graph文件的生成
- 卷积神经网络前向及反向传播过程数学解析
- [sharepoint]文档库,文件夹授权
- HDR阴影高光图像增强
- 超详细28天备考Tableau考试经验分享
- 阿里云P2P内容分发网络(PCDN)实操手册
- Nodejs:ESModule和commonjs,傻傻分不清
- OpenStack Nova hacking和读书笔记
- java 画图 graphics
- 论文学习 Feature Generating Networks for Zero-Shot Learning
热门文章
- 负载均衡设备oracle,高可用的Oracle数据库负载均衡技术--深信服AD系列应用交付平台...
- MapReduce中Shuffle机制的学习案例——房屋租赁信息
- 苹果自带相册打马赛克_原来手机点击这个按钮,就能一键生成音乐电子相册!这也太厉害了...
- SpringCloud-狂神(1. 概述)学习笔记
- js实现通知弹屏 Notification
- Spring Cloud如何可用于微服务架构
- 【HTML 5】HTML5 Canvas rect(), strokeRect() 和 fillRect() 的区别
- 【小万出生记——第0篇】想做一款机械手
- 分解因式公式JAVA_递归算法解决因式分解(java版)
- super expression must either be null or a function 报错解决方法