分布式系统缓存设计

24
缓存设计浅析 朋春 [email protected] 分布式系统

Upload: aleafs

Post on 06-Jul-2015

1.382 views

Category:

Documents


1 download

DESCRIPTION

阐述分布式系统缓存的一致性问题

TRANSCRIPT

Page 1: 分布式系统缓存设计

缓存设计浅析朋春

[email protected]

分布式系统

Page 2: 分布式系统缓存设计

为什么要做这个分享?

Page 3: 分布式系统缓存设计

glider

前端产品

⼀一级缓存

二级缓存

缓存系统(2011.6)

Page 4: 分布式系统缓存设计

glider

前端产品

⼀一级缓存

二级缓存

URL请求,nocache?

nocache?

nocache?

缓存系统(2011.6)

Page 5: 分布式系统缓存设计

glider

前端产品

⼀一级缓存

data

二级缓存

URL请求,nocache?

nocache?

nocache?

缓存系统(2011.6)

Page 6: 分布式系统缓存设计

glider

前端产品

⼀一级缓存

data

二级缓存

URL请求,nocache?

nocache?

nocache? min (ttl)

ttl, http header

etag, http header

缓存系统(2011.6)

Page 7: 分布式系统缓存设计

时代变了

• 容灾考虑,缓存多实例,多写单读

• 实时的数据更新

• 更多更复杂的底层系统

Page 8: 分布式系统缓存设计

• 数据⼀一致性问题

• 缓存雪崩问题

• 缓存穿透问题

缓存系统的三个问题

Page 9: 分布式系统缓存设计

• 缓存与底层数据的⼀一致性

• 有继承关系的缓存之间的⼀一致性

• 多个缓存副本之间的⼀一致性

数据⼀一致性

Page 10: 分布式系统缓存设计

• “预估”失效时间

• 单调递增的数据版本号

• 提供清理接口

缓存数据的淘汰

Page 11: 分布式系统缓存设计

• 只淘汰该淘汰的

精细化管理

Page 12: 分布式系统缓存设计

• 根据tag进行缓存管理

• 时间戳做数据版本号

• 提供清理API

• 版本号共享协作

itier的设计(通用)

Page 13: 分布式系统缓存设计

var me = Cache.create(...);

me.set(key, value, ttl, tags);

me.get(key);

me.tagrm(tag, offset, flush);

Page 14: 分布式系统缓存设计

缓存的数据结构var data = {

‘i’:now, /** 数据写入时间戳 */

‘e’:now + ttl,/** 预期过期时间 */

‘k’:key, /** 原始key */

‘v’:value, /** 原始值 */

‘t’:tags /** tag列表 */

};

Page 15: 分布式系统缓存设计

tagrm (cleanByTag)/** * @定时同步 */var __taginfo = {};

tagrm (tag, offset, flush) {

__taginfo[tag] = now() + offset;

// flush to zookeepr or mysql ...

}

Page 16: 分布式系统缓存设计

• __global__

• 数据来源driver名字

• SQL中的表名

itier中的tag定义

Page 17: 分布式系统缓存设计

• 缓存的tag信息⼀一路继承,取并集

• 缓存的ttl信息⼀一路继承,取最小值

• 秒量级保证⼀一致性

⼀一致性目标

Page 18: 分布式系统缓存设计

但是,

简单的事情从来不简单

Page 19: 分布式系统缓存设计

case1:网络延迟

get : a = 1

update : a = 2

tagrm: t1

set cache : a = 1

底层数据

a=1

a=2

Page 20: 分布式系统缓存设计

case2:多机时差

• tagrm在机器1上调用,取机器1上的时间

• 写缓存在机器2上,取机器2上的时间

• 机器1和机器2在ms级别时间不同步

Page 21: 分布式系统缓存设计

case3:异步复制

get : a = 1

update : a = 2a=1

实例1

a=2

a=1

实例2

异步复制有延迟最终⼀一致性

Page 22: 分布式系统缓存设计

tagrm (cleanByTag)/** * @定时同步 */var __taginfo = {};

tagrm (tag, offset, flush) {

__taginfo[tag] = now() + offset;

// flush to zookeepr or mysql ...

}

Page 23: 分布式系统缓存设计

• 缓存永远是锦上添花的部分

• 保证不了⼀一致性就拉到吧

• 不要为了⼀一致性加锁,得不偿失

• 不要过度依赖缓存

• 关注你的缓存命中率(tag粒度)

⼀一些基本理念