CynosDB技術詳解——存儲集羣管理

本文由騰訊雲數據庫發表

前言

CynosDB是架構在CynosFS之上的分佈式關係數據庫系統,爲最大化利用存儲資源,平衡資源之間的競爭,檢查資源使用情況,需要一套高效穩定的分佈式集羣管理系統(SCM: Storage Cluster Manager),SCM使用Etcd作爲存儲,利用Etcd Raft算法完成SCM Leader的選舉,對外提供HTTP API 查詢CynosFS 狀態,負責CynosFS調度,其包含兩類調度:

lPool調度:對SCM 中所有Pool進行調度,每個Pool的調度將根據其狀態,產生相關調度操作,包括Pool的初始化,Pool自動擴縮容,以及Pool的銷燬等。

lSegment Group調度: 每個Pool內有一個SG調度器,負責該Pool內所有SG的調度,根據每個SG的狀態,產生相關的調度操作,包括增減副本,Leader切換,副本遷移,副本離線等。

img

相關組件和名詞解釋如下:

lDBEngine:數據庫引擎,支持一主多從。

lDB Cluster Manager(DCM):數據庫集羣管理,其負責一主多從DB集羣的HA管理。

lStorage ServiceStorage Node(SN):Storage Service是個邏輯概念,泛指實際提供服務的Storage Node。SN則是1個具體的服務進程,負責日誌的處理、BLOCK數據的異步回放、讀請求的多版本支持等,同時還負責將WALLOG備份到Cold Backup Storage。

lSegment(Seg):Storage Service管理數據塊BLOCK和日誌的最小單元(大小爲10GB),也是數據複製的實體。通過一致性協議(Raft)進行同步,形成Segment Group(SG)

lPool:多個SG從邏輯上構成一個連續的存儲數據BLOCK的塊設備,供上層的Distributed File System分配使用。Pool和Seg Group是一對多的關係。

lStorage Cluster Manager(SCM):負責管理Storage Service,維護Pool和SG的對應關係,以及Segment Group內部成員的調度。

數據模型

SCM數據模型包含4類信息:API信息,系統信息,調度信息,存儲服務信息

lAPI信息(API Info):SCM對外提供服務的接口,包括SCM自身運行情況,Pool信息,以及Storage Service信息等,提供RESTFul風格的接口(管理類接口)和GRPC接口(數據交互類)。

l系統信息(System Info):SCM自身運行的全局配置信息,以及多個SCM主從Member信息,此外還包括外部系統訪問的地址ClientUrls和Member之間的訪問地址PeerUrls等信息。

l調度信息(Schedule Info):SCM內部調度的作業信息和狀態信息,包括Pool和SG的調度信息,以及相關調度產生的任務,這些任務將會通過心跳下發給Storage Service。

l存儲服務(Store Info):SCM保存的Storage Service信息、調度的狀態信息、Storage Service上報的統計信息以及內部作業定期計算產生的統計信息等,主要包括Pool信息,Storage Service元數據及Storage Service運行時統計信息,以及SG相關信息。

img

I/O模型

SCM Master主要與如下模塊進行交互:

lStorage Service:進行資源調度,接收心跳,下發命令等交互

lDistributed File System:爲其提供對應Pool和pool下所屬SG的信息,以幫助其完成讀寫請求的正確路由

lDCM:爲其提供包括創建Pool,查看Pool信息,以及SG調度情況等接口。

lSCM Slave:通過Etcd同步SCM的數據,包括調度信息和資源信息等,維護高可用性的心跳信息。

img

對上圖的詳細說明:

1.SN註冊到SCM,SN的物理佈局信息通過標籤組labels(每個標籤label採用key-value鍵值對錶示)進行定義,標籤名依次是Region->Zone->Rack->Host,標籤值是具體部署的物理信息,如北京->北京一區->rack_01->host_01。一個SN負責處理一個SSD設備上的數據讀寫。

2.DCM開始創建Pool,SCM接收到創建操作後,保存該Pool的元數據信息到Etcd上,然後把該Pool加入到內部調度隊列。

3.Pool調度器:定期從調度隊列上獲取各個Pool來調度,調度包括Pool的初始化(分配第一個SG),根據Pool狀態及使用情況進行擴縮容,以及Pool的銷燬。

4.SG調度器:每個Pool下對應一個SG調度器,負責該Pool內所有SG的調度,包括SG的初始化,增減副本,SG內leader切換,遷移等,通過裝箱算法選擇最佳Storage Node作爲該SG的成員以及整個存儲資源的調度。

5.Distributed File System會定期同步SG的使用情況,Pool信息到SCM,並從SCM獲取該Pool的所有SG信息以及SG的變更情況(如SG內leader切換)。

調度原理

通過SCM發送心跳信息來驅動的,包括Store Node(SN)心跳和Segment Group(SG)心跳,心跳消息採用Protobuf V3定義,GRPC進行交互,由SN發起,SCM負責接收,接收到心跳信息後,將根據SN運行情況產生相關的調度命令,並通過心跳響應信息下發給SN,SN接收命令,並執行命令,然後更新相應的狀態信息,通過下一次心跳發送給SCM。

Pool調度

