作者:失心人2702939300 | 来源:互联网 | 2017-11-06 10:13
作者Ayou:http:sudone.com架构图示:1、合并穿透当前端一级缓存采用了两台以上的squid后,同一个访问量较大的链接,假设其三分钟更新一次,每台squid就会每三分钟向后台发送一个请求更新这个链接,那么很显然两台squid就会每三分钟发送两个请求,n台squ
作者Ayou:http://sudone.com
架构图示:
1、合并穿透
当前端一级缓存采用了两台以上的squid后,同一个访问量较大的链接,假设其三分钟更新一次,每台squid就会每三分钟向后台发送一个请求更新这个链接,那么很显然两台squid就会每三分钟发送两个请求,n台squid就是n个。因此在负荷很重的系统中,在不停增加squid的同时,后台服务器的压力也会不停增长。这时使用二级缓存就可以将数台squid的穿透再做一层合并,假设是一台机做二级缓存,那么前端n台squid对同一链接的n次穿透,在经过这级squid后,就变成了1个请求发向后台,对后台服务器来说,压力就可以保持稳定。
2、保护
在出现某些异常情况时,前端缓存可能会全部失效,譬如前端缓存由于重启或其它原因清理了数据,squid这样的软件碰着bug时也会导致缓存失效。这时请求就会集成一股很大的冲击波,后台服务器扛不住的话一下就被击垮了。架上二级缓存后,二级缓存至少拥有相当于前端一台缓存的负荷能力,因此前端失效一台缓存后二级缓存是肯定能稳当地接下工作的,日常使用中因为前端缓存并不会跑在100%性能下,因此就算两三台前端缓存的量全穿过来二级缓存也能顶下,于此同时后台服务器的访问量仍然是保持稳定的。
3、可变
二级缓存在机器配置和服务器软件上未必和一级缓存是一个样的,甚至并不是一台机而是一个架构,这样二级缓存就能起到更多的作用。举几个例子:
1)nginx->proxy_store
nginx的proxy_store可以为静态地址提供高性能的缓存,而且还防住了类似xx.html?abc这种糟糕链接的穿透,在某网站的新闻和跟帖的架构中大量采用此种搭配。
2)nginx->squid
nginx的proxy_store虽然有较高的性能,但它只能缓存静态地址或rewrite后的地址,不能缓存带?和参数的那种链接,因此用nginx搭配squid也是一种方案,相比于proxy_cache来说,squid更为成熟,而且可以很方便地扩容。在动态地址较多的场合可以考虑此种搭配。
3)图片架构
图片服务是最容易出现容灾问题的地方,url_hash固然能解决容灾,但是它会在用户和cache之间多放一层纯代理,在超巨型系统中,多那么一层纯代理会有很大可能惹出麻烦来,而将这层纯代理放在架构的另一个地方——二级缓存,这个方案会更易于为人所接受。这时,前端缓存主要就负责处理并发,只用内存来存储,容灾就算达到很极端的情形,一个地址只缓存了几秒就被强制剔除,也可以拦住很多的请求了;而二级缓存就主要负责处理穿透,通过url_hash和很多硬盘来提供巨大的存储容量和IO性能,将请求全部挡在这一层;后台就轻松地保护好数据即可。