网站架构之缓存应用(4)缓存监控管理

    对于web系统中增加缓存服务,使用起来还是挺方便的,目前可采用的方案比较多,有微软的企业库,memcached等等。但如果需要很好的对项目中的缓存进行监控管理,也不是一件特别容易的事情,例如:监控缓存服务器上都有哪些项目使用了缓存,具体都有多少个key,大小,单个key的命中率以及过期时间等信息。有了这些信息,就非常容易排查内存为什么快用完的问题,如果再提供手动过期缓存的服务,就更好了,有的时候由于数据出错,需要紧急让缓存失效,此种办法影响最小。
   
    这篇我来总结了针对memcached的缓存管理。
   
    其实memcached本身也提供了一些缓存统计信息,例如:当前总共的缓存数量,使用的内存量,总获取次数,总的写入次数,总的命中次数等等,但这种统计信息粒度太大:

    1:无法具体到单个key,如果我们想针对某一个key统计它的命中率情况,就不好办了。

    2:无法分析系统中都有哪些项目使用了key,哪个项目占用的key多,内存多。

    3:无法实现手工过期,这种需求某些特殊情况下也是很有帮助的。

 

    既然memcached本身不提供,我这里采用了一种变通的方式来记录我们特定的信息。
   
    首先我们引进一个概念:分区,这个分区可以理解成电脑上的硬盘分区,用户可以把不同的文件放在不同的分区上,这样在管理上也容易些,同样分区底下有子分区,就像电脑上的文件一样,子分区下面就是具体的key了,对于我们的cache后台管理,可以这样理解,一个项目可以分配为一个分区,按项目功能模块可以分为不同的子分区,子分区下来分散着N多key。

                                               
    
    实现方案:我们可以对每个key的访问记录下它的一些信息,例如:大小,所属分区名,过期时间,访问命中率,然后把这些信息在每个memcached 实例上创建一个特殊key,用于存储key的访问信息。
   
    注意点:

       1:由于记录访问信息都需要更新特殊key,如果过于频繁,会影响正常的cache性能,所以可以考虑形成一个内存队列,当数量达到多少后(如果key使用频率不高,还可以设定时间,当过了这个时间,即使数量不够也进行更新),统一更新特殊key内容。
       2:由于memcached有单个key大小限制,所以对于这种统计信息key,不能过大,记录key访问信息时,尽量以文本形式存储,这样能保证最小。

       3:每个实例中对应一个用于存储key访问信息的key,这样可以统计更多的key。

           
    监控视图:通过上面的努力,我们可以形成三个视图:
    第一:memcached 实例视图,以某个具体cache实例为单位,呈现memcached服务本身所提供的统计信息,还包含此实例中包含了多少个分区,即实例上包含了多少个项目使用的缓存。
    第二:分区视图,根据分区名称,集合所有节点的数据,最终汇总出统计数据,例如可以统计酒店项目总共使用了多少个key等,这对分析key的分布情况比较有帮助。
    第三:key视图,呈现具体key的访问信息,以及手工过期功能。

 

    总结:上面的方案虽然能实现需求,但在实际生产环境中,尽量不要打开这种监控功能,需要的时候再打开,尽量让cache的效率最高。

 

 

 

posted on 2011-03-17 17:58  min.jiang  阅读(4998)  评论(3编辑  收藏  举报