滴滴從KV儲存到NewSQL實戰
桔妹導讀:本文講訴滴滴在分散式Nosql儲存Fusion之上構建NewSQL的實踐之路。詳細描述Fusion-NewSQL的特性,應用場景,設計方案。
1.背景
▍我們的問題
▍開源產品調研
我們需要一款高吞吐,低延遲的資料庫解決方案,但是TIDB由於要滿足事務,2pc方案天然無法滿足低延遲(100ms以內的99rt,甚至50ms內的99rt)
我們的多數業務,並不真正需要分散式事務,或者說可以透過其他補償機制,繞過分散式事務。這是由於業務場景決定的。
TIDB三副本的儲存空間成本相對比較高。
我們內部一些離線資料匯入線上系統的場景,不能直接和TIDB打通。
▍我們的基礎
2.需求
高吞吐,低延遲,大容量。
相容MySQL協議及下游生態。
支援主鍵查詢和二級索引查詢。
Schema變更靈活,不影響線上服務穩定性。
3.架構設計
解析MySQL協議的DiseServer
儲存資料的Fusion叢集-Data叢集
儲存索引資訊的Fusion叢集-Index叢集
負責Schema的管理配置中心-ConfigServer
非同步構建索引程式-Consumer負責消費Data叢集寫到MQ中的MySQL-Binlog格式資料,根據schema資訊,生成索引資料寫入Index叢集。
外部依賴,MQ,Zookeeper
4.詳細設計
▍儲存結構
▍資料讀寫流程
資料寫入
使用者透過MySQL-sdk將協議發給dise-server
dise-server根據schema對使用者寫入的SQL做校驗
dise-server將校驗透過的SQL轉成Redis的Hashmap結構,透過Redis協議發給Data叢集
Data叢集將資料寫入wal檔案,並將資料儲存rocksdb。
Data叢集后臺執行緒將wal檔案消費,轉成MySQL-Binlog格式。將資料發到MQ
非同步索引模組消費MQ,將MySQL-Binlog根據操作型別(insert,update,delete)配合schema資訊,構建索引資訊,並將索引資料寫入index叢集。
查詢
dise-server接收到SQL查詢,根據條件,選擇索引,如果沒有命中任何索引,給使用者返回錯誤(Fusion-NewSQL不能以非索引欄位作為查詢條件)。
根據選中的索引,構建查詢範圍,透過scan命令遍歷Index叢集,獲取符合條件的主鍵集合。下圖以一個SQL查詢,展示使用scan遍歷二級索引的例子:
根據主鍵,透過hgetall命令向Data叢集查詢符合條件的結果集。
將結果集構建成MySQL的結果返回給使用者。
▍Schema變更
新增索引,歷史資料不處理,增量資料立刻走索引構建流程。
透過歷史索引構建工具,掃描歷史資料,構建新索引的KV,將歷史資料完成索引構建。這裡有個最佳化點,掃描slave而不是master,避免對線上產生影響。
5.生態構建
一個單獨的儲存產品解決所有問題的時代早已經過去,資料孤島是沒有辦法很好服務業務的,Fusion-NewSQL從設計的那天起就考慮了和其他儲存系統的打通。
▍Fusion-NewSQL到其他儲存系統
▍Hive到Fusion-NewSQL
MySQL-client將寫請求發給DiseServer。
DiseServer將MySQL寫做解析,轉成hashmap將轉換後的資料以Redis協議發給Data叢集。
Data叢集的儲存節點收到資料,將資料寫到wal檔案。
Data叢集的儲存節點走Rocksdb的寫流程,這裡包括了寫memtable,還有可能memtable寫滿,發生flush以及觸發後臺的compact。
非同步執行緒消費wal,將資料構建MySQL-Binlog格式發到MQ。
非同步索引程式消費MySQL-Binlog,構建Index叢集需要的資料,向Index叢集傳送寫入請求。
Index叢集的儲存節點寫wal。
Index叢集的儲存節點進入Rocksdb的寫流程。
有這種Hive到Fusion-NewSQL資料匯入需求的使用者都需要開發一套相同邏輯的程式碼,維護成本高。
每條Hive資料都要經過較長鏈路,資料匯入耗時較長。
離線平臺的資料量大,吞吐高,直接大幅提升線上系統的QPS,對線上系統的穩定性有較大影響。
使用者填寫工單,選中將指定Hive表的某些欄位對映為Fusion-NewSQL表的欄位(這裡可以Hive中多個欄位組成一個Fusion-NewSQL欄位)。
Hadoop遍歷Hive表,並且透過Zookeeper獲取資料應該存放在Data叢集和Index叢集的路由資訊
透過上面的遍歷,計算,之後,將資料直接構建成、Rocksdb能識別的sst,並且其中存的資料已經是按DISE的表結構資訊組成的KV資料。
將sst檔案直接傳送到指定的儲存節點,儲存節點或透過Rocksdb提供的ingest功能,直接將sst檔案載入到Fusion-NewSQL中,使用者可以讀到。
▍透過Elastic Search實現複雜查詢
6.總結
7.後續工作
有限制的事物支援,比如讓業務規劃落在一個節點的資料可以支援單機跨行事務。
實時索引替代非同步索引,滿足即寫即讀。目前已經有一個寫穿+補償機制的方案,在沒有分散式事務的前提下滿足正常狀態的實時索引,異常情況下保證資料索引最終一致的方案。
更多的SQL協議和功能支援。
本文作者 ▬ 李 鑫 滴滴 | 資深軟體開發工程師 多年分散式儲存領域設計及開發經驗。曾參與Nosql/NewSQL資料庫Fusion,分散式時序資料庫sentry,NewSQL資料庫SDB等系統的設計開發工作。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69908606/viewspace-2659115/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 滴滴 NewSQL 演進之 Fusion 實踐SQL
- Python程式設計從0到1(實戰篇:提取Word表格儲存到Excel)Python程式設計Excel
- newsql新品TiDB之儲存SQLTiDB
- 大資料小視角1:從行儲存到RCFile大資料
- 實現分散式 kv—1 Standalone KV分散式
- 一種KV儲存的GC最佳化實踐GC
- 從NewSQL的角度看Apache ShardingSphereSQLApache
- 200 行程式碼實現基於 Paxos 的 KV 儲存行程
- html轉image 儲存到zipHTML
- Java 從指定URL下載檔案並儲存到指定目錄Java
- 一個全新的 kv 儲存引擎 — LotusDB儲存引擎
- rust 截圖儲存到檔案Rust
- 待儲存到百度網盤
- 推薦 Go 實戰專案—高效能 kv 資料庫 LotusDBGo資料庫
- 分散式kv儲存系統之Etcd叢集分散式
- 極光筆記|百億級KV儲存在極光的運維實踐之路筆記運維
- 透過spark將資料儲存到elasticsearchSparkElasticsearch
- 滴滴資料倉儲指標體系建設實踐指標
- 使用 JDAudioCrawler 將下載的音訊儲存到本地儲存音訊
- 小紅書自研KV儲存架構如何實現萬億量級儲存與跨雲多活架構
- 使用freemarker將echarts圖片儲存到word中Echarts
- Java 將PDF轉為HTML時儲存到流JavaHTML
- 原生JS實現base64圖片下載-圖片儲存到本地JS
- Typecho COS外掛實現網站靜態資源儲存到COS,降低本地儲存負載網站負載
- Nebula Graph 的 KV 儲存分離原理和效能測評
- 可靠的分散式KV儲存產品-ETCD-初見分散式
- 諮詢數學公式儲存到mysql中 非圖片形式儲存公式MySql
- RocketMQ實戰系列從理論到實戰MQ
- python+requests爬取B站影片儲存到本地Python
- 用 Go 語言造了一個全新的 kv 儲存引擎Go儲存引擎
- 位元組跳動極高可用 KV 儲存系統詳解
- Vue SpringBoot實現Html和Markdown格式內容(含圖片上傳)儲存到MySQLVueSpring BootHTMLMySql
- 加密技術的未來:從服務端密碼儲存到使用者資料加密方案加密服務端密碼
- 微信小程式(canvas)畫圖儲存到本地相簿(wepy)微信小程式Canvas
- 使用Java將圖片生成sequence file並儲存到HBaseJava
- 基於滴滴雲搭 SeaweedFS 儲存系統
- 在滴滴雲 DC2 雲伺服器上搭建 Codis 實戰伺服器
- 在滴滴雲 DC2 雲伺服器上搭建 MongoDB 實戰伺服器MongoDB