SlideShare una empresa de Scribd logo
1 de 75
分布式缓存与队列
新浪微博
洪小军 @XiaoJunHong
2012.8.16
缓存和队列概述
雪崩
高可用
单点故障
Ram Is The New Disk
异步化处理
横向扩展
对于一个大流量在线系统,你是否听过:
缓存和队列概述
• 实现一个简化版微博系统
– 发表微博、查看用户发的微博列表
– 评论微博、查看微博评论列表和评论数
– 加关注、查看关注列表
缓存和队列概述
• 快速搭建完成并上线
Mysql
Web
缓存和队列概述
但是随着用户和流量的不断增长,开始出现
各种各样的问题……
缓存和队列概述
• 从四条主线来说明怎么一步步解决问题
o 查看微博列表数据-memcached
o 发布微博和评论-memcacheq
o 加关注和查看关注列表-redis、memcached
o 加和查看微博计数-redis、handlersocket
Feed Timeline
Feed Timeline
Mysql
Web
Feed Timeline
• 问题出现
– 读请求很慢,大量mysql慢查询和超时情况
– mysql每秒可支撑千级别qps
Feed Timeline
• 加本地缓存
Mysql
Web
In-Process
Cache
Feed Timeline
• 问题出现
– 数据太多本地缓存放不下
– 影响JVM GC,进而影响系统整体性能
– 多个Web时存在缓存同步问题
Feed Timeline
• 集中式缓存
Mysql
Web
Memcached
Memcached简介
Free & open source, high-performance, distributed
memory object caching system, generic in nature, but
intended for use in speeding up dynamic web
applications by alleviating database load.
Memcached简介
• Key-Value
• Simple Protocol
– set/get
– incr/decr
– stats
• Lazy Expiration
• LRU
• Not Support Traversal
• Access
– Telnet
– printf 'statsrn' | nc ip port
– Java client
Memcached简介
The primary goal of the slabs subsystem in memcached
was to eliminate memory fragmentation issues
totally by using fixedsize memory chunks coming from a
few predetermined size classes.
Feed Timeline
• Memcached使用示例
– 单条微博数据结构
• key:status id
• value:content protocol buffer object(why not json?)
– 用户微博列表数据结构
• key:user id
• value:status id array(bytes,why not java long[]?)
– nio byte buffer convert long[] to byte[]
Feed Timeline
• Memcached使用示例
– 操作命令
• set <key> <flags> <exptime> <bytes> <data block>
• get <key>
• delete <key>
– 尽量减少value大小,节省存储和带宽成本
• memcached客户端quickLZ压缩
• 从业务层面做相应压缩
Feed Timeline
• 问题出现
– mysql再次出现性能瓶颈,读取压力过大
• 单台mc容量有限,缓存数据大量过期
• 缓存命中率下降,进而导致大量请求穿透到mysql
– memcached出现慢查询情况
• mc单机吞吐量有限,读压力超过可支撑最大限度
• 带宽成为瓶颈
Feed Timeline
• 分布式memcached
Mysql
Web
MemcachedMemcached ......
分布式概述
• 实现分布式的方式
– 客户端实现分布式
• memcached、memcacheq、redis、mysql…
– 服务端实现分布式
• cassandra、dynamo、hbase…
分布式概述
• 客户端实现分布式
分布式概述
• 客户端实现分布式常用算法
– 取模求余算法
– 一致性hash算法
分布式概述
• 取模求余算法
node1 node2 node3
hash(id) % 3
(0) (1) (2)
分布式概述
• 取模求余算法-加节点
node1 node2 node3
hash(id) % 4
(0) (1) (2)
node4
(3)
分布式概述
• 一致性哈稀算法
分布式概述
• 一致性哈稀算法-加节点
分布式概述
• 客户端实现分布式常用算法
– 取模求余算法
• 优点:算法简单
• 缺点:加减节点时震荡厉害,命中率下降厉害
– 一致性hash算法
• 优点:加减节点时震荡较小,保持较高命中率
• 缺点:负载不够均衡,出现热节点
注意点:当存在单点时,优先考虑一致性hash
Feed Timeline
• 问题出现
– 某memcached crash,读写此mc报错
• 可能是硬件或其它原因导致crash
• 典型的单点问题
Feed Timeline
• 防单点
– failover
– 一致性哈稀
Feed Timeline
• 如果有资源:master/slave
Mysql
Web
Memcached
Master Cluster
Memcached
Slave Cluster
Feed Timeline
• 问题出现
– mysql压力再次过大,性能出现瓶颈
– mc容量出现瓶颈,命中率降低
Feed Timeline
• 在线扩容memcached
– 保证高可用,注意命中率
Slave
node1 node2 node3
Backup(old master)
node1 node2 node3
Master(new master-empty)
node1 node2 node3Client
(get)
node4
Feed Timeline
• 问题出现
– memcached读再次成为瓶颈
– 读取量会持续成倍增长
– 期望有线性扩容的方案
Feed Timeline
• 线性扩展-L1 Cache
Slave
node1 node2 node3
Master
node1 node2 node3
L1 cache
node1 node2 node3
Client
(get)
Feed Timeline
Feed Timeline
• 打造高可用memcached-容量规划
– 请求量
– 命中率
• 预热,防止雪崩
– 带宽
• 网卡、交换机
– 存储容量
• 预估存储大小
• 过期策略、剔除率
– 连接数
Feed Timeline
• 小结
无cache 进程内 集中式 分布式 master/slave L1 cache
Create Feed
Create Feed
Mysql
Web
Create Feed
• 问题出现
– 写入有一定延迟,期望轻量级发布
– 前端承担太多职责,期望资源集中式管理
Create Feed
• 异步化处理
Resouce
Web
Memcacheq
Processor
Memcacheq简介
• Memcached Protocol
– set/get
– stats queue
• Berkeley DB Storage
• Fixed Size Value
• 10000+ qps
• Access
– Telnet
– printf 'stats queuern' | nc ip port
– Java client
Create Feed
• 问题出现
– 单机出现读写瓶颈
– 存在单点故障风险
Create Feed
• 分布式memcacheq
– 轮询读取,随机写入,写入失败写入下一个
Mysql
Web
MemcacheqMemcacheq ......
Processor
Create Feed
• 问题出现
– Feed消息大小跨度比较大(xxb – 4k),平均大
小< 512b,90%以上在512b以下
– mcq由于采用定长存储,所以大小设置为4k
– 浪费磁盘空间及其有一定的性能损耗
Create Feed
• 分成多种纬度大小的mcq
Resouce
Web
Memcacheq
( 5 1 2 b )
Processor
Memcacheq
( 4 k)
Create Feed
• 问题出现
– 高峰时读写memcacheq有较多慢请求,甚至超时
– memcacheq读写成为瓶颈
Create Feed
• 在线扩容memcacheq
– 先上线processor,后上线web,why?
– 避免队列堆积情况
Create Feed
• 问题出现
– 队列堆积,造成微博延迟
– 冷数据从磁盘读取,恶性循环
Create Feed
• 打造高速队列处理系统
– 按业务和处理速度拆分队列
– 处理速度合理预估
– 可降级
– 避免数据库查询
Create Feed
• 队列堆积处理
– 加快队列数据处理能力
• 扩容队列处理机或开更多处理线程
• 当资源成为瓶颈时,降级处理
– 解决mcq读写性能瓶颈,提高吞吐量
• 整体成为瓶颈:扩容队列
• 某节点成为瓶颈:若无堆积考虑下线此节点
Create Feed
• 问题出现
– 启用新的IDC以实现跨机房容灾及其提高就近用
户访问速度
– 消息需要在各IDC之间传输
Create Feed
• wmb(weibo message broker)
Create Feed
• memcached统计和监控
– message per second
– message per day
– 峰值写入
– 队列堆积数(stats queue)
Social Graph
Social Graph
Mysql
Web
Social Graph
• 问题出现
– 读成为瓶颈,出现大量慢查询
– 对于关系业务,期望的是提供高速的接口
Social Graph
• 使用redis存储
– 为什么不用memcached?
• redis支持更丰富的数据结构
• redis做为storage
Mysql
Web
Redis
Redis简介
Redis is an open source, advanced key-value store. It is
often referred to as a data structure server since keys
can contain strings, hashes, lists, sets and sorted sets.
REmote DIctionary Server
Redis简介
• Advanced、Fast Key-Value Store
• Rich Data Types
– Strings:get/set/incr/decr
– Hash:hget/hgetall/hset
– List:lpush/lpop/lrange
– Set:sadd/srem/smembers
– Info
• Uses Memory As Main Storage
• Single Thread
• Uses Disk For Persistence
– rdb
– aof
• Replication
• Access
– Telnet
– printf ‘info rn' | nc ip port
– Java client
Social Graph
• Redis使用示例-Social Graph
– 数据结构[hash]
• key:user id
• fields:friend ids
• value:added time
– 相关命令
• 加关注:hset user_id friend_id added_time
• 删关注:hdel user_id friend_id
• 获取关注用户的时间:hget user_id friend_id
• 获取关注列表:hgetall user_id
Social Graph
• 问题出现
– 读写出现瓶颈,大量慢查询
– Redis服务器cpu 100%
– 单机成为瓶颈
Social Graph
• 分布式redis
Web
RedisRedis ......
Social Graph
• 问题出现
– 获取关注列表比较慢
– redis服务器cpu比较高
– hgetall成为瓶颈
Social Graph
• 加Memcached
Mysql
Web
Memcached
Redis
Weibo Counter
Weibo Counter
Mysql
Web
Weibo Counter
• 问题出现
– 读成为瓶颈,出现大量慢查询
– 对于计数业务,期望的是提供高速的接口
Weibo Counter
• 计数独立存放到redis中
Mysql
Web
Redis
Weibo Counter
• 问题出现
– 读写出现瓶颈,大量慢查询
– Redis服务器cpu 100%
– 单机成为瓶颈
Weibo Counter
• 分布式redis
Web
RedisRedis ......
Weibo Counter
• 问题出现
– 容量成为瓶颈
– 微博纬度的计数器,一直在快速增长
Weibo Counter
• 支持滚动的redis
First Redis
Second Redis
MysqlClient
set
set
set
Client
get
get
Weibo Counter
• 问题出现
– redis可以存放的数据量较小,随着业务的发展,
穿透到mysql的量逐渐增大
Weibo Counter
• rediscounter
– 消息定长存储
• 节省>60%的空间
– 启动时预分配所有内存
– aof支持position
Weibo Counter
• 问题出现
– 滚动切换成本较大,伴随着较大风险
– 资源耗费成本比较大
• 问题出现
– …… ……
– …… ……
• 架构在不断演化中
– 没有永恒的和一成不变的方案
– 合适的场景使用合适的技术和方案
– 力求简单可靠
– 为未来一段时间考虑但不过度设计
QA
Thank You

