新浪微博 洪小军 	

@XiaoJunHong @微博平台架构	

大型系统的缓存标准化之路᠋᠌᠍᠎᠋᠌᠍᠎
—从主从多级重client到一体化	

大型系统的缓存标准化之路	

•  大型系统面临的挑战
•  怎么应对每秒百万级资源调用?
•  怎么保证99.99%的可用性?
•  怎么保证核心请求响应时间在毫秒级?
大型系统的缓存标准化之路	

大型系统的缓存标准化之路	
•  讨论大纲
! 主从多级缓存
•  服务化和标准化
大型系统的缓存标准化之路	

•  系统挑战
•  每秒对资源万级请求
•  需要保证较低的响应时间
大型系统的缓存标准化之路	

•  分布式缓存
•  多节点部署
•  客户端上实现分布式
Client Master Cluster
Memcached Memcached
大型系统的缓存标准化之路	

•  系统挑战
•  服务器和网络可能会出现问题
•  后端数据库承受不了单个节点完全穿透的量
•  面临雪崩效应风险
大型系统的缓存标准化之路	

•  Master/Slave机制
•  防单点:不容许节点故障时命中率受影响
•  成本问题:可考虑同城机房互为master/slave
Client Master Cluster
Slave Cluster
大型系统的缓存标准化之路	

•  系统挑战
•  每秒对资源百万级请求
•  网络带宽、吞吐量成为瓶颈
•  存在访问量暴增可能性
大型系统的缓存标准化之路	

•  L1 Cache
•  在线线性扩容方案
•  满足业务快速发展需要
•  应对成倍访问量增加情况
Client Master Cluster
Slave Cluster
L1 Cluster
大型系统的缓存标准化之路	

•  主从多级缓存
分布式	
   Master/Slave	
   L1	
  Cache	
  
大型系统的缓存标准化之路	
•  讨论大纲
•  主从多级缓存
! 服务化和标准化
大型系统的缓存标准化之路	
•  重客户端开发模式
•  配置
•  实现
o  CacheClient client = build();
o  client.set(key, test);
o  client.get(key);
大型系统的缓存标准化之路	
•  面临的问题 – 开发层面
•  重客户端形式,主从多级缓存策略客户端实现
•  客户端存在多个版本,各业务使用不统一
•  工程师需很熟悉主从多级策略,自己把控可用性
•  曾经存在个别小业务有单点问题风险
大型系统的缓存标准化之路	
•  配置变更上线流程
容量瓶颈/
节点异常	
  
通知开发
更改配置	
  
测试/打包	
  
系统发布
上线 	
  
大型系统的缓存标准化之路	
•  面临的问题 – 运维层面
•  运维变更成本高,变更周期长
•  运维把控系统容量能力有限
•  需开发配合,完整的变更流程太长
大型系统的缓存标准化之路	
•  缓存服务化和标准化
•  Cache Service设计
•  面向服务开发
•  运维标准化
大型系统的缓存标准化之路	
•  Cache Service整体设计
大型系统的缓存标准化之路	
•  Cache Service部署结构
大型系统的缓存标准化之路	
•  协议处理逻辑
•  get:l1 – master - slave 
•  gets:master - slave
o  master失败直接返回
•  add/cas:master – others
o  master更新成功后修改命令为set,异步更新others
•  set/replace/prepend/append:all
L1 Cache
Master Cache
Slave Cache
大型系统的缓存标准化之路	
•  分布式cache怎么解决强一致性问题
•  使用cas命令?
•  分布式场景下cas会是怎么样?
•  master宕机后会出现什么状况?
•  cache service服务端 + 业务端处理 方案
大型系统的缓存标准化之路	
•  容灾策略
•  快速失败策略:节点故障调用快速返回
o  server_failure_limit
o  server_retry_timeout
大型系统的缓存标准化之路	
•  面向服务开发
•  重客户端 - 轻客户端
•  更好的多语言支持
大型系统的缓存标准化之路	
•  重客户端开发模式
•  配置
•  实现
o  CacheClient client = build();
o  client.set(key, test);
o  client.get(key);
大型系统的缓存标准化之路	
•  面向服务开发
•  配置
o  weibo:cs namespace=status-content registry=vintage” /
•  实现
o  CacheClient client = build();
o  client.set(key, aa);
o  client.get(key);
大型系统的缓存标准化之路	
•  运维标准化
•  运维对资源有直接管控能力,变更秒级生效
o  通过配置服务变更,不需依赖开发及其代码上线
•  标准化的运维流程
o  节点故障处理、扩容缩容等操作标准化
•  可以做到更自动化的运维
大型系统的缓存标准化之路	
•  提升运维管控能力
容量瓶颈/
节点异常	
  
通知开发
更改配置	
  
测试/打包	
  
系统发布
上线 	
  
容量瓶颈/
节点异常	
  
变更配置 	
  
大型系统的缓存标准化之路	
•  节点故障处理
•  替换为新的空节点,在线热缓存
•  不影响命中率
	
  
	
  
Slave	
  
node1	
   node2	
   node3	
  
	
  
	
  
Master	
  
node1	
   Crash!	
   node3	
  Client	
  
大型系统的缓存标准化之路	
•  内存容量扩容/缩容
•  添加L1 cache,在线预热,最终替换原有缓存
	
  
	
  
Slave	
  
node1	
   node2	
   node3	
  
	
  
	
  
Master	
  
node1	
   node2	
   node3	
  
Client	
  
	
  
	
  
L1(new	
  master	
  or	
  slave)	
  
node1	
   node2	
   node3	
   node4	
  
大型系统的缓存标准化之路	
•  线性扩容 – 网络带宽、吞吐量
•  在线扩容L1 cache
	
  
	
  
Slave	
  
node1	
   node2	
   node3	
  
	
  
	
  
Master	
  
node1	
   node2	
   node3	
  
Client	
  
	
  
	
  
L1	
  
node1	
   node2	
   node3	
  
大型系统的缓存标准化之路	
•  proxy扩容/缩容
•  无状态服务
•  直接在线扩容/缩容,不影响业务
谢谢

大型系统的缓存标准化之路—从主从多级重client到一体化