Pool調度將對SCM所有Pool進行調度,每隔5秒輪詢一次所有的Pool,檢查是否有新的Pool加入,檢測每個Pool的狀態,根據Pool狀態進行調度,如初始化,擴縮容和銷燬等。

img

Pool狀態包括:UNINITIALIZE,NORMAL,DISABLE,DELETE,其調度狀態包括:INITIATING,EXPANDING,EXPANDED,IDLE。Pool調度狀態變更如下:

img

擴容過程如下:

1.當前Pool存在SG0,新增SG1並對SG1進行初始化。

2.當Pool調度器檢查到Pool需擴容時,更新其狀態爲EXPANDING,並持久化該Pool信息,然後添加一個SG的元數據到Pool的SG內部調度隊列中,並持久化到Etcd中,SG的ID從0開始編號,依次遞增,保持連續性,避免產生空洞,採用一次擴展一個SG的方式,完成後更新其狀態爲EXPANDED。

3.該Pool的SG調度器進行調度,檢測到有新SG,對該SG進行初始化,補充副本。

4.當Pool調度器檢查到該Pool的狀態爲EXPANDED,判斷該新的SG是否創建完成(補充完所有副本),如創建完成則更新Pool的調度狀態爲IDLE,否則忽略本次調度。

img

調度狀態需進行持久化,當SCM發生主從切換時,能恢復到崩潰時的調度狀態。

Pool縮容是擴容的逆過程,從id最大的SG開始往0方向收縮,以免產生空洞,具體的操作由SG調度器執行每個SG回收。

Pool釋放是對該Pool的所有SG進行釋放,回收將從從id最大的SG開始回收,回收過程將通過心跳信息下發指令給SN,具體的操作由SG調度器執行每個SG的回收。

SG調度

CynosDB每個Pool都對應一個SG調度器,每個調度器按1秒輪詢一次該Pool內的所有SG,每個Segment Group之間是相互隔離的,其調度不受影響,調度主要通過SN的心跳和SG心跳完成的,調度包括segment的添加,刪除,切主等。

img

SG狀態包括:UNINITIALIZE,NORMAL,DISABLE。

Segment調度狀態包括:UNINITIALIZE,INITIATING,ALLOCATING,ALLOCATED,BOOTSTRAPPING,ADDING,ADDED,REMOVING,RELEASING,調度狀態如下:

img

SN心跳:SCM接收store的統計信息,然後下發Segment操作(分配和銷燬Segment)和SG操作(啓動和銷燬Segment Group)給Store,然後Store執行操作,而Store操作的結果通過GRPC API彙報給元數據。如分配一個Segment給某個Pool的SG過程:

1.保存Segment的元數據信息到KV系統中。

2.接收到Store的心跳信息。

3.下發分配Segment信息。

4.接收到分配Segment信息,進行本地操作,操作完成後直接通過grpc彙報分配結果給元數據。

img

SG心跳:SCM獲取SG的心跳信息,更新SG的元數據信息,然後根據SG的狀態,產生相應操作(如添加,刪除副本)或空操作,通過心跳的響應信息反饋給SN,如有下發操作,SCM通過下一次心跳信息來檢查本次操作是否成功,如往某個SG中添加一個副本的過程:

1.SCM接收到SG上報的心跳信息,更新該SG的信息到KV系統。

2.SCM通過響應下發添加Segment請求給SG。

3.SG接收到請求後,向該SG加入新的Segment,添加後,更新SG信息,下一次心跳週期發送更新後的SG信息.

4.SCM接收到SG的心跳信息,檢查添加Segment操作是否成功。

img

裝箱算法

假設SCM中存在Region1,該Region1存在Zone1,Zone2兩個區域,Zone1有三個機架Rack1,Rack2,Rack3,存在三個主機Host1,Host2,Host3,每個主機有4個SN,每個SN保存已分配的Segment,選擇一個Store作爲SG 副本分四個步驟:篩選,過濾,打分,比較。

img

1.篩選:根據Pool註冊的標籤信息(爲一組Key-Value數組),如[{REGION:Region1},{ZONE:Zone1}],選擇出可用的PoolStores1集合,如{S1,S2,S3,S4,S5...,S12}。

img

2.過濾:從PoolStores1集合中過濾不符合規則的store信息,如根據其狀態(在線,離線),工作負載(空閒,忙碌),使用率(CPU,內存,磁盤,網絡等),以及該Store已在該SG中等進行過濾,得到PoolStores2集合{S1,S2,S4,S7,S8,S9,S10,S12}。

img

3.打分:假設SG0的segment所在的store的集合爲{S5,S3},其中S5爲leader所在的store,對PoolStores2中的store進行打分,遍歷PoolStores,針對每個pStore,遍歷SGStores,比較pStore和sgStore的位置,計算pStore的分值pScore,遍歷完SGStores後,得到該pStore在該SG上的分值pScore的總分值,即{100,100,100,100,100,200,200,200}。

img

4.比較:如選擇的Stores的分數相同,則按Store上Segment數量進一步比較,數量少的爲選擇的Store,如選擇出Store10作爲爲SG0{S5,S3}的另一個副本。

img

此文已由作者授權騰訊雲+社區發佈

搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!

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