Disaggregating RocksDB: A Production Experience

image.png

為了更加充分利用機器資源,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 消耗

  1. 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 工具的移植

性能測試

image.png

image.png

測試用例使用 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 倍。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容