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等