事務背景介紹(1):MongoDB

MongoDB中的一些最新特性(如多文檔ACID事務)需要對底層的WiredTiger存儲引擎中進行基礎性的增強。

事務背景介紹(1):MongoDB/WiredTiger中的底層時間戳

MongoDB中文社區,一個mongoers都會來的社區(微信公眾號:mongoing-mongoing)

在這個由六篇文章組成的系列中,我們將一起看一下在MongoDB中使得數據庫核心可以支持事務的一些變化。這些變化包括:

  • MongoDB/WiredTiger中的底層時間戳
  • MongoDB中的邏輯會話
  • 支持本地快照讀
  • 實現全局邏輯時鐘
  • 啟用安全從節點讀取
  • 增加可重試寫入特性

我們將逐項檢查這些特性,以回答這些問題:“添加了什麼功能?”、“為什麼這樣實現?”以及“從整體上說它對事務有什麼影響?”。

我們現在從MongoDB和WiredTiger的底層時間戳開始。

概述

MongoDB寫操作的時間戳現在作為一項附加的元數據出現在WiredTiger存儲層中。這使得MongoDB的時間和順序在概念上變為可查詢的,以便可以只檢索特定時間或之前的數據。它通過創建MongoDB快照,允許數據庫操作和事務可以從一個公共時間點開始工作。

背景

為了啟用副本集的複製特性,MongoDB會維護一個操作日誌,稱為oplog。oplog是服務層中的一個專用集合,它列出了應用於數據庫的最新操作。通過在從節點上重放這些操作,可以使副本保持最新狀態,從而與主節點保持一致。oplog中的操作順序對於確保副本正確反映主節點的內容至關重要。

MongoDB負責管理oplog的排序以及副本如何以正確的順序訪問oplog。使用WiredTiger這一的更強大的存儲引擎以及它底層的順序模型意味著充分利用WiredTiger的能力,這需要協調服務層和存儲層的兩個順序模型。

WiredTiger 存儲引擎

WiredTiger將所有數據存儲在一個包含鍵和值的樹狀結構中。作為MongoDB的存儲層時,該數據可能是一個文檔或某個索引的一部分,這兩者都存儲在WiredTiger的樹中。當對某個鍵的值進行更新時,WiredTiger將創建一個用於更新的結構。此結構包含有關事務、已更改的數據以及指向其後任何更改的指針的信息。然後,WiredTiger將其附加到原始值,之後的更新會將自己添加到前一個結構的末尾,隨著時間的推移創建一個不同版本值的鏈式結構。

事務背景介紹(1):MongoDB/WiredTiger中的底層時間戳

這就是WiredTiger所實現的多版本併發控制組件。WiredTiger有著自己用於讀取更新結構以獲取某個值“當前”狀態的規則。WiredTiger應用這些更新的順序與MongoDB的oplog順序並不相同。這個順序上的差異來源於WiredTiger會在可能的情況下將多個寫操作並行應用到從節點。由於主節點可以接受許多並行的寫入,因此從節點需要能夠達到相同的吞吐量,這就要讓其自己的複製寫入過程也是並行的。

事務背景介紹(1):MongoDB/WiredTiger中的底層時間戳

時間戳

為了在WiredTiger存儲引擎中保留MongoDB的順序,我們在更新結構上擴展出了一個“timestamp”字段。此字段的值由MongoDB傳遞到WiredTiger層,並被WiredTiger視為一個重要的元信息。當使用WiredTiger進行查詢時,可以指定一個時間戳以獲取那個特定時刻數據的確切狀態。這提供了一種在MongoDB順序和WiredTiger順序之間進行映射的方法。

從節點讀取

當一個從節點從主節點同步時,它通過從oplog中讀取一批更新來進行同步。然後,它嘗試將這些更改應用到自己的存儲中。如果沒有時間戳,那麼直到完成一批更新,應用操作的過程將阻塞讀取查詢,以確保用戶不會看到無序的寫入。有個這個時間戳,現在可以使用從當前批次開始的時間戳繼續提供讀取查詢服務,該時間戳將確保對查詢提供一致性的響應。這意味著

從節點讀取

現在不會被複制更新中斷。

複製回滾

當MongoDB集群中的多個從節點通過複製進行更新時,它們會處於與主節點同步的不同階段。這意味著我們會有“多數提交點(majority commit point)”這一概念:即大多數從節點已經達到的時間點。當主節點發生故障時,所有節點上都保證只有達到該多數提交點的數據是可用的。而通過基於RAFT的共識協議,其中一個從節點會被選舉為新的主節點,這就是從節點的工作方式。

事務背景介紹(1):MongoDB/WiredTiger中的底層時間戳

當之前的主節點回到集群時,將該節點與集群的其餘部分同步的過程非常複雜。因為它可能擁有一些公共點之外的數據,它必須找出它所做的那些集群並不知道的更改,並獲取到它所更改的記錄的舊版本。

引入時間戳之後可以從根本上簡化這一過程。通過獲取多數提交點的時間戳並將其應用於原主節點的存儲層,而在該時間戳之後發生的更改可以刪除。完成後,這個節點就可以重新加入集群並開始從主節點進行復制了。

事務背景介紹(1):MongoDB/WiredTiger中的底層時間戳

時間戳和事務

通過將時間戳信息推送到WiredTiger的樹結構中,可以使用WiredTiger的多版本併發控制來減少鎖操作並簡化重新同步的過程。快照時間點的能力還使服務器能夠回滾到該時間點,這是多文檔ACID事務正確性保證的基礎。

在本系列的下一篇文章中,我們將介紹MongoDB中的邏輯會話(Logical Sessions)以及它們如何使事務成為可能。

本文譯自:

Transactions Background Part 1: Low-level timestamps in MongoDB/WiredTiger


分享到:


相關文章: