擴展你的復制集:MongoDB 4.0中從節點的非阻塞讀操作

MongoDB 4.0增加瞭一個能力,在副本處理寫操作的同時可以從從節點(secondary)讀取數據。為瞭理解這個的重要性,讓我們看看4.0版本之前從節點是如何處理的。

背景

從一開始,MongoDB就是這樣設計的:當主節點上有一系列的寫入操作時,每個從節點必須以相同的順序體現出這些操作。如果你在一個文檔中更改瞭字段“A”,然後更改瞭字段“B”,則不可能看到此文檔字段“B”被更改而字段“A”未被更改的狀態。你可能會在最終一致性系統內看到這種現象,但在MongoDB中不會。

在從節點上,我們會分批應用寫操作,因為按順序應用這些寫操作可能會導致從節點落後於主節點。當批量應用寫操作時,我們必須阻塞讀操作,使應用進程不會看到以“錯誤”順序應用的數據。這就是為什麼從從節點讀取數據時,必須定期等待副本批量數據的應用。寫負載越重,從節點越可能在讀取時遇到這種“暫停”現象,從而增加系統延遲。考慮到應用進程經常使用從節點讀取來降低查詢的延遲(比如當它們使用 “nearest”的readPreference 時),而這種對應用副本批量數據的等待會阻礙你的這一目的。

除瞭讀操作必須等待副本批量數據寫入完成外,寫操作也需要一個鎖,獲取該鎖要求所有讀操作必須全部完成。這意味著,在存在大量讀操作的情況下,副本數據的寫入可能會出現滯後——當鏈式復制(chain replication)被啟用時,這個問題會相當復雜。

MongoDB 4.0的目標是什麼?

我們的目標是允許在oplog被應用期間進行數據的讀取,以減少讀取延遲及從節點滯後,同時增加復制集的最大吞吐量。對於具有高寫入負載的復制集,不必在應用批量的oplog之間等待數據讀取,可以降低延遲並更快地對大多數寫入(majority writes)進行確認,從而減少主服務器上的緩存壓力,提高總體性能。

我們是如何實現的?

從MongoDB 4.0開始,我們利用瞭這樣一個事實:我們在存儲引擎中實現瞭對時間戳的支持,這允許事務在特定的“集群時間(cluster time)”獲得一致的數據視圖。有關詳細信息,請參閱視頻: WiredTiger時間戳 。

擴展你的復制集:MongoDB 4.0中從節點的非阻塞讀操作
擴展你的復制集:MongoDB 4.0中從節點的非阻塞讀操作

對從節點的讀取操作現在同樣可以利用快照,方法是從在應用當前的批量副本數據之前的最新的一致性快照中讀取數據。從該快照讀取可以確保數據的一致性視圖,而且由於應用當前的批量副本數據不會更改這些早期記錄,因此我們現在可以不再使用鎖,而允許在寫入發生的同時進行所有這些對從節點的讀取。

區別有多大?

區別非常大!吞吐量的性能改進范圍可以從無(如果你沒有受到復制鎖的影響,說明寫負載相對較低)到兩倍。

擴展你的復制集:MongoDB 4.0中從節點的非阻塞讀操作
擴展你的復制集:MongoDB 4.0中從節點的非阻塞讀操作

最重要的是,這改善瞭從節點讀取的延遲——對於那些使用readPreference為“nearest”的人來說,因為他們希望減少從應用進程到數據庫的延遲——這一特性意味著他們在數據庫中的延遲也將顯著降低。在測試中我們發現95和99百分位的延遲有顯著改善。

線程數 8 16 32 64
特性關閉 1 2 3 5
特性開啟 0 1 1 0

95百分位讀取延遲 (ms)

你知道這個新特性最好的地方在哪嗎?你不需要做任何事情來激活或選擇它。4.0版本中的所有對從節點的讀取都將來自快照,無需等待副本數據寫入完成。

這隻是MongoDB 4.0的許多新功能之一。請關註我們 博客中關於4.0RC版本的內容 以瞭解更多信息。最後別忘瞭,你仍然來得及 註冊MongoDB World大會 (譯者註:現在是來不及瞭,這是18年的鏈接,等19年的吧),在那裡你可以與正在構建這些優秀新特性的工程師會面。

翻譯自: Scaling Your Replica Set: Non-Blocking Secondary Reads in MongoDB 4.0

Via www.mongoing.com

Ref. https://docs.mongodb.com/manual/reference/read-preference/?_ga=2.227580573.1235419805.1548767053-1197570158.1502203710#nearest, https://www.mongodb.com/presentations/wiredtiger-timestamps-enforcing-correctness-in-operation-ordering-across-the-distributed-storage-layer, https://www.mongodb.com/blog/post/mongodb-40-release-candidate-0-has-landed, https://www.mongodb.com/world18, https://www.mongodb.com/blog/post/secondary-reads-mongodb-40, https://union-click.jd.com/jdc?d=ZKPlW2

推薦閱讀:

Spread the love

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *