龙空技术网

CDN系统缓存机制、内容分发与技术选型

阿诺大话科技Hero 305

前言:

现在小伙伴们对“cdnnginx缓存原理”大体比较重视,大家都需要知道一些“cdnnginx缓存原理”的相关知识。那么小编也在网上收集了一些关于“cdnnginx缓存原理””的相关资讯,希望朋友们能喜欢,各位老铁们快快来学习一下吧!

阅读本文需要了解一些基础知识,可参阅历史文章:CDN系统架构综述 CDN系统调度原理与技术选型

缓存机制

CDN系统如果用一句话来描述,那它就是一套分布式的缓存系统。由此可见,缓存功能在CDN体系中的核心位置。可以说,CDN系统是否好用,就在于缓存的效率上。

评估CDN缓存实现的效果,最直观的数据莫过于命中率了。简单来说,就是终端连接上CDN的边缘节点以后,它所需要的内容就在服务器的内存中,这样就能最快地给出数据了。

如果终端所要的数据在当前边缘节点上没有,那么边缘节点就要向上层中转节点发起请求,直到顶层节点回源,再把数据层层转发下来。显然,这个时期的终端访问就会产生较长的延时。

现实情况不会如此理想,每次访问都能命中,这是难以做到的。但我们可以调整缓存功能的策略与算法,持续提高访问命中率,从而使得CDN系统服务效果越来越好。

从原理上来说,缓存机制能够产生效果,是基于局部性原理。这和操作系统的内存管理类似,即数据的访问不是均匀的,热点数据总是会尽可能地保留在内存中,而不是被交换出去。

可以假设一个场景,即源站存有一万部电影视频,而这时有一万名用户来观看电影。如果每个人看的影片都不一样,那么CDN系统就无法在缓存层面有太多办法,只能是线性扩容。

而现实情况则是大量用户观看的都是少数的热点影片,这样缓存功能实现得好,则可以节省大量昂贵的存储资源。下面分别从提高缓存命中率的两个方面来说。

内容替换算法

内容替换,就是在一个物理节点上,如何决定哪些内容需要保留在内存中,哪些则作为过期数据要被替换掉。因为RAM资源是非常昂贵的,所以通过算法利用好有限的资源就很重要了。

LRU算法:其英文全称是Least Recently Used,即最近最少使用。这是一种直观、符合直觉的方法。算法规则是构造一个线性队列,然后被访问过的数据会置于队列的前端。当有新数据进入时,则将队列末端的数据置换出去。

  初始队列:1,2,3  访问数据2之后:2,1,3  访问数据4之后,数据3被置换出去:2,1,4

这个算法容易理解,实现也不难。但其缺陷在于只将访问次数作为统计依据,并不能真实反映出数据的热点情况。实际运行中,数据有可能出现频繁进出RAM的情况。

例如,视频数据的热度往往与时间有着相关性。那么接下来的算法就将时间因素考虑在内了。

LFU算法:英文全称是Least Frequently Used,即最少频率使用。它的算法规则是,将RAM分为两个区域,一是固定缓存区,这里存放的更新不频繁的数据。另一个是隐藏缓存区,存放的是变化频繁的数据。

当请求的数据不在RAM中时,数据会首先存放至隐藏缓存区中。然后每间隔一段时间,就会计算隐藏缓存区中数据的访问次数。那些单位时间内被访问次数多的数据,就会被转移至固定缓存区中。

  初始状态:固定缓存区:1,2,3  隐藏缓存区:4,5,6  访问数据7,放入隐藏缓存区,数据6则被置换出去,隐藏缓存区:4,5,7  间隔一段时间后,将隐藏缓存区中最热数据4置入固定缓存区,数据3则被置换至隐藏缓存区, 固定缓存区:1,2,4  隐藏缓存区:3,5,7

LFU算法相对于LRU加入了时间因素的考量,有助于减少数据的频繁置换。但其问题在于需要设置合理的时间间隔,以及固定缓存区与隐藏缓存区的配比等。如果参数设置不合理,则难以达到最佳效果。

加权因子:准确地说,加权因子并不是一种算法,而是一种策略。其原理就是赋予内容数据以某种权值,值越高的,则留在RAM中的可能性越大。

其实无论是LRU还是LFU算法,都并不关注内容本身,而是将所有数据都一视同仁。决定数据是否驻留在RAM中的,仅由其被访问的热点程度而决定。这是一种被动的方式,面对突发式的高并发请求,往往初期会面临较大压力。

而加权因子,则可以将关注点扩展至内容本身。例如,一部刚从院线下线的大片,在全网进行首播时,就可以赋予其较高权值,使其得以在无访问的情况下也能进入RAM。在开播时就可以平稳地应对高并发的访问压力。这在CDN厂商提供的服务中,一般称之为“预热”。

所以,加权因子的计算方法就成为关键。上述根据内容的院线属性就是其中一个维度,而实际情况中,则要计算更多维度的属性,从而得到一个更加准确的权值。

基于大数据的热点计算

随着大数据技术的兴起,对于内容权值计算又增加了一个很有力的手段。一般来说,大数据技术的应用分为两个层次,一是在CDN体系之内,另一则是在CDN体系之外。

