《CDN 之我见》系列二:原理篇(缓存、安全)

《CDN之我见》共由三个篇章组成,分为原理篇、详解篇和陨坑篇。本篇章适合那些从未接触过、或仅了解一些 CDN 专业术语,想深入了解和感受 CDN 究竟是什么的同学。本次由白金老师继续为大家分享《CDN之我见》系列二,主要讲解缓存是什么、工作的基本原理是怎样的,以及 CDN 是如何面对安全挑战的。

《CDN 之我见》系列二:原理篇(缓存、安全)

首先我们先来说一下 CDN 的缓存系统。
《CDN 之我见》系列二:原理篇(缓存、安全)

缓存也叫 Cache,是 CDN 领域最重要的一个组成部分,对于静态内容分发,大至视频点播、文件下载,小至 html 页面、jpg/gif/png 图片、css/js 等,都可以缓存到本地,最终用户(网民)访问时,不必回到原始服务器拿取数据,从而节省了时间、降低了源站服务器的网络带宽支出和负载。

对于 CDN 来说,每台 Cache 机器每天的请求量是十分惊人的,磁盘上所存储的内容量也多得可怕,十几块 TB 级的硬盘被塞满数据也是很正常的事情,因此当一个请求到来时,能迅速检索出磁盘上的文件并读取、吐给最终用户成了一件很重要的事情。

如何快速检索数据?
一般采用高效的数据结构或算法,例如 Hash(哈希)。

《CDN 之我见》系列二:原理篇(缓存、安全)

Hash 算法简单说就是通过某种模运算取余,按照有限余数做为不同链表的坐标进行数据存储。若当有多个数据余数相同时,则再按照单链表的方式存储数据。

理论上 Hash 算法在最好的情况下,和 map 无异,O(1) 的时间复杂度。

在最坏情况下(所有数据样本经过 Hash 运算都得到同一个余数),则性能与单链表无异,查找时间复杂度是 O(n)。

如果磁盘空间不够了怎么办?
使用基于访问热度的内容淘汰算法,例如 FIFO、LRU、LFU、SLRU、LIRS 等,感兴趣的同学可以看一下推荐的文章:

《缓存淘汰算法 - LRU》http://flychao88.iteye.com/bl...
《Cache 替换算法只:LIRS》https://www.jianshu.com/p/036...
《详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)》https://www.cnblogs.com/s-b-b...
《HLR中的cache机制及其SLRU替换算法》http://www.docin.com/p-126462...
《CDN 之我见》系列二:原理篇(缓存、安全)

SATA 盘虽然存储空间大,但受寻道速度限制,IOPS 往往很低,响应时间会被拉长。而相比之下,SSD 可以大幅度提升响应速度,但受成本和技术工艺限制,SSD 盘的空间相比 SATA 而言要小很多、贵很多。综合上面两种情况,混合盘的分级存储模式诞生了,即 SSD + SATA,通过热度算法将最热的内容放到内存、次热放到 SSD,冷数据放到 SATA,最冷数据受磁盘空间限制不进行存储,直接从 upstream 或源站获取。

《CDN 之我见》系列二:原理篇(缓存、安全)

当网民访问到 Cache 服务器上时,Cache 服务器会利用 Hash 算法查找本地是否存有缓存数据,若有,则直接读取,组织成 HTTP 报文内容,吐给网民。

《CDN 之我见》系列二:原理篇(缓存、安全)

同理,若当本地没有缓存住的内容时,Cache 会向其上游(upstream)拿取数据吐给网民,并根据内容的描述(例如是否可以缓存,需要缓存多久)来决定是否/如何缓存住这个请求内容。

《CDN 之我见》系列二:原理篇(缓存、安全)

CDN 的关键技术是调度和缓存,有很多开源软件可以实现 CDN 的基本需求,但性能却远达不到商业需求。真正要做高性能的 Cache 系统,不仅需要在数据结构与算法层面深入,更要从硬件、操作系统、文件系统、底层原理等多个领域做更多的研究(例如阿里云自研的 CDN Cache 系统使用了裸盘技术)。
从上述内容大致可以看出一个道理:CDN,入门易,做好难!

《CDN 之我见》系列二:原理篇(缓存、安全)

原理篇最后一部分简单和大家介绍一下 CDN 的安全
《CDN 之我见》系列二:原理篇(缓存、安全)

一般的攻击分为两种类型,一种是蛮力型攻击,一种是技巧型攻击。
例如 SYN-Flooding、反射攻击、带宽饱和攻击等,都是通过海量请求(有些甚至是毫无用处的请求)将系统带宽资源、计算资源耗尽,从而达到使目标无法正常提供服务能力的目的,达到攻击者的攻击意图。
这种攻击的特点是:

攻击源分布广泛,攻击具有持续性,难以准确溯源
攻击手段暴力,流量大,以达到短时间不能服务为主要目的
技术门槛低,但由于需要众多资源,攻击成本较高
《CDN 之我见》系列二:原理篇(缓存、安全)

而例如 XSS 跨站、SQL 注入、CSRF、漏洞利用等,都是通过网站提供的系统(例如老版本操作系统存在协议栈崩溃漏洞)、组件(例如 bash、OpenSSL、Struts2 存在远程执行漏洞)、软件逻辑漏洞(例如输入框检测存在缺陷导致拼凑 SQL 语句的 SQL 注入漏洞)等来进行攻击。
这种攻击的特点是:

攻击流量小
攻击较为隐蔽,不易被察觉
以窃取内容为主要目的
攻击具有一定的破坏和不可逆性
无需大量攻击资源,攻击成本较低,技术含量较高
接入 CDN 后就可以规避安全风险吗?
是的,或者说可以从一定程度上尽可能解决或尽可能规避安全风险。

  1. 隐藏源站信息

当某个网站接入 CDN 后,源站信息会被隔离,外界很难找到真正的源站地址(这里说很难,其实也是有可能的,主要看源站的安全防范意识),这样攻击者至少就无法直接对源站进行直接攻击。

  1. 分布式架构

若做不到直接对源站进行直接攻击,则攻击者实际攻击的目标不是源站,而是 CDN 厂商的分布式架构,此时除非 CDN 厂商的所有 CDN 节点的所有服务器都被攻陷,否则仍然有部分服务器是可以提供服务的。

  1. 安全防护

对于技巧型攻击,CDN 厂商前端可以通过前置应用层过滤器的技术来分析、拦截可能存在的安全隐患。(例如阿里云的 SCDN 则是集成了 Security 与 CDN 于一身的新产品)

《CDN 之我见》系列二:原理篇(缓存、安全)

作为“系列二”的最后收尾,我想强调的是,CDN 除了技术,还有例如后台支撑系统、售后、销售等一系列的组件和团队配合运作,才能有安全、高效、稳定、极佳用户体验感的 CDN 产品。

最后还是那句话:CDN,入门易,做好难!
__

由于篇幅的关系,系列二把上次欠大家的“原理篇”补充齐全!

“系列三” 将开启《CDN 之我见》的第二个篇章:“详解篇”,会针对 CDN 领域的一些鲜为人知的技术、理念进行深入剖析,各位看官敬请期待。
原文链接

相关推荐