本文由騰訊雲數據庫發表
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切換,副本遷移,副本離線等。數組
相關組件和名詞解釋以下:網絡
lDBEngine:數據庫引擎,支持一主多從。架構
lDB Cluster Manager(DCM):數據庫集羣管理,其負責一主多從DB集羣的HA管理。異步
lStorage Service或Storage 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是一對多的關係。spa
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相關信息。
SCM Master主要與以下模塊進行交互:
lStorage Service:進行資源調度,接收心跳,下發命令等交互
lDistributed File System:爲其提供對應Pool和pool下所屬SG的信息,以幫助其完成讀寫請求的正確路由
lDCM:爲其提供包括建立Pool,查看Pool信息,以及SG調度狀況等接口。
lSCM Slave:經過Etcd同步SCM的數據,包括調度信息和資源信息等,維護高可用性的心跳信息。
對上圖的詳細說明:
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調度將對SCM全部Pool進行調度,每隔5秒輪詢一次全部的Pool,檢查是否有新的Pool加入,檢測每一個Pool的狀態,根據Pool狀態進行調度,如初始化,擴縮容和銷燬等。
Pool狀態包括:UNINITIALIZE,NORMAL,DISABLE,DELETE,其調度狀態包括:INITIATING,EXPANDING,EXPANDED,IDLE。Pool調度狀態變動以下:
擴容過程以下:
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,不然忽略本次調度。
調度狀態需進行持久化,當SCM發生主從切換時,能恢復到崩潰時的調度狀態。
Pool縮容是擴容的逆過程,從id最大的SG開始往0方向收縮,以避免產生空洞,具體的操做由SG調度器執行每一個SG回收。
Pool釋放是對該Pool的全部SG進行釋放,回收將從從id最大的SG開始回收,回收過程將經過心跳信息下發指令給SN,具體的操做由SG調度器執行每一個SG的回收。
CynosDB每一個Pool都對應一個SG調度器,每一個調度器按1秒輪詢一次該Pool內的全部SG,每一個Segment Group之間是相互隔離的,其調度不受影響,調度主要經過SN的心跳和SG心跳完成的,調度包括segment的添加,刪除,切主等。
SG狀態包括:UNINITIALIZE,NORMAL,DISABLE。
Segment調度狀態包括:UNINITIALIZE,INITIATING,ALLOCATING,ALLOCATED,BOOTSTRAPPING,ADDING,ADDED,REMOVING,RELEASING,調度狀態以下:
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彙報分配結果給元數據。
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操做是否成功。
假設SCM中存在Region1,該Region1存在Zone1,Zone2兩個區域,Zone1有三個機架Rack1,Rack2,Rack3,存在三個主機Host1,Host2,Host3,每一個主機有4個SN,每一個SN保存已分配的Segment,選擇一個Store做爲SG 副本分四個步驟:篩選,過濾,打分,比較。
1.篩選:根據Pool註冊的標籤信息(爲一組Key-Value數組),如[{REGION:Region1},{ZONE:Zone1}],選擇出可用的PoolStores1集合,如{S1,S2,S3,S4,S5...,S12}。
2.過濾:從PoolStores1集合中過濾不符合規則的store信息,如根據其狀態(在線,離線),工做負載(空閒,忙碌),使用率(CPU,內存,磁盤,網絡等),以及該Store已在該SG中等進行過濾,獲得PoolStores2集合{S1,S2,S4,S7,S8,S9,S10,S12}。
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}。
4.比較:如選擇的Stores的分數相同,則按Store上Segment數量進一步比較,數量少的爲選擇的Store,如選擇出Store10做爲爲SG0{S5,S3}的另外一個副本。
此文已由做者受權騰訊雲+社區發佈
搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!