那些年,我使用过的轮子(二)--memcached+couchbased

背景

    memcached 出现的比较早了,支持的数据类型比较简单,而且没有持久化,在绝大多数的应用场景中都作为缓存来使用,加上根据一致性Hash扩展成分布式的缓存集群也是互联网中常用的方案设计。couchbase 文档较少,国内用的公司应该不多, 它作为一种NoSQL的数据库,支持memcached协议,支持JSON的文档格式和索引,加上其天生的Auto-Sharding和P2P特性,在分布式领域中有着更为灵活的应用场景,之所以把这两个放一块说,主要是工作中的用途差不多,它们之间的差别还是很大的。

业务场景

  动态网页缓存

    网页缓存是提升网站访问性能常用的手段之一,特别是动态网页缓存;比如网页的内容和传入的参数有关系,网页的内容经常会发生变化等,在这种场景下,可以提升网站的访问体验,特别是在高峰期间的时候,可以分散后端服务器的压力。常用的方案是前端的nginx服务器利用memcached_module进行扩展,提取页面访问请求的URI,参数等,组成memcached_key,然后去memcached去获取,如果获取成功,直接将渲染好的网页内容或者数据返回给前端,如果cache里面没有,会重定向到后端服务器进行处理。每台nginx会指向local或者远程的一台memcached实例作为存储服务器。至于cache miss之后,可以在Filter层面统一对返回的数据进行拦截处理和写入到memcached。
    从前端nginx配置memcached,到cache miss之后后端服务的数据再生产,到数据生产之后回写memcached流程较长,也相对比较复杂,容易踩到比较多的坑,在每一步处理都有较多的细节需要处理和测试,不然达不到设计或者预期的效果;比如memcached的监控, nginx到memcached的连接回收,cache miss之后后端服务的操作流程,写入数据的大小和是否压缩等

  通用数据缓存

    目前公司的基础缓存是基于couchbase搭建的,文章里面关于couchbase的介绍比较齐全,就不重复了。couchbase以集群方式运行,分为持久化和非持久化两种,按应用分vBucket,持久化的方式性能较低,用的不多,这里主要说非持久化。 应用的数据类型分两种,k-v类型和json类型,k-v和memcached类似,可以兼容memcached相关的操作,json格式的话,类似mongo了,支持按照字段的索引,修改和查找。
    由于是基础缓存,封装的couchbase的dao较为完善,貌似没有批量操作的接口支持,以及对原子操作的支持也不太好,不过扩容和监控相对方便,能省不少事。

一些教训

    1. memcached 相对来说比较脆弱,supervisor之类的服务监控和拉起是非常有必要的,在cache miss的时候,后端服务对memcached的读写需要再控制一下,之前服务高峰期, memcached经常出现实例进程没有或者不响应,在定位到问题前,保证它能快速响应很重要。
    2. memcached和nginx的连接回收和超时也要注意观察下,一不小心,系统的time wait就上来了。
    3. memcached和couchbase的key, value会有限制,根据数据大小和应用场景选择是否压缩。
    4. couchbase的client会维护一个消费者和生产者的队列,队列内部积累的请求过多会抛异常,和请求数和批量取的key数量有关系, 需要通过上层限流来避免队列溢出
    5. 需要提前考虑缓存批量丢失(节点损坏)带来的影响以及预案,墨菲定律牢记心头。


你可能感兴趣的:(工作,NoSQL)