ONOS動態(tài)擴(kuò)容面臨的難點與解決方案
一、ONOS的一致性保障
ONOS主要包括兩類一致性機(jī)制,最終一致性和強(qiáng)一致性,最終一致性采用樂觀異步復(fù)制和基于Gossip的熵減方式來實現(xiàn),樂觀異步復(fù)制可以高效的實現(xiàn)最終一致,但是一旦集群中發(fā)生節(jié)點脫離集群或者重啟的情況整體集群就會出現(xiàn)越來越失序的現(xiàn)象,基于Gossip的熵減方案就是為了解決此類問題,集群中的節(jié)點定期(通常間隔三到五秒)地隨機(jī)選擇一個節(jié)點進(jìn)行數(shù)據(jù)同步,大多數(shù)情況下,熵減互動是平常的,因為每個控制器已經(jīng)知道發(fā)生在網(wǎng)絡(luò)中的每一個事件。 但是當(dāng)一個控制器狀態(tài)稍微漂移時,這個機(jī)制很快就會檢測到這個狀態(tài),并使控制器重新同步。 這種方法還具有快速將新加入的控制器和其他的控制器進(jìn)行同步的好處。 新加入的控制器與現(xiàn)有控制器之間的***次熵減互動將很快實現(xiàn)節(jié)點同步,而不需要單獨的備份/發(fā)現(xiàn)機(jī)制。
在動態(tài)擴(kuò)容的情況下,動態(tài)節(jié)點的加入會對最終一致性產(chǎn)生影響,表現(xiàn)為新的節(jié)點加入集群,在和其他節(jié)點的熵減交互以及樂觀復(fù)制中最終和整體集群達(dá)到一致。這部分涉及的子系統(tǒng)包括Device和Link子系統(tǒng)。
而Device,Link子系統(tǒng)也會影響到Topo子系統(tǒng),所以在進(jìn)行節(jié)點動態(tài)擴(kuò)容時,新加入節(jié)點在實現(xiàn)最終一致的過程中如果不承載業(yè)務(wù)的話影響較小。
強(qiáng)一致性的保障通過Raft算法來實現(xiàn),ONOS考慮到容錯和性能的通盤考慮,選擇了分區(qū)機(jī)制和備份冗余機(jī)制。
分區(qū)機(jī)制是指ONOS對任意一個支持強(qiáng)一致性的分布式原語(主要包括其分布式數(shù)據(jù)結(jié)構(gòu))支持分區(qū)機(jī)制,而在每一個分區(qū)中支持多個節(jié)點之間的備份冗余,實現(xiàn)了CAP理論的折衷性考慮。
二、ONOS邏輯時鐘
在分布式系統(tǒng)中時鐘是個重要的概念,ONOS選取了以MasterShip Term和本地事件序列號的方式來進(jìn)行統(tǒng)計。其理論依據(jù)如下:
- 網(wǎng)絡(luò)控制器的控制離不開設(shè)備,所有的網(wǎng)絡(luò)事件都是最終都能關(guān)聯(lián)到設(shè)備上
- MasterShipTerm是全局強(qiáng)一致的,依賴這個數(shù)據(jù)做時鐘的可靠性高
- 控制器依賴從設(shè)備收上來的信息來發(fā)出網(wǎng)絡(luò)事件,而真正拋出事件的只有Master,Master維護(hù)著對應(yīng)設(shè)備上報事件的序列號,在每一個Term周期內(nèi)從0開始單調(diào)遞增
三、動態(tài)擴(kuò)容對強(qiáng)一致性的影響
當(dāng)前ONOS大部分子系統(tǒng)都采用的是強(qiáng)一致性的方式,包括:FlowRule, Host, MasterShip等,其中MasterShip是整體集群數(shù)的強(qiáng)一致,其他子系統(tǒng)是基于Partition內(nèi)部節(jié)點的強(qiáng)一致。所以O(shè)NOS集群的宕機(jī)風(fēng)險和Partition Member數(shù)量有關(guān),如果Partition Member只有三個節(jié)點,那么兩臺設(shè)備宕機(jī)就會造成系統(tǒng)問題。
在節(jié)點動態(tài)加入集群的場景下,***的問題是要防止出現(xiàn)腦裂,所謂腦裂就是一個集群中同時出現(xiàn)兩個Leader的場景,在集群節(jié)點減少的情況下不會出現(xiàn),但是在集群添加節(jié)點時會出現(xiàn)這種場景,如下圖所示:
在上圖所示的場景之下,假如新的Server先以新配置啟動,而舊的Server逐步以新配置運行,此時會存在新配置的大多數(shù)和舊配置的大多數(shù)共存的情況,操作不慎會導(dǎo)致集群存在兩個Leader進(jìn)而腦裂的情況。
ONOS的raft算法采用Copycat實現(xiàn),其支持動態(tài)節(jié)點的加入,但是這個方法不同于Raft論文中提到的兩階段添加的方案,而是采用了單節(jié)點添加方案來避免出現(xiàn)腦裂的情況,這樣使得方案更簡單但是相對操作會麻煩一些。另外在新加入節(jié)點開始進(jìn)行數(shù)據(jù)同步時,業(yè)務(wù)要盡量避免寫入。以免影響讀寫性能。
四、ONOS帶狀態(tài)重啟
帶狀態(tài)重啟也是生產(chǎn)環(huán)境中非常重要的一點。ONOS大部分分布式數(shù)據(jù)結(jié)構(gòu)都是支持持久化的,部分不支持的主要是最終一致性數(shù)據(jù)結(jié)構(gòu)。 這其中ECMap必須配置持久性選項才能將條目寫入磁盤,否則在集群關(guān)閉時會丟失。
但是大多數(shù)分布式原語(強(qiáng)一致性)使用了Raft集群,并且它們是持久化的。 ConsistentMap,ConsistentTreeMap,DocumentTree,DistributedSet,LeaderElector以及這些基元的所有Async *版本都使用單個Raft分區(qū)或所有Raft分區(qū)。 這些原語有效地由持久的復(fù)制日志支持,該日志將從該/ data目錄中讀取,并在重新啟動群集時重播。