缓存
在计算机系统中,缓存有很多种。比如CPU内部的一级缓存、二级缓存。文件系统的缓存,磁盘的缓存。在大型网站的后台部署过程中,也灵活运用了各级缓存。主要有客户端的浏览器缓存,服务器端的web server自身缓存,代理缓存,分布式缓存,数据库自身的缓存等。
缓存分类及优势
一、本地缓存 和应用服务争夺内存 速度快
二、远程缓存 理论上内存不受限制(分布式缓存)速度较本地慢
1、Squid功能全而大,适合于各种静态的文件缓存,国内的top2CDN厂商是基于拿squid做的商业改造,但受限于仅支持单进程(虽然squid3.2也开始支持SMP了:http://wiki.squid-cache.org/Features/SmpScale),因此一般会在前端挂一个HAProxy或nginx做负载均衡跑多个实例。
2、Varnish由于是内存cache,所以对小文件如css,js,小图片的支持很好,sina就是用的varnish,后端的持久化缓存可能采用的是squid或ats
3、nginx的代理功能只是它的一个模块功能,功能相对前两者目前还完全无法替代,但未来充满期待。
4、还有apache trafficserver,专业的代理,相对squid,它支持多cpu,国内阿里,youku,sina等厂商都在用,感兴趣可以去Apache Traffic Server ATS
三、缓存面临的问题
一致性和实时性
一个很直观的场景就是,数据库中的数据状态已经改变,但是用户在页面上看到的仍然是缓存的旧值。
一般来说,缓存数据本身都是保持在内存中的,例如淘宝内部大量使用tair系统(已开源)。tair拥有若干服务器,这些服务器内存都很大,可以存放大量数据。当然,考虑到内存的易失性,tair一般来说不能存放重要的数据。
Tair:http://tair.taobao.org/
四、什么样的数据可以放缓存
1、不需要实时更新但是又极其消耗数据库的数据。比如统计数据,排行榜。
2、js,css,image等文件
3、使用频率很高的一些程序对象。
五、缓存灾难
故障现象:没有新应用发布,但是数据库服务器突然Load飙升,并很快失去响应。DBA将数据库访问切换到备机,Load也很快飙升,并失去响应。最终引发网站全部瘫痪。
原因分析:缓存服务器在网站服务器集群中的地位一直比较低,服务器配置和管理级别都比其他服务器要低一些。人们都认为缓存是改善性能的手段,丢失一些缓存也没有什么问题,有时候关闭一两台缓存服务器也确实对应用没有明显影响,所以长期疏于管理。结果这次一个缺乏经验的工程师关闭了缓存服务器集群中全部的十几台Memcached服务器,导致了网站全部瘫痪的重大事故。
经验:当缓存已经不仅仅是改善性能,而是成为网站架构不可或缺的一部分时,对缓存的管理就需要提高到和其他服务器一样的级别。