分布式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. 更多技术干货 欢迎关注“美团技术团队” 美团存储团队招聘岗位请扫码

Home - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-17 18:59
浙ICP备14020137号-1 $Map of visitor$