推ter是如何構建高性能分布式日志的
在推ter,他們使用復制日志來解決分布式系統中存在的一系列問題。比如,他們有一個Manhattan分布式鍵值數據庫。該系統采用了一種靈活的最終一致性數據模型,允許開發者以一致性換取低延遲。寫入操作會單獨應用到數據集的所有副本,Manhattan會保證各個副本的數據最終一致。但是,應用程序在查詢一個剛剛更新過的數據集時可能會因為讀取的副本不同而獲取到不同的數據。為了防止這種不一致的情況,他們必須針對每個副本以同樣的順序應用所有更新。日志(一個嚴格有序的操作記錄)是實現序列化更新的一種簡單方式。在推ter,還有其它有類似情況的應用程序需要某種日志服務基礎設施。于是,他們構建了DistributedLog,一個高性能的“復制日志(replicated log)”服務。近日,推ter消息團隊高級軟件工程師Leigh Stewart撰文分享了他們構建該服務的經驗。
他們根據自己構建分布式系統的經驗,對復制日志服務提出了如下要求:
- 可靠性:穩定,而且在出現各種常見問題(網絡劃分、集群拓撲變化、流量峰值等)時都能提供可以預見的性能;
- 高吞吐量:在高峰時段可以支持每秒數以百萬計的消息傳遞;
- 低延遲:始終如一的低延遲;
- 工作負載隔離:在一個以日志為中心的分布式系統中,工作負載可以分為如下三類:寫日志尾、讀日志尾和“追趕讀(catch-up read)”。各類負載互不影響;
- 可擴展性:在地理、節點數量、每秒請求數、數據規模、租戶數量等各個維度可擴展; </ul>
- 可操作性:在擴展時易于操作,比如可以很容易地增加或移除節點;
- 簡單:接口簡單,便于開發人員使用。 </ul>
- 靈活的復制功能:BookKeeper采用了一種基于投票的復制機制。該機制直接由客戶端驅動,可以避免引入主次復制方案中存在的延遲,使他們可以屏蔽數據庫故障或速度慢的問題,實現可預見的延遲。此外,BookKeeper復制設置高度可配置,并支持可插拔的“副本放置(replica placement)”策略。
- 卓越的I/O性能:BookKeeper節點使用不同的I/O組件處理上述三種核心日志存儲負載,提供了卓越的I/O性能。 </ul>
- 面向流的抽象:DistributedLog只暴露了一些簡單的實體,在大多數情況下,用戶都只需考慮將數據附加到一個已命名的流對象上;
- 命名和元數據:DistributedLog提供了一種永久命名和元數據方案,用戶可以將已命名的日志或主題視為Ledgers集合的替代;
- 日志歸屬方案:BookKeeper沒有規定一種專門的日志所有者方案,因此,DistributedLog實現了一種基于ZooKeeper的方案;
- 數據管理策略:DistributedLog允許用戶針對不同的場景調整數據保留策略,并提供了一種將日志分段以便在存儲節點間平衡數據分布的控制機制;
- 可調節的讀寫通道:在寫入路徑上,DistributedLog提供了一種高度可調節的批處理機制;在讀取路徑上,它提供了一種可調節的預讀機制;
- 高效“扇入(fan-in)”和“扇出(fan-out)”的服務層:DistributedLog是一個專門針對多租戶數據中心環境優化過的服務層,可以通過聚合來自多個數據源的寫入來支持不關注日志歸屬的應用程序。在有成千上萬的讀者消費同一數據流的情況下,該服務可以通過緩存日志數據優化讀取路徑;
- 跨地理位置復制日志:可以保證日志跨多個數據中心可用; </ul>
為了滿足上述需求,他們評估了幾種可選方案,其中包括:(一)使用類似Kafka的發布/訂閱系統;(二)使用類似Paxos或Raft的一致性算法構建新的服務或庫;(三)使用一種像Apache BookKeeper那樣的底層日志服務。對于Kafka,他們對其I/O模型心存疑慮,并認為它缺乏強有力的穩定性保證;Paxos和Raft頗具吸引力,但從頭構建一個新系統需要一個很長的開發周期。于是,選項僅剩了Apache BookKeeper。這個最初為HDFS設計的事務日志后臺唯一關注的是存儲效率和日志段(稱為Ledger)檢索。另外,不同于Kafka,它并不關注發布/訂閱系統中的一些高級特性,如“分區歸屬(partition ownership)”、面向流的抽象等。以下是Apache BookKeeper的核心優勢:
因此,他們認定,BookKeeper是一個日志存儲的上佳選擇。不過,它雖然滿足了上面列出的大部分關鍵需求,但是還缺少一些關鍵的特性,比如高級抽象、日志歸屬等。為此,他們在BookKeeper之上構建了一個服務層DistributedLog,提供一種可以滿足上述需求的、端到端的服務,如下圖所示:
BookKeeper提供穩定性和高可用的日志段存儲;DistributedLog提供簡單的抽象,如命名、數據分割、保留策略等;應用程序層負責分區、路由、偏移量管理等高級特性。其中,DistributedLog具有如下特性:
在過去的兩年里,DistributedLog解決了許多分布式系統中頗具挑戰性的問題,其本身也在發展。事實證明,基于 DistributedLog的一致性寫入路徑非常可靠,而且性能令人稱贊。將DistributedLog引入Manhattan的寫入路徑平均僅僅增加了10毫秒的寫入延遲。
來自:http://www.infoq.com/cn/news/2015/09/BookKeeper-推ter