本文由騰訊雲資料庫發表
前言
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切換,副本遷移,副本離線等。
相關元件和名詞解釋如下:
l**DBEngine:**資料庫引擎,支援一主多從。
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)。
l**Pool:**多個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相關資訊。
I/O模型
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排程
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的回收。
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 送你一份技術課程大禮包!