Facebook開源分散式日誌儲存系統LogDevice
Facebookofollow,noindex" target="_blank">開源 了他們的內部分散式日誌儲存專案LogDevice。它通過複製、持久日誌儲存和故障恢復實現寫入高可用性。
Facebook的大多數需要記錄日誌應用程式都需要寫入高可用性、持久的日誌儲存以及在效能和延遲方面要求各不相同的工作負載。另一個非常重要的要求是能夠承受硬體故障。Facebook有一個叫作Scribe 的舊專案側重於將日誌聚合到集中式儲存中,但這種方案存在資料丟失的情況。Scribe現在使用LogDevice作為日誌儲存後端。
Facebook將LogDevice用在資料中心內部的流式處理管道、資料庫索引更新的釋出、機器學習管道、複製管道和持久任務佇列(每秒攝取超過1TB的資料)中。儘管Facebook已經構建了很多用於管理LogDevice叢集的開源工具,但還沒有將它們開源出來,除了一些基本的工具集。Shell.html" rel="nofollow,noindex" target="_blank">LDShell 工具可用於從命令列管理叢集,並且可以使用LDQuery 命令來檢視叢集統計資訊。
LogDevice使用“日誌記錄”抽象來劃分單個日誌事件,為每個記錄分配一個稱為日誌序列號(LSN)的唯一ID。LSN由“Sequencer”元件基於時間點生成,而時間點儲存在ZooKeeper中。LogDevice只能以追加的模式寫入記錄,也就是說,一旦寫入記錄就無法修改。與大多數日誌儲存系統一樣,LogDevice會“修剪”記錄,即基於時間或空間策略的日誌輪換。它還可以按需進行日誌修剪。除此之外,對日誌的儲存時間沒有限制。
LogDevice通過在不同的計算機節點上儲存每個日誌記錄的多個副本來實現高可用性,尤其是寫入高可用性 。每條記錄可以跨20-30個儲存節點複製。不過,如果某些具有某條日誌副本的計算機速度很慢或不可用,那麼該日誌寫入次數的增加會限制吞吐量。LogDevice可以自動檢測哪些節點已失效,並不再往這些節點寫入新記錄。它試圖通過儘可能多的複製盡減少硬體故障的影響,並儘可能快地“重建 ”丟失的副本。在重建過程中,“可以以每秒5-10GB的速率進行恢復”。LogDevice底層儲存基於RocksDB,它也是由Facebook開源 的一個鍵值儲存系統。
LogDevice團隊還必須應對其他挑戰,他們發現,LogDevice的使用者會執行回填(backfill),請求幾個小時或幾天內的舊資料。這些請求由使用LogDevice日誌的下游服務發出,當這些服務從故障中恢復並重新處理日誌時就會發生回填。LogDevice通過在“節點集”之間分攤讀取負載來應對這些讀取高峰。
LogDevice可以與Apache BookKeeper 和Apache Kafka等其他日誌儲存系統進行對比。其中與Kafka的主要區別 似乎是LogDevice將計算和儲存進行了分離,主要是為了應對Facebook規模的日誌。LogDevice是用C++開發的,並託管在GitHub 上。
檢視英文原文:Facebook Open Sources LogDevice - a Distributed Data Store for Log Storage