Más contenido relacionado

La actualidad más candente

阿里自研数据库 Ocean base实践
阿里自研数据库 Ocean base实践阿里自研数据库 Ocean base实践
阿里自研数据库 Ocean base实践
drewz lin
 
Q con shanghai2013-[刘海锋]-[京东文件系统简介]
Q con shanghai2013-[刘海锋]-[京东文件系统简介]Q con shanghai2013-[刘海锋]-[京东文件系统简介]
Q con shanghai2013-[刘海锋]-[京东文件系统简介]
Michael Zhang
 
淘宝图片存储与Cdn系统
淘宝图片存储与Cdn系统淘宝图片存储与Cdn系统
淘宝图片存储与Cdn系统
Dai Jun
 

La actualidad más candente (20)

豆瓣数据架构实践
豆瓣数据架构实践豆瓣数据架构实践
豆瓣数据架构实践
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈
 
阿里CDN技术揭秘
阿里CDN技术揭秘阿里CDN技术揭秘
阿里CDN技术揭秘
 
阿里自研数据库 Ocean base实践
阿里自研数据库 Ocean base实践阿里自研数据库 Ocean base实践
阿里自研数据库 Ocean base实践
 
No sql@vip new
No sql@vip newNo sql@vip new
No sql@vip new
 
大型电商的数据服务的要点和难点
大型电商的数据服务的要点和难点 大型电商的数据服务的要点和难点
大型电商的数据服务的要点和难点
 
