Ozone BlockCommitSequenceId在Container上的運用

前言


在Ozone中,Container以Pipeline節點組織的方式通過StateMachine的形式進行狀態一致性的更新。不過這裏面對可能存在的一些邊緣情況,例如Pipeline節點的突然重啓,Container目錄的意外刪除,我們需要有別的手段來表明Container當前所處於的最新狀態。以此我們可以知道一個Container存儲於Pipeline節點上的副本間的狀態是否是一致的,是否包含一致的Block數據等等。爲此,社區在Container中引入了一個自增型的transactionId,表明當前Container的最新的狀態。本文筆者來聊聊這個自增型transaction ID在Ozone Container中的實現和運用。

Ozone Container自增型TransactionId:BlockCommitSequenceId


這裏筆者要首先介紹介紹Ozone Container自增型Id的由來了。在Ozone中,Container是面向外部提供Block數據存儲的單元,其內部會接受來自於外部Block的數據讀寫請求。簡單來說,一個Container在其空間還有富餘的情況下,會有外部源源不斷的Block的數據寫入。鑑於同一Container不同副本所在機器可能存在的通信,網絡的延時,會存在數據寫入快慢的問題,因此Container在同一時間所處於的最新“數據狀態”會有所不同。如果我們把每一次操作當作一個Transaction的話,執行了最新Transaction的Container會有最新的“數據狀態”。不過,最終這些Container的副本會執行完寫入的Transaction操作,然後達到最終一致的“數據狀態”。

那麼問題來了,在Ozone中,我們如何實現這樣的TransactionId呢?它需要保證每個操作Id在Pipeline節點的Container內是具有唯一性的。在Ozone中,Datanode是通過Apache Ratis+ContainerStateMachine的方式實現了Container操作一致性的控制,而ContainerStateMachine本身是會apply來自於Raft server的Raft log,我們可以充分利用Raft log id作爲Container的Transaction更新Id。這樣的話,我們也無須另外生成專屬於Container的TransactionId。在這裏,Ozone將這個TransactionId稱爲BlockCommitSequenceId,意爲每次Block數據寫完提交後的Id。

BlockCommitSequenceId遵循以下的原則:

同一Container的多個副本的最終BlockCommitSequenceId是一致的,意爲最終Container“數據狀態”的一致性。如果有小於Container當前最新的BlockCommitSequenceId的id transaction在寫入的時候,說明此Block數據之前已經被寫入過了,可以忽略此寫入操作。

BCSID(BlockCommitSequenceId的簡稱)除了在Container層面進行了更新外,還會被記錄在每次的Block數據中,以Id的屬性形式保存在Block信息中。

此過程轉化圖如下所示:
在這裏插入圖片描述
上圖顯示BCSID除了在Container上會維護一個最新的值外,每次的寫入的Block數據中也會帶有一個相應的BCSID。

BlockCommitSequenceId的使用用途


BCSID是被記錄並更新在了Container中了,那麼它有哪些額外的使用用途呢?

根據BCSID在Ozone內的使用場景,它至少有以下用途:

  • 判斷Container副本間的數據狀態是否是一致的。比如在做Container replication操作的時候,檢查現有Container副本狀態的BCSID和SCM中心管理服務所維護的BCSID是否一致,如果不一致,則不進行Container Replication操作。如果一致,進行Container的closed操作,並進行後續Replication操作。
  • 判斷Datanode本地Container狀態數據是否發生更改。如果Container狀態在Datanode重啓前後發生數據變更,它的BCSID會發生變化,倘若在重啓前記錄當前的BCSID的值,在重啓後,發現它加載的BCSID值不同,則說明數據發生了變化。以此表明此Container的數據已發生變更,爲不健康的狀態。

引用


[1].https://issues.apache.org/jira/browse/HDDS-1843
[2].https://issues.apache.org/jira/browse/HDDS-935
[3].https://issues.apache.org/jira/browse/HDDS-603

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章