在CDN系统内部,大数据平台主要是通过收集各个节点产生的日志数据,对其加以分析并判断,然后调整内容的权值。例如,在某个局部地区,一个视频访问量突然增大,那么大数据平台判断其有可能成为全网热点,则可以立即提升权值。

而在CDN系统之外,大数据平台可以综合分析多维度信息,从而对内容做出精准判断。那些有能力自建CDN的企业组织,都会与自己的业务结合,通过大数据技术充分发挥CDN的性能。

例如,一位能够稳定产出优质视频的播客主,他发布的内容就有可能被赋予较高权值,在访问量爆发式增长之前,就被CDN系统优先缓存。

还有就是突发的社会热点新闻事件,大数据平台能够比人为感知的更迅速,从而可以将相关内容的视频赋予高权值。

可以说,大数据+AI的方式,在CDN系统中的运用已经越来越广泛深入了。其在内容热点的重要性上,已经超过了传统的纯算法方式。因为它不需要过多的人工干预,就能做到提前判断并决策,并可以从全局层面实现缓存的合理分布。

分发传输

CDN系统的缓存一般都是在一个广域的范围内分布。而这种数据的分发工作,则对网络环境有一定要求。所以一般会以地域和运营商为划分,建设相应的节点。

一个节点内由若干台服务器组成,在这些服务器上则会部署负载均衡与缓存服务程序。各个节点间通过调度、缓存服务的请求与响应联结起来,由此形成CDN的传输网络。

下面分别讨论传统的树形分层传输结构,以及5G时代来临,以边缘计算为特征的多点共享式结构。

树形分层结构

在树形结构中,CDN传输体系会分为三层,分别是核心层、中转层,以及边缘层。

核心层一般会选择在一线城市的多线机房部署,以期获得最优的网络资源环境。它主要是发起回源请求,以及存储所有的介质。这一层的节点数不会太多,例如北方就在北京选址,南方则在广州或者上海选址。

中转层通常都分布在各个省会城市的多线机房。它们负责响应边缘层的请求,从核心层将数据缓存下来,并传输给边缘。这一层的节点会包含较多的服务器,以提供强大的算力与存储力。

从实际部署上来说,中转层同时也会承担起省会城市及周边地区的边缘服务。所以这也是CDN建设中,成本所占比重较大的一部分。在一些人口稠密的省份,省会城市里会建设多个节点。

边缘层则直接面对终端的请求,如本地请求不命中,则向中转层请求数据,并及时向终端输出。所以,这一层对网络环境要求较高,延迟太高,或者传输不稳定,都不利于作为边缘节点使用。

CDN的实际部署并不是一蹴而就的,而是一个长期、动态的过程。一般来说,会分期进行。例如前期部署是在一线城市及重点城市配置节点,然后根据用户增长及访问情况,再投入成本有针对性地增加节点。

树形分层结构

多点共享结构

在一些新兴的CDN厂商中,他们已经走出了与传统CDN不同的道路。例如有的厂商与路由器厂家合作,将家庭网关变成了自己的边缘节点;有的则基于过往客户端的大规模装机量,将PC变成了自己的节点。

这些方法都可以有效降低带宽成本,从而提供很有价格竞争力的CDN服务。不过这种方式占用的是运营商的上行带宽,有可能会遭到运营商的封杀。

但随着5G技术的普及,很可能家庭网关就不再需要了。而在那时,高带宽低延迟的网络环境,驱使我们的应用也会不断升级。

例如视听体验相比于现在的变化就是巨大的,VR/AR能够得到广泛应用,在线教育、游戏娱乐等可以获得接近于真实场景的沉浸式体验。

这些实现如果还是基于传统CDN,那么主干带宽则会成为瓶颈,所以和用户终端直连的边缘节点,势必就要承载更多的计算任务。

单个边缘不可能配备太强大的CPU与存储资源,因此对于CDN业务来说,边缘节点之间充分共享数据,是一个很好的策略。当然,这需要解决好数据一致性问题,以及高效的调度实现。

多点共享结构

技术选型

目前使用较多的开源http缓存服务,有squid、nginx、ATS(Apache Traffic server)、varnish等。

squid出现的时间最早,但其架构还是单进程模式,无法支持多核系统。目前除了一些遗留系统,大多不再采用了。

nginx的多进程架构使得其在多核系统上,可以充分发挥性能。不过其对外部文件的读取比较麻烦,作为专门的缓存服务来说,额外需要做的工作很多。

varnish性能表现优异,不过更适合于小文件做纯内存式的缓存服务。对于构建大型广域的分布式缓存服务,就显得力不从心了。

ATS则兼具了高效的性能与灵活的配置,支持插件式的二次开发。目前也是互联网CDN厂商中使用较多的开源缓存服务。不过其系统复杂性高,在开发与运维的人力资源成本上需要较大投入。

通常来说,一个节点内会采用LVS+keepalived+nginx来构建负载均衡与反向代理,然后由ATS来提供缓存服务。

节点逻辑部署架构

标签: #cdnnginx缓存原理