美团点评技术沙龙010-点评RDS系统介绍
美团点评技术沙龙010-点评RDS系统介绍美团点评技术沙龙010-点评RDS系统介绍
美团点评技术沙龙010-点评RDS系统介绍
 
自助工具助Dba提升效率
自助工具助Dba提升效率自助工具助Dba提升效率
自助工具助Dba提升效率
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at Taobao
 
Traffic server 管理员指南v1.0
Traffic server 管理员指南v1.0Traffic server 管理员指南v1.0
Traffic server 管理员指南v1.0
 
基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践
 
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
浅谈电商网站数据访问层(DAL)与 ORM 之适用性浅谈电商网站数据访问层(DAL)与 ORM 之适用性
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
 
大数据时代feed架构 (ArchSummit Beijing 2014)
大数据时代feed架构 (ArchSummit Beijing 2014)大数据时代feed架构 (ArchSummit Beijing 2014)
大数据时代feed架构 (ArchSummit Beijing 2014)
 
redis 适用场景与实现
redis 适用场景与实现redis 适用场景与实现
redis 适用场景与实现
 
Q con shanghai2013-[刘海锋]-[京东文件系统简介]
Q con shanghai2013-[刘海锋]-[京东文件系统简介]Q con shanghai2013-[刘海锋]-[京东文件系统简介]
Q con shanghai2013-[刘海锋]-[京东文件系统简介]
 
阿里云CDN技术演进之路
阿里云CDN技术演进之路阿里云CDN技术演进之路
阿里云CDN技术演进之路
 
