单元化架构(Cell)下的
高性能服务实践
梁宇鹏 @一乐
新浪微博通讯技术专家
1
Saturday, November 2, 13
如何优化服务性能?
•服务器硬件
•操作系统
•共享库
•算法
•架构
2
Saturday, November 2, 13
单元化架构
一种优化的可能
3
Saturday, November 2, 13
大纲
•我们在做什么
•单元化是什么
•为什么单元化
•怎么做到的
•困难与解决
4
Saturday, November 2, 13
我们在做什么
Saturday, November 2, 13
我们在做什么
Saturday, November 2, 13
我们在做什么
Saturday, November 2, 13
我们在做什么
•内容推送系统 Castalia
•用户筛选
•消息群发
•百万条每秒
7
Saturday, November 2, 13
登上月球
Saturday, November 2, 13
打造高性能服务
Saturday, November 2, 13
10
没有不合理的需求
只有不合理的设计
Saturday, November 2, 13
大纲
•我们在做什么
•单元化是什么
•为什么单元化
•怎么做到的
•困难与解决
11
Saturday, November 2, 13
单元化是什么
•单元(Cell)
•满足某个分区所有
业务操作
•自包含的安装
•分区(Shard)
•数据集的一个子集
•一部分用户
12
Saturday, November 2, 13
服务化架构
•分层服务
–不同数量节点
–不同分区算法
•前端随机选择
下层节点
13
Saturday, November 2, 13
单元化架构
•分层服务
–相同数量节点
–相同分区算法
•前端访问指定
下层节点
14
Saturday, November 2, 13
大纲
•我们在做什么
•单元化是什么
•为什么单元化
•怎么做到的
•困难与解决
15
Saturday, November 2, 13
既要仰望星空,也要脚踏实地
Saturday, November 2, 13
为什么单元化
•性能需求
•每秒百万级别
•成本压力
•水平扩展 Scale out -> 垂直扩展 Scale up
•用复杂性来换吞吐
17
Saturday, November 2, 13
典型服务
•用户筛选
•读取粉丝,筛选用户特征,写筛选结果
•消息群发
•写粉丝收件箱
•发送计费、屏蔽检查、限流控制*
18
Saturday, November 2, 13
服务化方案
Saturday, November 2, 13
单元化方案
Saturday, November 2, 13
资源对比
•筛选服务(百万粉丝为例)
•获取粉丝关系
•筛选结果传输
•数据库查询 vs 文件读取
•数据库资源 vs 本地缓存 = 10/s vs ~50/s
•远程网络 vs 本地磁盘
•带宽:8M vs 0
•延时:启动和传输,400ms vs 0
21
Saturday, November 2, 13
资源对比
•消息群发
•写粉丝收件箱
•MySQL vs Redis
•队列+处理机 vs 0
• Redis 远程 vs 本地
•QPS:80K/s vs 100K/s
•带宽:20M vs 0
22
Saturday, November 2, 13
更少的机器1/2
更高的性能100
23
Saturday, November 2, 13
集成部署
+
数据本地化
24
Saturday, November 2, 13
为什么单元化
•请求隔离
•Cell之间
•独立升级
•灰度发布
•扩容方便
•资源隔离
25
Saturday, November 2, 13
大纲
•我们在做什么
•单元化是什么
•为什么单元化
•怎么做到的
•困难与解决
26
Saturday, November 2, 13
怎么做到的
Saturday, November 2, 13
怎么做到的
•彻底单元化
•从前端到存储
•分区方式
•按接收者ID分区
•不是所有的服务都需要分区
•不是所有的数据都需要分区
28
Saturday, November 2, 13
单元化架构
•分层服务
–相同数量节点
–相同分区算法
•前端访问指定
下层节点
29
Saturday, November 2, 13
怎么做到
•作业管理
•请求分发
•结果收集
•超时控制
•! Scatter-Gather
• CQRS
•fire-and-forget
30
Saturday, November 2, 13
怎么做到
•容错设计
•公共资源故障
•关键资源故障
•Cell切换
31
Saturday, November 2, 13
怎么做到
•如何升级
•作业重做
•持久化队列
32
Saturday, November 2, 13
细节设计
•精细化控制
•资源规划:CPU、内存、硬盘
•CPU绑定
•多硬盘设计
•主从读写分离
•如何伸缩
•Cell多实例
33
Saturday, November 2, 13
大纲
•我们在做什么
•单元化是什么
•为什么单元化
•怎么做到的
•困难与解决
34
Saturday, November 2, 13
困难与解决
Saturday, November 2, 13
困难与解决
•遇到失败怎么办
•问题解决四步
•发现问题 ?
•定位原因 &
•修复数据 *
•重做任务 !
36
Saturday, November 2, 13
困难与解决
•工具集Muses
• Clio
•日志审计
•故障报警
•每日报表
•Uranian
•检测与修复
37
Saturday, November 2, 13
困难与解决
•如何重做任务
•作业需要满足
•幂等性
•可重入
38
Saturday, November 2, 13
39
Move Fast
and
Break Things
Saturday, November 2, 13
困难与解决
•服务如何运维
•异构服务
•资源监控:主从切换
•多团队:权限管理
•服务配合:Dump操作
40
Saturday, November 2, 13
单元化架构
一次值得的尝试
41
Saturday, November 2, 13
谢谢
@一乐
@微博平台架构
42
Saturday, November 2, 13
43
Saturday, November 2, 13