《专场20.4-vivo KV存储探索与实践-汪翔.pdf》由会员分享,可在线阅读,更多相关《专场20.4-vivo KV存储探索与实践-汪翔.pdf(25页珍藏版)》请在三个皮匠报告上搜索。
1、vivo KV存储探索与实践汪翔vivo互联网专家工程师关于个人网易,APM系统研发以及云游戏的探索腾讯,数据库智能化运维平台研发以及数据库中间件研发过往履历过往履历分布式数据库/分布式系统/存储引擎/编程语言/系统架构等技术方向兴趣方向兴趣方向汪翔vivo数据库技术专家负责项目负责项目负责 Redis 方向的研发,主导 Redis 双活项目从0到1的研发,及 Redis 内核的改进负责 KV 方向的研发,主导 KV 存储项目从0到1的研发负责 MySQL 方向的研发,包括MySQL Proxy、MySQL HA以及SQL审核服务负责 DTS 项目的研发,构建数据订阅、数据同步、数据迁移的一体
2、化平台目录背景目标背景目标系统架构系统架构设计细节设计细节性能指标性能指标周边生态周边生态未来展望未来展望背景和目标当前公司内部没有统一的磁盘 KV 存储服务,很多业务都将 Redis 当作 KV 存储服务在使用,但是部分业务可能不需要 Redis 如此高的性能,却承担着巨大的成本(内存价格相对磁盘来说更加昂贵)。基于降低存储成本的需求,同时为了尽可能减少业务迁移的成本,我们基于 TiKV 研发了一套磁盘KV 存储服务。背景背景兼容 Redis 协议,便于业务进行数据库迁移支持大容量存储,承载业务大规模数据高性能,满足业务对性能的需求高可用,能够容忍部分节点失效易运维,降低整体运维成本目标目标
3、系统架构-整体架构兼容 Redis 协议存储计算分离支持横向扩展高可用性系统架构-TiKV 架构简介Placement DriverPlacement Driver:PD是集群的管理者,它会周期性检查TiKV状态,根据需要进行负载和数据的自动均衡StoreStore:Store 表示一个存储点,每个Store中有一个RocksDB实例,负责将数据持久化到本地磁盘RegionRegion:Region是 Key-Value数据移动的基本单元,每个 region 的数据会使用raftraft协议协议复制到多个节点,共同组成一个 Raft GroupNodeNode:Node表示集群中的一个物理节点
4、。每个Node上可以有一到多个Stores,每个Store上有多个Regions系统架构-TiKV 架构简介Transaction ModelTransaction Model:TiKV使用类似于google percolator 的事务模型,支持snapshot isolation级别的事务隔离Raft:Raft:TiKV使用Raft协议来进行数据复制,支持线性一致性RocksDBRocksDB:TiKV使用rocksdb作为底层存储引擎系统架构-Tula架构Connection Management模块管理客户端连接RESP Encoder 和 Decoder 负责对协议数据进行编解码Ex
5、ecutor 将 Redis Command 转换为事务型的KV请求Expire Checker 负责检查Key是否过期GC Worker 负责异步删除过期数据Connetion ManagementRESP DecoderExecutorTiKVRESP EncoderCientsExpire CheckerFlow ControllerGC Woker设计细节 数据编码Meta Meta KeyKey:1.namespace,命名空间2.version:编码版本,为了前向兼容3.元数据Key标记4.用户keyValueValue:1.reserved,保留字段2.object_versio
6、n,对象版本,用于快速删除3.expire_time,过期时间4.data_type,数据类型5.encode_type,编码类型6.user_value,用户valueStringreservedobject_versionexpire_timedata_typeencode_typeuser_valuenamespaceversionMuser_key设计细节 数据编码Data KeyData Key:1.namespace,命名空间2.version,编码版本3.D,Data Key标记4.user_key,用户Key5.object_version,数据版本,用于异步快速删除6.fie
7、ld,Hash中的fieldHashHashnamespaceversionMuser_keyreservedobject_versionexpire_timedata_typeencode_typenamespaceversionDuser_keyobject_versionfielduser_value设计细节 数据编码Data KeyData Key:1.namespace,命名空间2.version,编码版本3.D,Data Key标记4.user_key,用户Key5.object_version,数据版本,用于异步快速删除6.index,list中的元素的索引ListListnam
8、espaceversionMuser_keyreservedobject_versionexpire_timedata_typeencode_typenamespaceversionDuser_keyobject_versionindexuser_value设计细节 数据编码Data KeyData Key:1.namespace,命名空间2.version,编码版本3.D,Data Key标记4.user_key,用户Key5.object_version,数据版本,用于异步快速删除6.member,集合中的元素SetnamespaceversionDuser_keyobject_versi
9、onmembernilnamespaceversionMuser_keyreservedobject_versionexpire_timedata_typeencode_type设计细节 数据编码Data KeyData Key:1.namespace,命名空间2.version,编码版本3.D,Data Key标记4.user_key,用户Key5.object_version,数据版本,用于异步快速删除6.S,标识为Score Key7.score,元素的score8.member,元素的memberZSetZSetnamespaceversionMUser_keyreservedobje
10、ct_versionexpire_timedata_typeencode_typenamespaceversionDuser_keyobject_versionmembernilscoreS设计细节 过期数据回收 被动检测,数据访问时判断Key是否过期 主动检测,定期检查带TTL的Key是否过期namespaceprefixslotExpire_timeEnc_versionUser_keyNil 带TTL的 Key 冗余一个 Expire Key,提高检测效率 对 Expire Key 空间进行划分,支持并发扫描 发现 Key 已过期,删除 Meta Key,并生成GC Key过期检测过期检
11、测namespaceprefixslotuser_keyenc_versionobject_versionnilAdaptive GCAdaptive GC主动检测主动检测 根据负载情况自动调整 GC 速度,提升整体吞吐 可调整参数:GC线程数、Write Batch大小、Sleep时间GC threadSlot 1Slot 2.Slot 1000Slot 1001.Write BatchGC ControllerAdjust parametersTiKV ClusterLoad infoGC thread.GC Worker GC Key 空间按照slot进行划分,支持并发删除=object
12、_version 的 Data Key 都需要被删除设计细节 多租户设计 解决小数据量集群资源占用问题 基于 namespace 进行数据隔离 底层共享一个TiKV存储集群CientsTulaTulaTula Cluster ATulaTulaTula Cluster BTulaTulaTula Cluster CCientsCientsTenant ATenant BTenant CTiKV设计细节 高可用和水平扩展 基于 ETCD in PD 服务注册和服务发现 兼容Redis Cluster协议 每个 Tula 平分 slot 分配 Tula 节点 Down 掉之后自动触发slot 分配
13、 扩缩容之后自动触发 slot 分配TulaTulaTulaPD ClusterCientsMOVED性能指标 测试环境CPU:CPU 2.30GHz 32 core2.30GHz 32 core内存:376G376G硬盘:NVME SSD 4TTiKVTiKV(3 3节点)节点):TulaTula(3 3节点)节点):CPU:CPU 2.10GHz 32 core2.10GHz 32 core内存:187G187GCPU:CPU 2.30GHz 32 core2.30GHz 32 core内存:376G376G硬盘:NVME SSD 4TPDPD(3 3节点)节点):性能指标 SET性能指标
14、 GET周边生态 离线数据批量导入分派排序任务range数据读取Tula编码分区排序Range切分分区数据分布Spark Job数据读取Tula编码分区排序Range切分分区数据分布Spark Job汇总数据分布预分裂Region分派导入任务RocksDBTiKVRocksDBTiKVRocksDBTiKVPD Cluster旧分区旧分区Shuffle新分区新分区新分区分区排序分区排序分区排序rangeHiveTiKV集群上传并导入上传并导入上传并导入Spark Driver 解决批量数据插入慢的问题 基于 spark 服务,导入速度大幅度提升 支持 Hive 和 csv/orc/parque
15、t 文件周边生态 数据迁移DTS-RedisTulaTulaTiKV Cluster从Redis迁移到磁盘KVTulaTulaTiKV ClusterDTS-KVTulaTulaTiKV ClusterDTS-KVTulaTulaTiKV Cluster从磁盘KV迁回到Redis从磁盘KV迁移到其他磁盘KV周边生态 备份和恢复TulaTulaTiKVTiKVTiKVPD ClusterSST FileSST File.对象存储磁盘KV集群BRTulaTulaTiKVTiKVTiKVPD Cluster磁盘KV集群 基于TiKV BR 工具 数据编码部分修改为Tula编码未来展望 自适应slot锁机制,解决部分场景事务冲突较多的问题 性能优化,下沉数据结构相关的指令到TiKV,提升整体性能 构建缓存和存储一体化系统 支持更多的协议,Table API等