CDN实现方案如何选择: squid Varnish Nginx_dengyiyu5280的博客-程序员秘密

技术标签: 运维  后端  

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

使用CDN有3个好处

优化跨ISP网络访问速度,在国内大联通和大电信之间是世界上最远的距离,在国外,中国和其他地区很平行,用cdn可以优化全球响应速度

节约流量成本,CDN机房都一般都放在带宽便宜的小城市,带宽成本大概是BGP机房的1/3

快速提升性能,对于结构复杂的系统,部署CDN可以在不改动代码段情况提升网站整体性能,立竿见影

市面上有很多CDN供应商,比较著名有

Akamai (全球最大)

chinacache

webluker

cloudflare

chinacache

如果需要自己搭建CDN系统,有3种主流方案可以选择

squid

varnish

Nginx+memcache

软件 存储模式 性能 配置复杂度 purge效率 共享存储
squid 硬盘 较高 简单 可以并联,但是配置复杂
varnish 硬盘/内存 比较简单 不能
nginx 内存 需要编程 可以,支持一致性存储

典型用户 存储共享

对于大规模网站的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已经进按需付费的云计算模式了,性价比是可以准确计算的

外地部署单点,推荐用squid

准备在公司内部实施私有云战略,推荐nginx+memcache

不建议使用varnish

转载于:https://www.cnblogs.com/atwanli/articles/5162589.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dengyiyu5280/article/details/102352044

智能推荐

如何判断一个.lib文件是静态库还是动态库的到入库_jiayou可不可以不QAQ的博客-程序员秘密

使用VS自带的一个工具 -lib.exe。打开目录“C:\Program Files\Microsoft Visual Studio 10.0\VC\bin”就会看到这个工具(具体存在位置根据vs安装路径)运行 lib /list hello.lib如果输出: hello.obj,则是静态库如果输出: hello.dll,则是动态库的导入库。找到以.lib结尾的所有文件并保存到1...

汇编各个寄存器详解_如何确定汇编代码中寄存器和变量的对应关系_bajinbajin的博客-程序员秘密

ebp和esp是32位的SP,BPesp是堆栈指针ebp是基址指针ESP与SP的关系就象AX与AL,AH的关系.32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(E

Excel VBA 教程_weixin_34049032的博客-程序员秘密

https://www.w3cschool.cn/excelvba/Excel VBA 编程教程https://www.yiibai.com/vba VBA教程http://www.accessoft.com/article-show.asp?id=16502 关于VBA的0、""(空字符串)、Null、Empty、与 Nothing 的区别转载于:http...

npm 下载的包输入命令提示不是内部命令解决方案_patch不是内部_qq_35381464的博客-程序员秘密

如果npm 下载的包输入命令提示不是内部命令,则根据cmd中提示的安装路径找到npm的路径添加到系统变量中

java使用Jsch来获取sftp上指定文件名的文件_jsch获取文件列表_DoranHex的博客-程序员秘密

查看jsch包中列出文件名的方法通过jsch获取ChannelSftp。ChannelSftp中有相应的列出,删除等一系列文件操作。找出其中的列出文件方法。包含l

uiautomatorviewer出现Unable to connect to adb_whackw的博客-程序员秘密

启动测试工具uiautomatorviewer,点击第二个按钮Device Screenshot时,出现Unable to connect to adb. Check if adb is installed correctly错误: 解决办法如下:打开uiautomatorviewer.bat,找到uiautomatorviewer.bat文件最后一行:call "%j

随便推点

项目总结(四)----------Python实现Windows和Linux之间互相传输文件(文件夹)_雪域高原1的博客-程序员秘密

项目中需要从Windows系统传输ISO文件到Linux测试系统,然后再Linux测试系统里安装这个ISO文件。所以就需要实现如何把文件从Windows系统传输到Linux系统中。在项目中使用了pscp.exe这个工具,只要按照pscp.exe的使用说明操作即可。只要进入pscp.exe的安装位置,然后输入pscp即可查看pscp的使用说明。下面是我机器上的:使

Kali Linux Web渗透测试手册(第二版) - 1.1 - Firefox浏览器下安装一些常用的插件_weixin_30300225的博客-程序员秘密

一.配置KALI Linux和渗透测试环境在这一章,我们将覆盖以下内容:l 在Windows和Linux上安装VirtualBoxl 创建一个Kali Linux虚拟机l 更新和升级Kali Linuxl 为渗透测试配置web浏览器(即在Firefox浏览器下安装一些常用的插件)l 创建一个属于自己的靶机l 配置网络使虚拟机正常通信l 了解靶...

Extjs4之TreePanel、TreeGrid_ext 获取treepanel每一行view_diweikang的博客-程序员秘密

Tree介绍树形结构,是程序开发,不可缺少的组件之一。ExtJs中的树,功能强大美观实用。功能齐全,拖拉,排序,异步加载等等。在ExtJs4中Tree和Grid具有相同的父类,因此Grid具有的特性和插件在Tree上也能用。简单的Tree  代码: Ext.onReady(function () {

live555 类图结构分析_Jons伯恩特的博客-程序员秘密

liveMedia的类关系图如下,理解它对于学习live555有很大的帮助,下面的类图来自:http://www.live555.com/liveMedia/doxygen/html/hierarchy.html_groupsockPriv_H263INFO_MaxBitrate_CTX_TablesAC3FrameParamsAddressPortLookupTableAddressPo

AndroidStudio自定义注释_戎码人生的博客-程序员秘密

设置类创建时自动生成头部注释比如每次创建一个类自动在头部生成一个这样的头部,作为一个类的说明信息设置方法点击设置—>Editor–>File and code Templates –>Includes—>File Header 代码:其中时间是自动获取的/** * Description: * Data:${DATE}-${TIME} * Blog:www.qiuchengjia.cn

getResource和getResources的区别_Emptor的博客-程序员秘密

getResource与getResources 都是【加载当前类加载器以及父类加载器所在路径的资源文件】/** * 1.getResource * 加载当前类加载器以及父类加载器所在路径的资源文件 * 将遇到的第一个资源文件直接返回!!! * 比如当前工程类路径有conf/demo.properties文件,引入的第三方jar包也有这个文件 * 返回的是当前工程下的这个资源文件**/ URL url = loader.getResource("conf/demo.properties")

推荐文章

热门文章

相关标签