内存数据库服务运营之路
@启盼cobain
— Jim Gray
“RAM is the new disk...”
⺫⽬目录
• 新浪内存数据库服务发展历程
• 内存数据应⽤用存储架构演进
• 计数服务存储演化
• 社交图谱存储演化
• OPS组织结构及运维系统架构演进
• 反思与总结
2011-2015
In memory application roadmap in Sina
0
13
26
2011 2012 2013 2014 2015
Redis(TB) Memcached(TB)
In memory application roadmap in Sina
0
60
120
180
240
2011 2012 2013 2014 2015
Redis应⽤用数 Memcached应⽤用数
In memory application roadmap in Sina
0
4000
8000
12000
16000
2011 2012 2013 2014 2015
Redis⽇日请求数(亿) Memcached⽇日请求数(亿)
2011-2015
• ⾯面临挑战
• 2011微博索引Memcached请求量翻番 -> 缓存失效⻛风险
• 2012微博计数服务Redis改造上线 -> Redis⾼高可⽤用
• 2013异地机房部署 -> 跨机房数据更新
• 2013微博核⼼心缓存请求量再次翻番 -> 缓存⾯面临超级热点
• 2013年内存容量增⻓长三倍 -> Redis应⽤用内存疯⻓长
• 2013 2014 App数量及请求量增⻓长四倍 -> 运维效率
• 2015 2016 ?
Memcached Roadmap in Sina
应对缓存实效⻛风险
• 共享内存,更多分⽚片
(without multiget)
• 主备缓存(with multiget)
Master
Client
Slave
set
get
Master
Client
Slave
1 1 1 23
应对跨机房数据更新
• 消息总线 (. WMB)
• 优势:不依赖队列外其他组件
• 劣势:消息总线复杂性较⾼高
• 中间件更新 (. Cacheservice)
• 优势:应⽤用透明,相对运维友好
• 劣势:可靠性较低
• 数据库复制 (. MySQL Replication +
Mytriggerq + Processor)
• 优势:可靠
• 劣势:维护额外数据库同步,消息格
式转化相对受限。
Cache Cache
DC1 Update DC2 Replicate
Client Procsso
r
WMBq
WMBp
WMBq
Cache Cache
DC1 Update DC2 Replicate
Client
Cacheservice
Cache Cache
DC1 Update DC2 Replicate
Client
Database Database
Mytq
Procsso
r
replication
WMBp
set
get
应对超级热点
• 多级缓存
• 核⼼心缓存快速构建数据副本
• Memcached L1 Group
L1
Frontend
Local App
L0
Core API
L1 L1
Frontend
Local App
L0
Master Slave
Redis Roadmap in Sina
Redis⾼高可⽤用
• ⼀一主多从
• Slave故障⾃自动摘除
• Master故障选主后闪恢复
RDB
AOF1
AOF2
AOF3
…
Master
Slave 1
Slave 2
Syncing
from
3-1001
Syncing
from
3-901
Master
RDB
AOF1
AOF2
AOF3
…
New Master
Slave 2
Sync
from
3-901
Redis内存疯涨
• Cache化改造
• store:cache 9:1 -> 6:4
• 数据结构优化
• Redisscounter
• Counterservice
DictEntry
16字节
RedisObject 16
字节
SDS Key
32字节
SDS
16字节
Key
20字节
Value
4字
节
存储⼀一个Key 20字节 ,两个Value 4字节计数
a K-V structure
3倍容量优化
a K-V structure
X 2
X 2
Key
20字节
Value
4字
节
a K-V structure
X 1Value4字
节
2倍容量优化
应⽤用存储架构演进
• 计数服务存储演化
计数服务存储演化
• ⼗十亿级计数
• ⽤用Redis存储1亿计数需要多
⼤大空间?
• ⽤用户纬度增⻓长( ⽤用户关注
数,粉丝数,微博数)
Redis
Client
RedisRedisscount
er shard
Hash(Sharding key)%n
set
get
计数服务存储演化
• 百亿级计数 (Counterservice
)
• 微博纬度增⻓长( 微博转
发评论数)
• MySQL热点更新响应不够
稳定
Redis
Client
RedisCounterserv
ice Shard
Hash(Sharding key)%n
Redis
Client
RedisRedisscount
er Shard
Hash(Sharding key)%n
MySQLMySQLMySQL
最近6个⽉月
6个⽉月前
set
get
计数服务存储演化
• 千亿级计数 (Counterservice )
• 内存table写满后⾃自动dump⾄至
SSD
• LRU cache防⽌止历史热点
Redis
Client
Redis
Hash(Sharding key)%n
6个⽉月内table in memory
6个⽉月以前table in SSD
Table110
Table111
Table113
Table114
…
…
Table112
LRU
cache
Dump
SSD
set
get
应⽤用存储架构演进
• 社交图谱存储演化
社交图谱存储演化
• 社交图谱 - 初级阶段
• graph_list
• attention/followers
• Memcached + MySQL
MySQL Cluster(att)
id1|from_uid1|to_uid1
id2|from_uid1|to_uid2
Memcached Cluster
from_uid : to_uids
MySQL Cluster(fol)
id1|to_uid1|from_uid1
id2|to_uid1|from_uid2
Graph
list
2. SELECT * FROM attention/followers WHERE from_uid/to_uid > offset_id LIMIT n;
3. set
1. get
社交图谱存储演化
• 社交图谱 - 中期阶段
• check attention/followers
• Redis Hashset
• MySQL+Mytrigger+Redis
MySQL Cluster
id1|from_uid1|to_uid1
id2|from_uid1|to_uid2
Redis storage Cluster
Hashset
Graph
service
hgetall
Mytrgger
hexists
INSERT INTO att VALUES(from_uid, to_uid)
hset
(粉丝逻辑未变)
社交图谱存储演化
• 社交图谱 - 进阶
• 内存占⽤用成本
• Redis Storage到Redis Cache
• Hset性能瓶颈
• Longset
• 优化⻓长尾存储
• HBase
MySQL Cluster
id1|from_uid1|to_uid1
id2|from_uid1|to_uid2
Redis cache Cluster
LongsetGraph
service
/ Lget
2. SELECT * FROM att WHERE from_uid > offset_id LIMIT n;
HBase Cluster
rowkey:from_uid1,to_ui
d1,timestamp
Memcached Cluster
2. get/ scan
社交图谱存储演化
• 未来计划-持续分级存储
• 存储层冷热分离⾄至HBase
• 缓存层冷热分离⾄至SSD
DBA
OPS系统更要给⼒力...
OPS运维系统架构演进
• ⼩小作坊运维
• 运维系统
• 运维系统
OPS运维系统架构演进
• ⼩小作坊运维
• 独⽴立监控报警系统
• 多套运维系统共存
• ⼯工单进展难以跟踪
• 运维系统多语⾔言开发
php python
CMDB 运维数据 监控数据 ⼯工单
服务初始
化 配置变更 服务扩容 …
Mon
Ganglia
监控&报警
Cacti
其他R&D
系统
运维系统
WebUI
OPS运维系统架构演进
• 运维系统
• 统⼀一中⼼心管理
• 单模块架构
• 运维系统统⼀一python
CMDB 运维数据 监控数据
服务初始
化 配置变更 服务扩容 …
运维系统
监控配置
管理
RT
⼯工单系统
Saltstack
运维调度
系统
WebUI
R&D API
其他基础
系统依赖
应⽤用Dashboard
OPS运维系统架构演进
• ⼯工业时代
• 模块化,服务化,
可持续迭代
• 数据驱动
CMDB 运维数据 监控数据
初始化服
务
配置变更
服务 扩容服务 …
运维系统
监控服务
RT
⼯工单系统
Saltstack
运维调度
系统
WebUI Restful API
R&D API
其他基础
系统依赖
应⽤用Dashboard
基础功能API
反思与总结
• 应⽤用驱动,不幻想需求
• 没有银弹,避免滥⽤用
• 架构尽量化繁为简
• 运维友好,保证服务⽣生命⼒力
• 分享,好的技术应该推⼲⼴广
• 服务意识,关注应⽤用视⾓角
反思与总结
• Think big, act small!