
為了更加充分利用機器資源,Meta 對 RocksDB 基于 Tectonic 分布式文件系統(tǒng)實現(xiàn)了存算分離改造。Tectonic 分布式文件系統(tǒng)提供了類似 HDFS 的文件系統(tǒng) API。
本文主要記述了 Meta 在實現(xiàn)存算分離過程中遇到的挑戰(zhàn)和響應(yīng)的解決方案。
挑戰(zhàn)
- 性能問題。網(wǎng)絡(luò)延遲帶來的性能下降
- 支持低成本冗余。分布式文件系統(tǒng)的數(shù)據(jù)冗余帶來了額外存儲開銷
- 多寫入者的完整性。多個節(jié)點同時讀取數(shù)據(jù),一個節(jié)點修改數(shù)據(jù)。在運行過程中,需要保證任意時刻都只能有一個節(jié)點可以修改數(shù)據(jù)
- 處理遠程 IO。相對于本地文件系統(tǒng),分布式文件系統(tǒng) IO 錯誤類型更多,處理方式也不相同
解決方案
性能優(yōu)化
IO 長尾延遲優(yōu)化
長尾延遲可能由慢節(jié)點造成。懷疑節(jié)點變慢時,通過其他節(jié)點處理負載。
- 動態(tài)提前重建 (Dynamic Eager Reconstructions)。在第一個讀請求發(fā)起后一段時間,發(fā)起第二個讀請求,使用最早返回的請求結(jié)果。
- 動態(tài)追加超時 (Dynamic Append Timeouts)。成功寫入大多數(shù)節(jié)點后響應(yīng)用戶寫入請求。寫入超時時,記錄當(dāng)前成功的寫入長度。重新發(fā)起寫入操作。
- 隔離的配額完全塊寫入 (Hedged Quorum Full Block Writes)。對于大寫入,創(chuàng)建完整的 block,并寫入數(shù)據(jù)。寫入分為兩個階段,permit acquisition 和 payload transfer。第一個階段,客戶端從資源池獲取存儲節(jié)點的寫入權(quán)限。第二個階段,客戶端從第一階段中獲取的存儲節(jié)點中,選擇最早響應(yīng)實際寫入的存儲節(jié)點。
Metadata Cache
由于部分元數(shù)據(jù)讀取的相關(guān)操作對延遲要求加高,如獲取目錄列表、判斷文件是否存在、查詢文件大小等。針對使用頻率非常高的 metadata 設(shè)計了對應(yīng)的 Metadata Cache 進行元數(shù)據(jù)緩存。
Local Flash Cache
對于重度讀的應(yīng)用場景,使用 Cachelib在 NVM 設(shè)備中實現(xiàn)了 block cache,作為現(xiàn)有基于 DRAM 的 block cache 擴展。這個特性的官方名稱是 SecondaryCache。
IO Handling
- 調(diào)大 compaction 緩存,充分利用 Tectonic 的大批量寫入友好的特性
- 改進預(yù)讀機制,通過歷史統(tǒng)計信息設(shè)置預(yù)讀大小。避免過大的預(yù)讀導(dǎo)致大量的網(wǎng)絡(luò)開銷,也避免過小的預(yù)讀導(dǎo)致性能下降
Parallel IO
對于需要讀取多個 key 的 MultiGet() 操作,同時并行發(fā)起多個 block read,降低讀取延遲,可能會導(dǎo)致更多的 CPU 消耗
- Compaction Tuning
Tectonic 支持的讀寫 IOPS 都更低,更大的 SST 文件可能會帶來更好的性能
Redundancy with low overhead
SST 文件
SST 文件消耗了絕大部分的存儲空間和寫入貸款,需要高可靠低成本的編碼方式。最終使用了 [12,8] 編碼方案,每個數(shù)據(jù)塊12個編碼單元,8個是數(shù)據(jù)塊,4個是校驗塊。1.5倍的空間和寫入帶寬開銷,帶來更好的 SLA 保障
WAL 文件
WAL 文件需要實現(xiàn)低延遲的持久化存儲。采用了 5-Way Replica 編碼,每個數(shù)據(jù)塊有5個副本。對于大更新量的場景,使用 Striped Encoding,多個節(jié)點并行處理 stripe
Data Integrity With Multiple Writers
IO Fencing 分布式鎖機制。每個進程擁有一個 token,在后續(xù)的目錄和文件操作中都使用該 token。字典序更大的 token更新,持有舊 token 的進程將無法對文件和目錄進行修改
Preparing RocksDB for remote calls
Differential IO Timeout
- flush、compaction 的超時時間為秒級
- Get、iterator 的超時時間為亞秒級
- 新增 request deadline 支持
Failure Handling in RocksDB
分布式存儲場景下,IO 錯誤發(fā)生更頻繁,種類更豐富。通過對錯誤是否是短暫且可恢復(fù)進行分類,對錯誤返回狀態(tài)進行了增強。在錯誤碼的基礎(chǔ)上,增加了是否可重試、影響范圍和是否有永久數(shù)據(jù)丟失等錯誤元信息。
IO Instrumentation
開發(fā) IO Trace 工具
Utilities
現(xiàn)有 cmd 工具的移植
性能測試


測試用例使用 20 字節(jié)長的 key 和 400 字節(jié)長的 value,共 10 億個 key,總數(shù)據(jù)量大小 200 GB。
寫入帶寬維度,Tectonic 在順序?qū)懮峡梢耘c本地存儲基本一致,在隨機寫上比本地存儲慢 25%。
讀性能維度,Tectonic 的 Get 延遲大致是本地存儲的 5 倍;在不開啟 Parallel IO 的場景下,Tectonic 的 MultiGet 和 iterator 延遲是本地存儲的 5 倍;在開啟 Parallel IO 的場景下,Tectonic 的 MultiGet 和 iterator 延遲是本地存儲的 3 倍。