分布式KV存储Cellar技术演进与实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. 分布式KV存储Cellar技术演进与
实践
美团基础技术部
2. 自我介绍
邢子山,美团技术专家,有 7 年以上分布式存储研发经验。
2012年毕业于北京邮电大学,2014 年加入美团,15年参与分布式 KV 存储Cellar开发,并一直关注于分布式存储技术领域 。
3. 目录
• 简介
• 容灾
• 高性能
• 数据传输
• 未来规划
4. Cellar介绍
持久化、大容量、高可用、高性能的KV存储
服务 。
到店
到家
平台 。。。
PaaS
中间件 服务管理 MQ 配置管理
存储 RDS KV服务-Cellar KV缓存
IaaS
容器
IDC
虚拟化
5. 数据分布
Key
Hash
路由表
Bucket(桶)
固定Hash算法
固定数目数据分片
存储节点
分片->存储节点对照表
6. Cellar架构
Observer
Ob
Ob
...
Configserver
Ob
获取路由表
Master
Slave
心跳
获取路由表
Request
Client
DS
DS
复制
DS
迁移
Dataserver
• Configserver: 中心节点,维护路由表以及管理数据节点。
• Dataserver: 存储数据和处理Client请求,支持复制和迁移等。
• Client: Cellar SDK。
DS
代理
7. 目录
• 简介
• 容灾
• 高性能
• 数据传输
• 未来规划
8. Cellar-节点容灾
•
•
想快速Failover却承担不起数据恢复的代价?
运维操作导致请求超时?
Handoff
9. Cellar-节点容灾
• 故障机器被临时摘除,由其它副本提供服务
• 其它副本记录增量数据日志,故障机器恢复
后只需要回传增量数据
中心节点
A故障
A 恢复
客户端
分片1
心跳
心跳
请求
分片1请求
分片1复制
A
1分片主
2分片备
回写增量log
B
1 分片备
2分片主
分片2复制
分片1&2 log
10. Cellar-机房容灾
• 写主副本
• 可以就近机房读
路由表
心跳
IDC2
IDC1
读
A
写
B
C
复制
集群
D
11. Cellar-跨地域容灾
•
•
•
跨地域专线不稳定
跨地域专线有限的带宽
单元化部署、多活架构
集群间复制
12. Cellar-跨地域容灾
• 写主集群,存在跨地域访问
• 就近地域读
北京主集群
A
B
C D
J K
读&写
集群内复制
集群间复制
读
H
I
集群内复制
上海从集群
13. Cellar-异地多活
• 集群间互相覆盖
• 用户保证key不冲突
北京集群
A
B
C D
J K
读&写
集群内复制
集群间复制
读&写
H
I
集群内复制
上海集群
14. 目录
• 简介
• 容灾
• 高性能
• 数据传输
• 未来规划
15. 高性能方向
Dataserver模块
统计等模块
热点统计 心跳 复制 迁移 handoff
代理 binlog raft强一致
流控
数据流模块
基础模块
网络库
日志
线程池
定时器
存储引擎
配置管理
16. 线程池调度
背景:
Dataserver线程池
1、读写分离,每个队列有单独的线程池
线程池
2、线程得不到充分利用
读队列
网络线程
Request
读慢队列
写队列
写慢队列
复制队列
17. 线程池调度
优化:
Dataserver共享线程池
1、使用无锁队列
预留线程 |
2、共享线程统一管理
读队列
2.1 通过内部调度队列管理共享
线程,按需分配
读慢队列
2.2 根据队列长度以及请求类型
计算需要的线程数
网络线程
Request
写队列
写慢队列
复制队列
内部调度队列
共享线程
18. 网络线程读引擎
背景:
Dataserver
1、线上读多写少
2、读多场景下线程轮询占比仍然高
存储引擎
内存引擎MDB
持久化引擎RDB
线程池/工作线程
网络库/网络线程
Request
Response
客户端
19. 网络线程读引擎
Dataserver
1、适用读多场景
2、命中无需进线程池,减少CPU切换
持久化引擎RDB
线程池/工作线程
内存引擎MDB
命中返回
网络库/网络线程
Request
Response
客户端
20. MDB优化
背景:
1、MDB互斥访问,锁冲突严重
2、水平拆分MDB无法完全解决问题
Mdb 往往决定业务访问耗时
缓存层
Mdb 1
Mdb 2
持久化层
Rocksdb
21. MDB优化
item1
Bucket 1
HashMap
item2
无锁链表。
…
Bucket n
Slab Mgr1 Slab1
Slab Mgr2 Slab3
Slab Managers
Mem Pool
page1
page2
page3
MDB主要数据结构
Slab2
细粒度锁,每个Slab
Manager有单独的互斥锁。
整体通过用户态RCU,可以并
发读。
22. RDB支持KV分离
Put
LSM-tree引擎
优点:随机写转化为顺序写
缺点:写放大严重,尤其是大Key
k1:v1 k2:v2
内存
k1:v1 k2:v2
Memtable
Flush
L0
硬盘
k2 k1
Compaction
L1(100M)
L2(1G)
SST
Rdb架构图
WAL
23. RDB支持KV分离
Put
使用rocksdb integrated blobdb
• 小value仍然写SST
• 大value KV分离存储
k1:v1 k2:v2
内存
k1:v1 k2:v2
Memtable
Flush
L0
硬盘
k1/index
WAL
Compaction
k1/v1
L1(100M)
L2(1G)
SST
Blob
24. 目录
• 简介
• 容灾
• 高性能
• 数据传输
• 未来规划
25. 迁移重构
当前迁移遇到的问题:
1、几十T的大数据量集群宕机需要迁移几天,
数据可靠性差
2、迁移期间有长尾请求
分片1
Client
请求
分片2
分片2
代理请求
响应
分片3
分片3
响应
Dataserver A
Dataserver B
26. 迁移重构
1、多线程迁移,充分利用IO资源
2、优先迁移副本数少的桶
Put
Thread 1
5
片
分
引擎
引擎
KVs
引擎 Dataserver2
引擎 Dataserver3
引擎 Dataserver4
KVs
遍历
Thread 2
片9
分
遍历
遍
历
KVs
Put
KVs
分
Thread 3
片0
KVs
Put
KVs
Dataserver1
27. 迁移重构
1、大数据量集群文件级迁移
2、迁入端控制SST传输速度
Migrate Thread
引擎
历史数据
Migrate
Log
文件
文件
KVs
Dataserver 1
加载
文件
文件
KVs
Put
Dataserver 2
引擎
28. Bulkload离线数据导入
背景:
1、batchput接口耗时长
数据流层 复制
Binlog
存储层 Memtable
2、batchput负载高
文件 SST
持久化Rdb引擎
Thread Pool
网络库
客户端
Dataserver Put/BatchPut请求处理流程
29. Bulkload离线数据导入
Hive2Cellar
XT平台
分片&排序
数据文件
数据文件
在客户端生成数据文件,将
资源消耗卸载到客户端。
上传
对象存储
解耦客户端和服务端。
下载文件
DS
DS
集群
DS
下载数据文件直接加载到引擎。
30. Bulkload离线数据导入
流控:
1、控制S3下载速度
2、下载的SST文件根据引擎压力控制
加载速度
对象存储
上传
下载
Generate 分片1 数据文件
分片2 数据文件
客户端
No
ti
fy
分片 1
分片 2
分片 1
分片 2
复制文件地址
引擎
Dataserver 1
引擎
Dataserver 2
31. 数据导出
GetAreaRange导出数据问题:
1、按分片单线程访问,效率低。
2、只适用于临时导出全量数据,不支持实时数据导出。
分片1
分片2
扫描硬盘
片2
分
读
Dataserver 1
引擎
Client Client
读分
片1
分片2
分片`
扫描硬盘
引擎
循环调用GetAreaRange获取所有数据
Dataserver 2
32. 数据导出
将MQ作为cellar从集群
•历史数据通过引擎遍历同步到MQ
•实时数据解析binlog同步到MQ
Dataserver
复制线程
引擎
历史
数据
编码
Json
KVs
BinLog
据
数
实时
Hive
MQ
复制线程
Mysql
引擎
历史
数据
编码
KVs
BinLog
据
数
实时
Dataserver
Json
33. 目录
• 简介
• 容灾
• 高性能
• 数据传输
• 未来规划
34. 未来规划
•
容灾
解决就近写冲突
•
高性能
硬件加速:持久化内存、基于FPGA固态硬盘
share nothing架构探索
•
稳定性建设
完善长稳、集成测试
35. Q&A
36. 更多技术干货
欢迎关注“美团技术团队”
美团存储团队招聘岗位请扫码