搭建 CDN

news/2024/7/23 8:51:13 标签: cdn, cloudflare, network, isp, squid
isplay: none;">

标题

  • 1. 搭建 CDN
    • 1.1. 什么是 CDN
    • 1.2. 使用 CDN 有 3 个好处
    • 1.3. 市场上的 CDN
    • 1.4. 自己搭建 CDN

1. 搭建 CDN

1.1. 什么是 CDN

CDN 的全称是 Content Delivery Network, 即内容分发网络。

其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节, 使内容传输的更快、更稳定。

1.2. 使用 CDN 有 3 个好处

  1. 优化跨 ISP 网络访问速度, 在国内大联通和大电信之间是世界上最远的距离, 在国外, 中国和其他地区很平行, 用 cdn 可以优化全球响应速度
  2. 节约流量成本, CDN 机房都一般都放在带宽便宜的小城市, 带宽成本大概是 BGP 机房的 1/3
  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.

  1. 对于大规模网站的 CDN, 存储共享是个强需求。为了消除单点, 不可能只使用一台 CDN 服务器, 如果只是简单做负载均衡, 单台 CDN server 上需要存储全部数据, 存储利用率太低了。
  • squid 支持几个实例并联, 实际使用的人不多;
  • varnish 只能用单实例;
  • nginx+memcache 天然的分布式存储;

当然, 采用 squid/varnish 也有解决办法: 需要在它们前面部署一个支持 url hash 的负载均衡设备 (硬件, 软件均可, 比如说 haproxy)

  1. 内存存储的代价

如果 CDN 把缓存放在内存当中, 固然性能会有提升, 但是当服务遭遇故障重启之后, 全部数据都会丢失需要重建, 这个时候会给后端应用服务器带来很大的短时压力服务需要较长的时间才能完全恢复.

而实际运行当中, 由于各种原因, CDN 服务重启的概率相当高.

  1. 一个很悲剧的事实

对动态网页使用 CDN, 无论 squid 还是 varnish 都不能直接用, 都需定制代码。
例如 varnish 会判断 response 的 header, 如果发现里面有 set-cookie 项, 它就认为这个页面不应该被缓存。对于规模庞大 / OOP 封装严密的网站, 普通程序员根本意识不到调用哪一个 fucntion 会输出 set-cookie, 这个会导致 CDN 命中率急剧降低。但你也无力去对每行代码做 code review, 没有办法, 只能去修改 varnish 代码了, 这又引入一个新的维护成本. Squid 也有这个问题

  1. purge 效率

purge 就是 CDN 删除缓存项的接口, 国内的 UGC 网站, 因为严厉的内容检查制度和泛滥的垃圾广告, 删帖子删图片特别频繁, 某些网站可能高达 40%(发 100 个贴, 有 40 个帖子可能被删除或者修改), 所以对 purge 的效率有要求。
squid 和 varnish 的 purge 效率都达不到国内这种强度要求, nginx+memcache purge 性能要好很多。
在当前的中国, 遇到突发事件后, 要是不及时删除指定的链接或内容, 后果可能会很严重(小到个人被炒, 大到公司被关都有可能)
某门户网站曾经发生过, 某个链接怎么也删不掉, 一慌张把 CDN 所有缓存都删了重启, 导致内网流量瞬间暴涨, 各业务线的服务器全线报警, 集体骂娘!

  1. 推荐 CDN 方案

中小型网站直接买 CDN 服务就好, 现在 CDN 已经进行按需付费的云计算模式了, 性价比是可以准确计算的;

  • 外地部署单点, 推荐用 squid;
  • 准备在公司内部实施私有云战略, 推荐 nginx+memcache;
  • 不太建议使用 varnish。

http://www.niftyadmin.cn/n/1620535.html

相关文章

jzoj5984. 【北大2019冬令营模拟2019.1.1】仙人掌 (分块)

题面 题解 数据结构做傻了.jpg 考虑每一个节点,它的儿子的取值最多只有\(O(\sqrt {m})\)种,那么可以用一个双向链表维护儿子的所有取值以及该取值的个数,那么对儿子节点修改一个值就是\(O(\sqrt{m})\),整体修改可以通过在自己身上…

踩坑系列《二》NewProxyResultSet.isClosed()Z is abstract 报错踩坑

在运行测试类的时候莫名其妙的报了个 NewProxyResultSet.isClosed()Z is abstract 这个错误,之前出现过这个错误,以为是版本出现了问题 就将版本 0.9.1.2 改成大多数人用的 0.9.5.2 版本,发现还是报错。后来亲自去 Maven 存储库专门搜了下 c3…

踩坑系列《三》 java -version 报错出现Error occurred during initialization of VM java/lang/NoClassDefFoundError:

之前导入一个项目,因为该项目Spring版本过低,只能适用于1.7版本,装了jdk1.7版本。安装配置好后,打开cmd窗口,执行 java -version 指令发现没像正常一样显示版本信息,而是报了个 Error occurred during init…

解决RecyclerView刷新时闪烁的问题,如何局部刷新列表项的某几个控件

2019独角兽企业重金招聘Python工程师标准>>> 场景:当RecyclerView列表中的项需要高频率的刷新时,由于itemview的重新绘制和设置导致item出现闪烁。 而实际item上高频率变更的仅仅是一两个控件。 解决方案: 数据更新时,…

Scripts Language Codes locate 编码

这里写目录标题Scripts Language Codes locate 编码Scripts Language Codes locate 编码 This page will display the language codes for scripts that can be installed in various Languages: Concrete5 LanguageLanguage CodeEnglishen_USChinese(Simplified)zh_CNChine…

踩坑系列《四》a标签的href属性拼接问题

如上所示,无法直接在 html里面的 a 标签的href属性传递参数时,只需要在 JS 中获取对应 a 标签的id,再通过 attr 方法抓到 href,进行字符串拼接即可

快速入门(十四)

快速入门 本章主要目标完成Spring Boot基础项目的构建,并且实现一个简单的Http请求处理,通过这个例子对Spring Boot有一个初步的了解,并体验其结构简单、开发快速的特性。 系统要求: Java 7及以上Spring Framework 4.1.5及以上本文…

踩坑系列《五》 Incorrect datetime value: 时间添加失败原因

在进行单元测试中通过 new Date() 方式添加时间时,报了 Data truncation: Incorrect datetime value:这样的错误(我数据库表的时间类型是 datetime) 这种情况看看你的SQL语句有没有成功地对应上 像我这种就是顺序弄错了,因为类型…