Ozone SCM HA設計淺談

前言


在前面的文章中,筆者寫過關於Ozone OM HA實現的相關文章(Ozone OM服務HA原理分析),裏面談論了目前OM HA的一些實現細節以及OM HA如何搭建這類的說明性文章。但是一套完整,高可用的系統,它需要確保其服務整體的健壯性,目前Ozone依賴的SCM服務還沒有實現HA,是一個單點的服務。Ozone社區在實現了OM HA之後,已經在設計考慮實現SCM的HA方案(相關JIRA:HDDS-2823),以此能夠達到一個穩定可使用的Ozone發佈版本。本文筆者根據目前社區JIRA上對SCM HA的部分設計要點,來聊聊關於Ozone SCM服務的HA,我們有哪些主要設計要點以及其與OM HA的不同之處。

SCM HA相較於OM HA的區別點


這裏SCM是StorageContainerManager名稱的簡寫,而OM是OzoneManager的簡稱。在Ozone服務中,SCM是底層提供存儲能力的基礎服務,OM則是其上的應用服務。對於OM這樣的應用服務,它在實現HA時重要考慮的點在於Leader/Follower服務節點上db元數據狀態的一致。瞭解Ozone OM的同學應該清楚,OM的元數據不是類似HDFS NameNode的純內存的維護,而是用外部K-V db庫做存儲的,而這個db是以文件形式持久化在本地的。因此OM HA在實現中只要做到這個外部db的數據同步更新,基本上就算完成OM HA的核心操作了。

SCM HA服務內存狀態數據一致性的控制

但是SCM HA如果要去實現的話,它需要考慮的東西就要複雜很多了。首先它同樣有類似OM db這樣的元數據需要去同步,在SCM中這類的數據有Container,Pipeline數據。另外SCM在內存中還維護着Container,Pipeline的狀態數據,它們的狀態數據是根據下面Datanode實時彙報上來進行更新的。這類狀態數據實質上不會更新在db文件裏去,因此在SCM HA的實現中,內存狀態數據的一致性同樣是一個需要關注和考慮的點。

對於SCM HA的內存狀態一致性控制,筆者個人的傾向是同樣利用Apache Ratis做內存狀態的控制,要定義相應內存狀態更新的StateMachine來做。OM HA目前實行有db transaction更新的StateMachine實現了,SCM HA的db更新可借鑑於此。

Follower SCM內部管理服務的“失效”處理


Ozone SCM內部包含許多管理服務類進行着Node,Container以及Pipeline的管理,此類服務在後面的Follower SCM內都應該"失效化",另外一種解釋可以稱之爲“空跑”,不做任何實質的處理操作。我們只允許Leader SCM服務做請求操作處理,並同步replicate它的狀態改變到Follower SCM上,這個狀態改變包括

  • db transaction
  • 內存維護狀態的update

這裏提到的管理服務包括有以下幾類:

  • ReplicationManager,以及類似此Manager類。
  • ReportHandler,以及類似此Handler類。

當然這裏有人可能會說了,爲什麼我們不能維持Follower SCM中ReportHandler的功能,來做Container,Pipeline內存狀態的更新呢?類似於HDFS NameNode那樣呢?這裏實質上有Container report信息到SCM服務的latency考量,以及此狀態延時可能造成的後續問題還需要進一步地實現討論。因此纔有了前面小節提到的做到SCM服務間內存狀態的完全一致性同步方案考慮。

SCM HA failover行爲處理


SCM服務從單點模式變爲HA模式,SCM服務本身Leader選舉切換理應對其Client端(這裏目前指的就是OM服務)來講是透明的。SCM的做法和現有OM HA類似,Follower角色服務拋出異常並且附帶當前的Leader角色的SCM地址id,然後Client進行返回結果SCM id的retry。

SCM HA的整體架構圖

以下是社區SCM HA設計文檔中 SCM HA的整體架構設計圖:、
在這裏插入圖片描述
本文所闡述的SCM HA可詳見下面的文檔鏈接處。

引用


[1].https://issues.apache.org/jira/browse/HDDS-2823

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