除了分發(fā)數(shù)據(jù),ONOS集群還要負(fù)責(zé)以下的任務(wù):
1.檢測(cè)和處理集群節(jié)點(diǎn)的加入和離開(由Cluster Subsystem管理)
2.為每一個(gè)設(shè)備提供一個(gè)主Controller
ONOS集群協(xié)調(diào)的一個(gè)重要工具便是Store,Store生成事件,事件被分布式儲(chǔ)存持久化,在集群中共享。
根據(jù)具體服務(wù)的需求,儲(chǔ)存的內(nèi)容可以有不同的特征,如強(qiáng)一致性或最終一致性,這使得每個(gè)服務(wù)的儲(chǔ)存根據(jù)需求采用合適的分布機(jī)制。
目前ONOS主控部分采用Hazelcast以達(dá)到強(qiáng)一致性,而Device、Link等部分的管理使用樂(lè)觀的復(fù)制技術(shù)輔以gossip協(xié)議以確保最終一致性。
如果兩個(gè)不同節(jié)點(diǎn)上的子系統(tǒng)是相同的,子系統(tǒng)將會(huì)直接通過(guò)Store與另一個(gè)進(jìn)行同步。但是同步的只是一部分的狀態(tài),如,對(duì)于DeviceStore,它只知道設(shè)備的狀態(tài)而不了解其他無(wú)關(guān)的信息。目前除了拓?fù)涔芾磉@部分,其他所有服務(wù)都要訪問(wèn)分布式儲(chǔ)存。
下圖展示了兩個(gè)子系統(tǒng)間的同步:
事件排序:
ONOS使用一個(gè)類似向量時(shí)鐘的手段以達(dá)到最終一致性。
Q:什么是向量時(shí)鐘?
A:向量時(shí)鐘是一種在分布式環(huán)境中為各種操作或事件產(chǎn)生偏序值的技術(shù),它可以檢測(cè)操作或事件的并行沖突,用來(lái)保持系統(tǒng)的一致性。
在ONOS中,被DeviceStore和LinkStore所使用的邏輯時(shí)鐘(logical clock)實(shí)際上是一個(gè)設(shè)備自發(fā)現(xiàn)以來(lái)的主控權(quán)交接數(shù)組成。同時(shí)本地還有一個(gè)順序數(shù)字,每觀察到一個(gè)事件就遞增一次。至于HostStore則依賴于系統(tǒng)時(shí)間,但由于Host對(duì)象的特性,阻止了他們被特定的設(shè)備所綁定。
集群管理:
Cluster subsystem要處理的任務(wù)有:
目前ONOS主要依靠Hazelcast實(shí)現(xiàn)這部分的功能。
設(shè)備控制管理:
設(shè)備可以自由地連接到一個(gè)或多個(gè)集群中的節(jié)點(diǎn),node可以有以下幾種角色:
這三種角色對(duì)應(yīng)OpenFlow中的NONE、SLAVE和MASTER角色。ONOS中的mastership subsystem負(fù)責(zé)保證在給出的任意時(shí)刻,每一個(gè)設(shè)備都只有一個(gè)MASTER,而其他的則為STANDBY或NONE狀態(tài)。
節(jié)點(diǎn)控制周期:
一個(gè)node一開始可能是NONE角色?,F(xiàn)在會(huì)有如下幾種情況:
1.設(shè)備沒(méi)有master綁定
2.有一個(gè)控制channel連接到設(shè)備上,并成為其master。若后面有其他node發(fā)現(xiàn)該設(shè)備,如果node與設(shè)備
間有連接,則成為STANDBY,否則為NONE。
如果面臨下面幾種情況,已經(jīng)擁有的角色可能會(huì)被改變:
1.人為干預(yù):管理員手動(dòng)為設(shè)備設(shè)置角色
2.從設(shè)備斷開:node與設(shè)備間的控制channel斷開
3.從集群中斷開:集群分裂為兩個(gè)部分
MastershipManager通過(guò)角色的放棄(relinquishment)和再選(reelection )確保每個(gè)設(shè)備至多有一個(gè)master。并且確保如果一個(gè)node無(wú)法正確處理設(shè)備時(shí)不參加reelection。
角色放棄:
如果遇到以下狀況,node會(huì)放棄其角色并回到NONE:
1.與設(shè)備斷開,或設(shè)備失效
2.當(dāng)集群分裂時(shí),為較小的集群的成語(yǔ)
3.人為設(shè)定,強(qiáng)制修改其角色為NONE
4.一致性檢查的失敗,如OpenFlow設(shè)備對(duì)RoleRequest返回一個(gè)錯(cuò)誤
重新選舉:
如果遇到以下狀況,會(huì)重新進(jìn)入選舉機(jī)制:
1.一個(gè)Master的失效(如放棄角色)
2.Master node與設(shè)備間斷開連接
3.人為對(duì)master的降級(jí),降到STANDBY或NONE
候選節(jié)點(diǎn)是從現(xiàn)有的standby節(jié)點(diǎn)中選擇的,節(jié)點(diǎn)根據(jù)NodeID排序,這樣是為了方便放棄角色的節(jié)點(diǎn)能直接選擇下一個(gè)節(jié)點(diǎn)成為候選節(jié)點(diǎn)。候選節(jié)點(diǎn)可以選擇成為master,或選下一個(gè)候選節(jié)點(diǎn)。同時(shí)ONOS提供了機(jī)制去阻止無(wú)限選舉的問(wèn)題。
處理集群分裂的問(wèn)題:
如果集群分裂為兩個(gè)不同尺寸的部分,位于較小的集群的nodes會(huì)放棄自己的角色(或者無(wú)法放棄角色)。而位于較大的集群的node會(huì)強(qiáng)制為其master位于小集群的設(shè)備執(zhí)行改選。但目前ONOS無(wú)法處理兩個(gè)相同尺寸的,并且依然連接到網(wǎng)絡(luò)的集群。
思考:
ONOS在設(shè)備管理上的選舉機(jī)制基本上和Raft算法類似,在Raft同樣也存在三個(gè)角色,follower,leader,candidate。這樣的選舉機(jī)制理解起來(lái)非常容易(比PAXOS容易多了)。
通過(guò)node間不同狀態(tài)間的轉(zhuǎn)換,確保每一個(gè)設(shè)備都能有一個(gè)主控node,大大地提高了系統(tǒng)的可靠性。
至于ONOS中通過(guò)事件來(lái)同步狀態(tài),這種事件驅(qū)動(dòng)的設(shè)計(jì)在某種程度上比起命令式的更有優(yōu)勢(shì)。如果節(jié)點(diǎn)間不是通過(guò)傳播事件而是單純靠RPC調(diào)用交互,在效率和穩(wěn)定性上一定會(huì)打折扣。
對(duì)于分布式系統(tǒng)來(lái)說(shuō),Actor是一種可行的架構(gòu)。ONOS目前的架構(gòu)一定程度上有Actor模型的影子,關(guān)于Actor模型,可以參考這篇資料:
http://www.infoq.com/cn/articles/reactive-cloud-actors,這篇資料也介紹了響應(yīng)式架構(gòu)的優(yōu)點(diǎn)。
而ONOS通過(guò)分布式儲(chǔ)存保存事件,則是另一種能提高穩(wěn)定性的手段。LMAX(一種新型零售金融交易平臺(tái))的架構(gòu)就實(shí)現(xiàn)了這一點(diǎn):
“使用基于內(nèi)存的模型有一個(gè)重要問(wèn)題:萬(wàn)一崩潰怎么辦?電源掉電也是可能發(fā)生的,“事件”概念是問(wèn)題解決的核心,業(yè)務(wù)邏輯處理器的狀態(tài)是由輸入事件驅(qū)動(dòng)的,只要這些輸入事件被持久化保存起來(lái),你就總是能夠在崩潰情況下,根據(jù)事件重演重新獲得當(dāng)前狀態(tài)。很明顯,ONOS通過(guò)持久化事件,可以獲得更高的穩(wěn)定性,實(shí)為明智的選擇。
總結(jié):本文介紹了ONOS集群管理的多個(gè)方面,并對(duì)其設(shè)計(jì)進(jìn)行了思考。希望本文能讓各位在了解ONOS的內(nèi)部機(jī)制的同時(shí),領(lǐng)略到其設(shè)計(jì)的巧妙之處。
作者簡(jiǎn)介:何智剛,2015至今,現(xiàn)為廣東的一名在校高三學(xué)生,在學(xué)習(xí)之余,主要研究Docker,OpenStack,SDN,對(duì)各種領(lǐng)域都有所涉獵,目標(biāo)是邁向full stack。