中大型规模的网站架构运维 Saac
中大型规模的网站架构运维 Saac中大型规模的网站架构运维 Saac
中大型规模的网站架构运维 Saac
 
美团点评技术沙龙14:美团云对象存储系统
美团点评技术沙龙14:美团云对象存储系统美团点评技术沙龙14:美团云对象存储系统
美团点评技术沙龙14:美团云对象存储系统
 
如何针对业务做DB优化
如何针对业务做DB优化如何针对业务做DB优化
如何针对业务做DB优化
 
淘宝图片存储与Cdn系统
淘宝图片存储与Cdn系统淘宝图片存储与Cdn系统
淘宝图片存储与Cdn系统
 

Similar a 分布式缓存与队列

分布式Key-value漫谈
分布式Key-value漫谈分布式Key-value漫谈
分布式Key-value漫谈
lovingprince58
 
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优
thinkinlamp
 
[.Net开发交流会][2010.06.19]大众点评网的技术变迁之路(王宏)
[.Net开发交流会][2010.06.19]大众点评网的技术变迁之路(王宏)[.Net开发交流会][2010.06.19]大众点评网的技术变迁之路(王宏)
[.Net开发交流会][2010.06.19]大众点评网的技术变迁之路(王宏)
Shanda innovation institute
 
构建可扩展的微博系统
构建可扩展的微博系统构建可扩展的微博系统
构建可扩展的微博系统
lonegunman
 
MySQL和IO(下)
MySQL和IO(下)MySQL和IO(下)
MySQL和IO(下)
Feng Yu
 
大规模网站架构
大规模网站架构大规模网站架构
大规模网站架构
drewz lin
 
Google LevelDB Study Discuss
Google LevelDB Study DiscussGoogle LevelDB Study Discuss
Google LevelDB Study Discuss
everestsun
 
Bypat博客出品-服务器运维集群方法总结
Bypat博客出品-服务器运维集群方法总结Bypat博客出品-服务器运维集群方法总结
Bypat博客出品-服务器运维集群方法总结
redhat9
 

Similar a 分布式缓存与队列 (20)

Nosql三步曲
Nosql三步曲Nosql三步曲
Nosql三步曲
 
分布式Key-value漫谈
分布式Key-value漫谈分布式Key-value漫谈
分布式Key-value漫谈
 
1到100000000 - 分布式大型网站的架构设计
1到100000000 - 分布式大型网站的架构设计1到100000000 - 分布式大型网站的架构设计
1到100000000 - 分布式大型网站的架构设计
 
Mysql调优
Mysql调优Mysql调优
Mysql调优
 
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践
 
Bypat博客出品-服务器运维集群方法总结2
Bypat博客出品-服务器运维集群方法总结2Bypat博客出品-服务器运维集群方法总结2
Bypat博客出品-服务器运维集群方法总结2
 
豆瓣网技术架构变迁
豆瓣网技术架构变迁豆瓣网技术架构变迁
豆瓣网技术架构变迁
 
大众点评网的技术变迁之路
大众点评网的技术变迁之路大众点评网的技术变迁之路
大众点评网的技术变迁之路
 
[.Net开发交流会][2010.06.19]大众点评网的技术变迁之路(王宏)
[.Net开发交流会][2010.06.19]大众点评网的技术变迁之路(王宏)[.Net开发交流会][2010.06.19]大众点评网的技术变迁之路(王宏)
[.Net开发交流会][2010.06.19]大众点评网的技术变迁之路(王宏)
 
构建可扩展的微博系统
构建可扩展的微博系统构建可扩展的微博系统
构建可扩展的微博系统
 
java title
java titlejava title
java title
 
浅析分布式存储架构—设计自己的存储- 58同城徐振华
浅析分布式存储架构—设计自己的存储- 58同城徐振华浅析分布式存储架构—设计自己的存储- 58同城徐振华
浅析分布式存储架构—设计自己的存储- 58同城徐振华
 
A
AA
A
 
MySQL和IO(下)
MySQL和IO(下)MySQL和IO(下)
MySQL和IO(下)
 
Memcached浅析 韩建华
Memcached浅析 韩建华Memcached浅析 韩建华
Memcached浅析 韩建华
 
大规模网站架构
大规模网站架构大规模网站架构
大规模网站架构
 
Google LevelDB Study Discuss
Google LevelDB Study DiscussGoogle LevelDB Study Discuss
Google LevelDB Study Discuss
 
Bypat博客出品-服务器运维集群方法总结
Bypat博客出品-服务器运维集群方法总结Bypat博客出品-服务器运维集群方法总结
Bypat博客出品-服务器运维集群方法总结
 
分布式存储与TDDL
分布式存储与TDDL分布式存储与TDDL
分布式存储与TDDL
 

分布式缓存与队列