1. 搭建 CDN
1.1. 什么是 CDN
CDN 的全称是 Content Delivery Network, 即内容分发网络。
其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节, 使内容传输的更快、更稳定。
1.2. 使用 CDN 有 3 个好处
- 优化跨 ISP 网络访问速度, 在国内大联通和大电信之间是世界上最远的距离, 在国外, 中国和其他地区很平行, 用 cdn 可以优化全球响应速度
- 节约流量成本, CDN 机房都一般都放在带宽便宜的小城市, 带宽成本大概是 BGP 机房的 1/3
- 快速提升性能, 对于结构复杂的系统, 部署 CDN 可以在不改动代码段情况提升网站整体性能, 立竿见影
1.3. 市场上的 CDN
市面上有很多 CDN 供应商, 比较着名有:
- Akamai (全球最大)
- webluker
- cloudflare
- chinacache(蓝汛)
- 网宿 CDN
- 帝联 CDN
- 阿里 CDN(web cache server 叫 swift)
- 腾讯 CDN
- 七牛云融合 CDN
1.4. 自己搭建 CDN
如果需要自己搭建 CDN 系统, 有 3 种主流方案可以选择: squid、varnish、Nginx+memcache.
- 对于大规模网站的 CDN, 存储共享是个强需求。为了消除单点, 不可能只使用一台 CDN 服务器, 如果只是简单做负载均衡, 单台 CDN server 上需要存储全部数据, 存储利用率太低了。
- squid 支持几个实例并联, 实际使用的人不多;
- varnish 只能用单实例;
- nginx+memcache 天然的分布式存储;
当然, 采用 squid/varnish 也有解决办法: 需要在它们前面部署一个支持 url hash 的负载均衡设备 (硬件, 软件均可, 比如说 haproxy)
- 内存存储的代价
如果 CDN 把缓存放在内存当中, 固然性能会有提升, 但是当服务遭遇故障重启之后, 全部数据都会丢失需要重建, 这个时候会给后端应用服务器带来很大的短时压力服务需要较长的时间才能完全恢复.
而实际运行当中, 由于各种原因, CDN 服务重启的概率相当高.
- 一个很悲剧的事实
对动态网页使用 CDN, 无论 squid 还是 varnish 都不能直接用, 都需定制代码。
例如 varnish 会判断 response 的 header, 如果发现里面有 set-cookie 项, 它就认为这个页面不应该被缓存。对于规模庞大 / OOP 封装严密的网站, 普通程序员根本意识不到调用哪一个 fucntion 会输出 set-cookie, 这个会导致 CDN 命中率急剧降低。但你也无力去对每行代码做 code review, 没有办法, 只能去修改 varnish 代码了, 这又引入一个新的维护成本. Squid 也有这个问题
- purge 效率
purge 就是 CDN 删除缓存项的接口, 国内的 UGC 网站, 因为严厉的内容检查制度和泛滥的垃圾广告, 删帖子删图片特别频繁, 某些网站可能高达 40%(发 100 个贴, 有 40 个帖子可能被删除或者修改), 所以对 purge 的效率有要求。
squid 和 varnish 的 purge 效率都达不到国内这种强度要求, nginx+memcache purge 性能要好很多。
在当前的中国, 遇到突发事件后, 要是不及时删除指定的链接或内容, 后果可能会很严重(小到个人被炒, 大到公司被关都有可能)
某门户网站曾经发生过, 某个链接怎么也删不掉, 一慌张把 CDN 所有缓存都删了重启, 导致内网流量瞬间暴涨, 各业务线的服务器全线报警, 集体骂娘!
- 推荐 CDN 方案
中小型网站直接买 CDN 服务就好, 现在 CDN 已经进行按需付费的云计算模式了, 性价比是可以准确计算的;
- 外地部署单点, 推荐用 squid;
- 准备在公司内部实施私有云战略, 推荐 nginx+memcache;
- 不太建议使用 varnish。