分布式系统缓存设计


缓存设计浅析 朋春 pengchun@taobao.com 分布式系统 为什么要做这个分享? glider 前端产品 ⼀级缓存 二级缓存 缓存系统( 2011.6) glider 前端产品 ⼀级缓存 二级缓存 URL请求, nocache? nocache? nocache? 缓存系统( 2011.6) glider 前端产品 ⼀级缓存 data 二级缓存 URL请求, nocache? nocache? nocache? 缓存系统( 2011.6) glider 前端产品 ⼀级缓存 data 二级缓存 URL请求, nocache? nocache? nocache? min (ttl) ttl, http header etag, http header 缓存系统( 2011.6) 时代变了 • 容灾考虑,缓存多实例,多写单读 • 实时的数据更新 • 更多更复杂的底层系统 • 数据⼀致性问题 • 缓存雪崩问题 • 缓存穿透问题 缓存系统的三个问题 • 缓存与底层数据的⼀致性 • 有继承关系的缓存之间的⼀致性 • 多个缓存副本之间的⼀致性 数据⼀致性 • “预估 ”失效时间 • 单调递增的数据版本号 • 提供清理接口 缓存数据的淘汰 • 只淘汰该淘汰的 精细化管理 • 根据 tag进行缓存管理 • 时间戳做数据版本号 • 提供清理 API • 版本号共享协作 itier的设计(通用) var me = Cache.create(...); me.set(key, value, ttl, tags); me.get(key); me.tagrm(tag, offset, flush); 缓存的数据结构 var data = { ‘i’:now, /** 数据写入时间戳 */ ‘e’:now + ttl,/** 预期过期时间 */ ‘k’:key, /** 原始 key */ ‘v’:value, /** 原始值 */ ‘t’:tags /** tag列表 */ }; tagrm (cleanByTag) /** * @定时同步 */ var __taginfo = {}; tagrm (tag, offset, flush) { __taginfo[tag] = now() + offset; // flush to zookeepr or mysql ... } • __global__ • 数据来源 driver名字 • SQL中的表名 itier中的 tag定义 • 缓存的 tag信息⼀路继承,取并集 • 缓存的 ttl信息⼀路继承,取最小值 • 秒量级保证⼀致性 ⼀致性目标 但是, 简单的事情从来不简单 case1:网络延迟 get : a = 1 update : a = 2 tagrm: t1 set cache : a = 1 底层数据 a=1 a=2 case2:多机时差 • tagrm在机器 1上调用,取机器 1上的时间 • 写缓存在机器 2上,取机器 2上的时间 • 机器 1和机器 2在 ms级别时间不同步 case3:异步复制 get : a = 1 update : a = 2a=1 实例 1 a=2 a=1 实例 2 异步复制 有延迟 最终⼀致性 tagrm (cleanByTag) /** * @定时同步 */ var __taginfo = {}; tagrm (tag, offset, flush) { __taginfo[tag] = now() + offset; // flush to zookeepr or mysql ... } • 缓存永远是锦上添花的部分 • 保证不了⼀致性就拉到吧 • 不要为了⼀致性加锁,得不偿失 • 不要过度依赖缓存 • 关注你的缓存命中率( tag粒度) ⼀些基本理念 代码 • https://github.com/aleafs/node-shark/blob/ master/lib/cache.js • https://github.com/aleafs/node-shark/blob/ master/test/unit/CacheTest.js
还剩23页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

sunjavac

贡献于2014-06-10

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf