滴滴分佈式NoSQL數據庫Fusion的演進之路

  作者 | 餘汶龍

  編輯 | 薛樑

  Fusion 是滴滴自研的分佈式 NoSQL 數據庫,完全兼容 Redis 協議,支持超大規模數據持久化和高性能讀寫。在滴滴內部支撐了數百個業務,具有 PB 級別的數據存儲量,是使用最廣泛的主存儲服務之一。在支持滴滴業務高速發展過程中,積累了很多分佈式存儲領域的經驗,孵化了離線到在線的高速數據導入方案、NewSQL 方案、跨機房同步等,一路解決了 Redis 容量限制、 離線數據在線打通、數據庫擴展性差、異地多活容災等問題。

  本文來自滴滴的技術專家、Fusion 的負責人餘汶龍在 2018 年北京 ArchSummit 全球架構師峯會上的演講內容,重點介紹了 Fusion 的核心設計以及架構演進過程。

  爲了講清楚滴滴自研存儲 Fusion 的演進過程,本文將分成 3 個部分:

  誕生背景:滴滴業務發展簡介

  演進過程:如何滿足業務需求

  海量存儲

  FastLoad

  NewSQL

  跨機房多活

  總結 & 展望

  誕生背景

  業務 & 架構演進過程

  滴滴公司成立於 2012 年,剛開始創業階段技術主要靠外包解決,沒太多技術沉澱;發展到了 2014 年,乘客司機和單量都有不錯的增長,我們開始構建自己的系統架構,這個時候業務對於存儲的需求很單純,簡單用用 MySQL 基本能解決我們的問題;到了 2015 年前後,我們的業務線多了起來,專車快車等開始上線,這個時候我們一方面做了中臺系統的重構,另一方面感受到了不小的存儲壓力,即業務數據量和請求量劇增;到了 2016 年,合併優步前後,日訂單量逼近 2000 萬,進一步挑戰我們的存儲系統,於是我們按照不同的業務,對存儲進行拆分,因爲不同的業務對於存儲的需求是不一樣的,不同的業務對於吞吐、延遲、容量、數據請求大小等都有不同的需求,分庫分表也只是緩兵之計。

  如何有效應對這些個性化需求呢?於是在這個時候,我們就開始孵化滴滴自己的 NoSQL 數據庫 Fusion 了,用它來豐富我們滴滴的存儲生態,爲業務提供更多的存儲選擇。

  Fusion 是什麼?

  前面我們不斷提到 Fusion 的關鍵字,那麼是時候正式介紹下 Fusion。Fusion 是一個兼容 Redis 協議的分佈式 NoSQL 數據庫。定位介於 Redis 與 MySQL 之間的主存儲數據庫。怎麼理解這個定位呢?也就是性能方面我們向 Redis 看齊,即低延遲;持久化能力方面我們向 MySQL 看齊,即 MySQL 具備的多副本、高可用、ACID 事務,我們都是支持的,同時定位爲服務打車訂單這樣的主流程在線業務。

  它如何實現的呢?大家都知道 Redis 的數據是存放於內存中,雖然性能很好,但是容量極小,且每 GB 存儲成本很高(大概是我們 Fusion 的 10 倍以上)。於是我們就基於 SSD 磁盤實現了一套分佈式的存儲系統,在 SSD 磁盤上實現了 Redis 的數據結構,對外通過 proxy 屏蔽內部細節,讓用戶像訪問 Redis 一樣訪問 Fusion。當前我們已經支持 String\Hash\Bitmap\Set\Sorted Set\List 這些主流的 Redis 數據結構。

  演進過程

  我們 Fusion 的發展總共經歷了 4 個階段,分別解決了 4 類業務問題,我們接下來重點看下具體過程。

  海量存儲

  首先來看如何解決海量存儲的問題。

  Redis 是一款非常優秀的內存數據庫,但它也有這樣一些已知問題存在:容量受限於內存、擴容遷移和大 key 過期、刪除過程是阻塞的、宕機恢復慢等問題。我們 Fusion 設計之初,就避免了這些問題。具體是如何實現的呢?我們從需求分析出發。

  需求分析

  Fusion 誕生初期,主要解決 2 個業務需求:

  一是滴滴的歷史訂單,按照前面提到的每日千萬級別訂單量,很快就能達到幾百億的訂單,這麼龐大的數據量,存 MySQL 顯然是不夠靈活的,修改字段、修改索引都比較困難,存 Redis 就更加不可能,因此他們有新型存儲的需求;

  二是地圖團隊的司機行程軌跡,每產生一條打車訂單就會產生一條司機行程軌跡,每一條行程軌跡由多個點組成,行程越長軌跡數據越大,這是一個比歷史訂單的數據量還要大的業務,存儲的困難可想而知。

  因此,我們對上述兩個業務的需求做了提煉和優先級排定:

  剛需是海量存儲。

  具備基本的在線故障處理能力。

  穩定性很重要!

  性能要足夠好,以司機行程軌跡爲例,每天 300 億級別寫入,他們對性能的追求當然是越高越好。

  接入要求簡單,這裏我們選擇了 Redis 協議。

  打通其他存儲系統。

  滿足了這些需求後,就誕生了存儲系統 Fusion 的雛形。

  架構設計

  軟件結構

  下圖左邊是數據流部分,從下往上看,即 Fusion 是構建在 SSD 磁盤上的存儲服務,我們引用優秀的存儲引擎 RocksDB 來做磁盤 IO 操作,然後在磁盤之上,我們增加一層 cache 來提升性能,然後封裝一層網絡框架並支持 Redis RPC,就實現了單機版本的 Fusion 存儲節點,然後在單機的基礎上加上我們的集羣路由管理,Fusion 的集羣就搭建好了,當然對外提供服務的時候,還有一層負載均衡。

  下圖右邊是控制流部分,即我們在 SaltStack 平臺基礎上,構建了用戶系統、運維繫統、統計、監控、計費等系統,方便用戶以及運維人員使用。

  集羣架構

  集羣架構上,我們採用 hash 分片的方式來做數據 sharding。從上往下看,用戶通過 Redis 協議的客戶端(jedis、redigo、hiredis 等)就可以訪問 Fusion,首先會經過 VIP 做負載均衡,然後轉發到具體 proxy,再由 proxy 轉發數據到後端 Fusion 的數據節點。proxy 到後端數據節點的轉發,是根據請求的 key 計算 hash 值,然後對 slot 分片數取餘,得到一個固定的 slotid,每個 slotid 會固定的映射到一個存儲節點,以此解決數據路由問題。

  此外,我們還做了存儲生態的打通。支持 Hadoop、MySQL、Redis 的數據同步到 Fusion,也支持 Fusion 數據同步到 MQ,供下游消費。

  小結

  接下來就對 Fusion 做個小結,拿 Redis 來做個簡單對比。

  FastLoad

  我們演進過程中,解決的第二個問題是,離線數據到在線系統的快速打通。因此我們做了一個叫 FastLoad 的系統。

  大連哪家×××醫院好 http://www.bhnkyy.net/

  大連割包皮需要多少錢 http://www.62671288.net/

  價格費用多少錢 http://www.xasgnk.cn/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章