Akamai在内容分发网络中的算法研究(翻译总结)
作者 | 钱坤
钱坤,腾讯后台开发工程师,从事领域为流媒体CDN相关,参与腾讯TVideo平台开发维护。
原文是《Algorithmic Nuggets in Content Delivery》。这篇文章是akamai15年的文章,里面介绍了一些akamai在内容分发网络中的算法研究,下面对论文中的这些算法进行简单的总结。水平有限有限,有理解错误的还望指正。
ps:并不是所有的算法都已经投入到了实用阶段。
BLOOM FILTERS
Bloom filters的研究主要用在akamai的CDN中的两个场景:1)索引管理优化;2)内容过滤。
Bloom filters是hash算法的一个变种,有非常优秀的空间效率(使用位数组)和时间效率(插入的时间复杂度稳定为常数),但是会有一定的错误率。直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中。和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一个标志,用来判断key是否在集合中。其基本算法如下:
1)首先需要k个hash函数,每个函数可以把key散列成为1个整数
2) 初始化时,需要一个长度为n比特的数组,每个比特位初始化为0
3) 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1。
4) 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中。
通过一系列balabala的数学证明,可以得出最优hash函数个数k、位数组的位数m、存储的最元素数n关系如下:
再通过一系列balabala的数学证明,可以得出正向错误率、位数组的位数m、存储的最元素数n关系如下:
根据这两个公式,可以进行参数调整以达到预期目标。Bloom filters的主要场景如下:
1)索引管理优化:有些cache系统的索引查询可能由于访问慢设备导致查询操作较慢,可以在索引查询之前用使用Bloom filters搭建一层索引cache提升索引查询速度,如果Bloom filters中无法查到该文件,则认为该文件不存在,如果Bloom filters中可以查到该文件,则请求索引系统。在这种场景中由于存在元素删除操作,Bloom filters不能使用位数组,每一位需要用一个数字变量来代替,当多个文件共用一位时使用递增。
2)内容过滤:akamai统计了一个server cluster两天中web文件访问次数,如下图,可以发现,在总共4亿左右的文件中,有74%的文件仅被访问过一次,90%文件访问次数少于4次。
仅有单次访问的文件是没有必要落盘的,对于这种文件落盘会占用磁盘io和存储,并且可能会将更热的文件挤掉,进而降低cache命中率导致回源带宽增高。
以此为基础,akamai实现了“Cache-on-second-hit rule.”算法,即文件被第二次访问才落盘,而记录是否有过第一次访问所使用的算法就是Bloom filters。
由于cdn上被访问的文件数趋近于无穷,所以可以使用两个Bloom filters交替来记录文件第一次被访问,当第一个Bloom filters已经到了能记录的上限,就使用第二个Bloom filters,如果第二个也到了上限,则清空第一个Bloom filters重新使用第一个,每次查询文件是否曾经被访问需要查询两个Bloom filters。
Akamai实现了这个组件之后在测试环境进行了测试,从下面的测试结果来看,测试环境缓存命中率从74%上升到了83%,磁盘写数据量下降了44%,磁盘操作时延下降了24%。
稳定分配问题
稳定分配问题的研究主要被用于全局负载均衡。
在cdn中的网络中可以抽象出两个概念。
1)map unit,map unit包含两个元素,第一个元素是用户ip的集合,第二个元素是map unit的类型(比如video、web等)
2)server cluster,akamai的服务器集群最小单位是cluster,一个cluster中包含若干服务器。通过对map unit和server cluster进行稳定分配,可以实现全局负载均衡。
Akamai对Gale-Shapley算法进行研究拓展以用于解决全局负载均衡问题。标准的Gale-Shapley算法是被提出用来解决“稳定婚姻问题”的:为n个男性和n个女性互相找到最合适的配偶。算法的基本思路为,先对所有男士进行落选标记,称其为自由男。且每个男士和每个女士均有一份排序,在排序中标记心仪的异性排名。当存在自由男时,进行以下操作:
(1)每一位自由男在所有尚未拒绝她的女士中选择一位被他排名最优先的女士;
(2)每一位女士将正在追求她的自由男与其当前男友进行比较,选择其中排名优先的男士作为其男友,即若自由男优于当前男友,则抛弃前男友;否则保留其男友,拒绝自由男。
(3)若某男士被其女友抛弃,重新变成自由男。
把这个算法基于以下的点进行拓展用于对map unit和server cluster进行匹配,也就是全局负载均衡。
(1)map unit和server cluster数目并不相等。在正常的cdn场景中,map unit的数目是要多于server cluster的数目。
(2)排序列表可以不完整。没有必要建立一个map unit到所有的server cluster的性能分数排序,只需要选择出该用户组可能被调度到的服务器集群并进行打分排序即可。
(3)每个server cluster拥有不确定的任意的容量。估算server cluster的容量,并让它为多个用户组进行服务。
有了拓展的Gale-Shapley算法作为框架,再对机器的资源进行细化,一个server cluster中一台机器的资源可以具体分为两种:网络资源和非网络资源(如内存、cpu能力等)。网络资源消耗用BPS来表示,非网络资源消耗用FPS来表示。那么可以用如下一个分层的资源树来对一个机器的资源进行表示:
Node A代表机器的可用网络资源为50BPS,node B代表机器可用的非网络资源为30FPS,叶子节点代表不同的请求类型可以使用的FPS上限。
如果这时收到20单位video请求,每单位请求占用0.25FPS和1BPS,那么资源树剩余资源如上图中蓝字所示,node A剩余30BPS,node B剩余25 FPS,node C剩余25 FPS。
假设接下来收到26单位的web请求,每个请求消耗1FPS和0.2BPS,总共需要消耗26FPS和6.2BPS,这时发现当前机器的资源不足以承受全部的web请求,这时会根据Scoring(akamai用来评估客户端和服务器的服务性能的组件)的输出判断该cluster和哪种map unit之间有更好的性能,如果结果是更适合于服务新来的web请求,则按照Gale-Shapley算法会驱逐4单位的旧video请求,并接纳新来的web请求。反复进行这种驱逐操作可以让全局实现最优分配。
感觉这个算法在具体的实现细节上还存在着很多挑战。
一致性hash
一致性hash的研究被用来实现akamai的cdn局部负载均衡。感觉一致性hash应该和akamai有着千丝万缕的联系,比如两者都是来源于MIT,一致性hash的提出人曾经在akamai工作等等。
当用户被分配到一个server cluster之后,需要尽可能通过一致性hash将同样的文件请求尽可能的hash到某台已经在cache中缓存了该文件的机器上。所以可以通过一致性hash提升cache命中率,来达到提升性能和增加资源有效利用率的目的。
关于最基本的一致性hash算法网上有很多讲解,一致性hash解决了当分布式系统中某台cache down掉了或者新加入一台cache可能会导致所有cache内容要重新洗牌的问题。并引入虚拟节点来优化算法结果。这些内容网上有很多,就不在重复了。下面说一些论文提到的akamai对于一致性hash的特性化改造:
1)对于热点文件,为了防止请求压在服务器组内同一台机器上,需要将一个热点文件映射到k台服务器上进行分流,比较方便的方式为将文件映射在原本的hash出来的机器上以及之后的(k-1)台机器上。不同的热点文件集合在做一致性hash的时候,需要变换hash桶的排列,以防止由于hash值接近导致不同文件所映射的k台机器大部分重合,从而导致机器高负载的问题。
2)用户所使用业务也是做一致性hash需要考虑的输入之一。对于一个在akamai上注册的业务,会得到一个或多个统一分配的序列号,akamai可以按照序列号对对象存储,并将对于同样序列号的不同文件请求hash到cluster同一个机器(或集合),以尽可能满足某些客户端复用连接下载多个对象的需求(比如尽可能的把同一个web界面上的小对象存储到一台机器上)。
Leader election与数据一致性
即使两个机器上的运行程序完全相同,由于运行时的分别独立收集输入数据可能导致输出结果不相同的情况,这种情况需要leader election来在服务器组里选择一个leader来向其他的服务器分发运算结果,以统一输出。Leader的选择过程中会遇到数据一致性的问题,这种一致性的问题可以通过paxos或者raft算法来解决。我找到以下的两个地址,感觉对两个算法讲的比较容易理解:
Raft:Understandable Distributed Consensus
leader election有两种:
1)At-Least-One Leader Election:至少要选择一个leader。
2)At-Most-One Leader Election:最多只有一个leader被选择出来。
比如当网络出现问题导致一个集群出现两个子网,如果使用At-Most-One Leader Election类的算法不会允许选择出两个leader,而是选择宁可放弃leader选举的过程,使用比较旧的决策数据。比如akamai用户组划分的过程,如果网络中出现两份用户组划分的结果,会引发全局负载均衡运算出现问题,所以在这种情况下不能选举出两个leader,宁可使用旧一点的用户组划分结果。
相关推荐
图片流量节省大杀器:基于CDN的sharpP自适应图片技术实践
WordPress发布/更新文章、提交/审核评论自动清理腾讯云CDN缓存
此文已由作者授权腾讯云技术社区发布,转载请注明 文章出处,获取更多云计算技术干货,可请前往 腾讯云技术社区
欢迎大家关注 腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~
传播腾讯海量技术实践经验,www.qcloud.com
Akamai在内容分发网络中的算法研究(翻译总结)的更多相关文章
- 史上最全的CDN内容分发网络实战技巧(网络优化)
今天来给大家分享下关于 CDN 的东西,以及我自己的一些发现.一些个人的拙见.总共分为 3 个部分:原理.详解.各种坑. 首先说一下 CDN 的基本原理部分,主要分 4 块来描述:CDN 的由来.调度 ...
- Web前端性能优化教程02:使用内容分发网络
基础知识 服务器离用户越近,HTTP请求的响应时间将更短. CNAME:别名记录,当多个域名需要指向同一服务器IP,可以使用一个域名做A记录指向该服务器IP,然后让多个域名指向该A记录. ICP:In ...
- CDN(内容分发网络)技术原理
1. 前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加, 用户数量也在不断增加,受Web服务器的负荷和传输距离 ...
- CDN 内容分发网络技术
1.前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因 ...
- 深度剖析:CDN内容分发网络技术原理--转载
1.前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因 ...
- CDN内容分发网络
CDN的全称是Content Delivery Network,即内容分发网络,其设计思想是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定. CDN系统是在网络 ...
- http 协议_DNS_域名解析 DNS 服务器_内容分发网络 CDN_缓存机制_HTML5 浏览器存储技术_cookie_sessionStorage_localStorage
TCP/IP 协议族 是按层次去划分的 应用层 决定了向用户提供应用服务时通信的活动. FTP 协议(文件传输协议)DNS(域名协议)HTTP(超文本传输协议) 传输层 提供处于网络连接中 ...
- [转]CDN(内容分发网络)技术原理
1. 前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加, 用户数量也在不断增加,受Web服务器的负荷和传输距离 ...
- CDN加速-内容分发网络
内容分发网络 (互联网技术) 编辑 CDN的全称是Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输 ...
随机推荐
- tableView的编辑
首先记住声明编辑样式的属性 UITableViewCellEditingStyle 和四个步骤 第一步:让tableView处于编辑状态 [self.rootView.tabView setEdit ...
- 使用LVS实现负载均衡原理及安装配置详解
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...
- 毕向东udp学习笔记3多线程聊天
项目功能: 实现了多线程下的发送接收,比较好 希望可以加入GUI,类似聊天软件一样,有一个消息输入框,捕获输入消息,作为发送线程 有一个显示消息框,接收消息并显示,作为接收线程 不知道的是,当在线程中 ...
- 关于JavaScript中的escape、encodeURI和encodeURIComponent
此文内容与关于JavaScript中的编码和解码函数 关联 escape() 方法: 采用ISO Latin字符集对指定的字符串进行编码.所有的空格符.标点符号.特殊字符以及其他非ASCII字符都将被 ...
- Win8下,以管理员身份启动VS项目
之前一直是先以管理员身份启动VS,然后再打开项目的,比较麻烦,找了好久,总算有一个处理方案了 在Windows7下 通常使用修改属性的方式:在任意快捷方式上右击,选择属性,选择高级,选择以管理员身份启 ...
- iOS 手机摇一摇功能
调用手机摇一摇功能其实很简单,在你调用的控制器的 viewDidLoad方法里调用 [UIApplication sharedApplication].applicationSupportsShake ...
- jquery序列化form表单
在开发中有时需要在js中提交form表单数据,就需要将form表单进行序列化. jquery提供的serialize方法能够实现. $("#searchForm").seriali ...
- 深度神经网络(DNN)损失函数和激活函数的选择
在深度神经网络(DNN)反向传播算法(BP)中,我们对DNN的前向反向传播算法的使用做了总结.里面使用的损失函数是均方差,而激活函数是Sigmoid.实际上DNN可以使用的损失函数和激活函数不少.这些 ...
- Two analytical 2d line intersection in OpenCASCADE
Two analytical 2d line intersection in OpenCASCADE eryar@163.com Abstract. OpenCASCADE geometric too ...
- Github网站加载不完全,响应超时,如何解决
Github是一个代码托管平台和开发者社区,开发者可以在Github上创建自己的开源项目并与其他开发者协作编码.毫不夸张地说,高效利用Github是一个优秀的程序员必备的基本素质.可是,有的用户在打开 ...