0x1简介
因为公司分布式项目需要,突然想了解常见开源的CDN软件,于是Google了一下。
0x2原理
基本原理图
内容类型识别模块: (静态的文件:asp,jsp,php,jpg,gif,png等等;媒体文件:mp3,mp4,flv,mkv等等)
解析模块:(服务器域名配置cdn的系统的dns,客户访问的你网站的时候,dns会根据客户访问解析客户地址位置ip,反馈给调度模块就近分配)
调度模块:(根据客户ip的物理地址信息,自动分配就近的镜像服务器或者缓存服务器,这里调度分配方式具体根据规则有就近分配、根据来路ip依次抢占分配、根据调度模块识别的并发数来分配、根据调度模块队列请求数来分配、根据调度模块识别的应用优先级来分配。总之这个功能有点像路由器的流量控制,路由器的qos有针对数据包的、针对ip的、针对整个网断的、针对协议的、针对应用的。做过网络工程师的同学应该很好理解这个环节。这个模块还有负责单点故障转移的功能,遇到有问题的节点直接剔除集群,直到运维恢复正常后重新加入集群中)
缓存模块:(在并发量大的情况下,命中客户访问的请求,将镜像服务器的内容缓存到内存中,再次加快用户的访问速度。这里的缓存是实时刷新的。)
其他模块:(比方bgp模块,waf模块、ids模块、av模块、图像识别模块、视频识别模块)
流程中cdn的关键就是在于镜像和缓存,这两个模块的服务器宽带肯定是比集中式单点访问要快,因为用户是最短路径选择就近访问,这个也是分布式应用的优势,可以降低单点故障。
在日常生产环境中,这个里面有一个问题就是,很多小薇企业的站长只是单纯的只是域名上了cdn,其实你服务器出问题也会挂掉的,所以cdn包含镜像模块的情况下,应用就不会那么容易被攻击后挂掉了。选择好的cdn产品或者自研开发cdn产品,镜像服务器集群肯定是要考虑的。
0x3调研
Google搜索结果来看,常见的软件有squid,vanish,apache traffic server(ATS),nginx等,从目前使用的趋势来看Apache Traffic Server占主流,也是未来的趋势。
有一些文章提到国内互联网公司和CDN厂商目前使用的方案。
- 网宿,目前主要是ATS,按照网宿的规模应该是有能力进行二次开发。
- 蓝汛,早期是squid,当其余厂商拥抱ATS时,由于技术包袱未及时投入ATS,但目前也在使用ATS
- 小米,京东等主要使用ATS
- 腾讯,搜到一片腾讯员工的博客,里面提到正在使用ATS,因此猜测腾讯也有可能使用ATS,加上ATS是C++语言,符合腾讯C++技术栈
- 百度, nginx + 自研缓存
- 阿里,tengine + 自研swift,早起使用ATS,但由于某些原因放弃ATS使用自研,不过自研可能是C开发,应该是参考哪款开源软件,比如文件系统借鉴的是squid的文件系统,网上有阿里云CDN老大shudu的PPT,由于未开源,预计是代码重合度比较高。
- 又拍云,之前使用ATS,最新的消息是自研BearCache,应该不是全量部署,从文章来看猜测是优化了网络框架和热重启架构,应该也是参考ATS等。
- 新浪, nginx + ncache,需要第三方模块并且插件化开发,性能损失比较大
- 美丽说, Jaguar,GO语言开发,前期使用ATS,应该是ATS的go语言简化版。
0x4 总结
ATS是主流,但是ATS是C++语言开发,二次开发技术难度高,对网络协议要有很深的基础,所以一些厂商转向自研,这篇文章也有助于即将从事CDN缓存开发的学习方向,就是好好研究ATS的源码。