ONOS動態擴容面臨的難點與解決方案

2021-09-22 22:19:10 字數 2187 閱讀 8891

一、onos的一致性保障

onos主要包括兩類一致性機制,最終一致性和強一致性,最終一致性採用樂觀非同步複製和基於gossip的熵減方式來實現,樂觀非同步複製可以高效的實現最終一致,但是一旦集群中發生節點脫離集群或者重啟的情況整體集群就會出現越來越失序的現象,基於gossip的熵減方案就是為了解決此類問題,集群中的節點定期(通常間隔三到五秒)地隨機選擇乙個節點進行資料同步,大多數情況下,熵減互動是平常的,因為每個控制器已經知道發生在網路中的每乙個事件。 但是當乙個控制器狀態稍微漂移時,這個機制很快就會檢測到這個狀態,並使控制器重新同步。 這種方法還具有快速將新加入的控制器和其他的控制器進行同步的好處。 新加入的控制器與現有控制器之間的第一次熵減互動將很快實現節點同步,而不需要單獨的備份/發現機制。

在動態擴容的情況下,動態節點的加入會對最終一致性產生影響,表現為新的節點加入集群,在和其他節點的熵減互動以及樂觀複製中最終和整體集群達到一致。這部分涉及的子系統包括device和link子系統。

而device,link子系統也會影響到topo子系統,所以在進行節點動態擴容時,新加入節點在實現最終一致的過程中如果不承載業務的話影響較小。

強一致性的保障通過raft演算法來實現,onos考慮到容錯和效能的通盤考慮,選擇了分割槽機制和備份冗餘機制。

分割槽機制是指onos對任意乙個支援強一致性的分布式原語(主要包括其分布式資料結構)支援分割槽機制,而在每乙個分割槽中支援多個節點之間的備份冗餘,實現了cap理論的折衷性考慮。

二、onos邏輯時鐘

在分布式系統中時鐘是個重要的概念,onos選取了以mastership term和本地事件序列號的方式來進行統計。其理論依據如下:

網路控制器的控制離不開裝置,所有的網路事件都是最終都能關聯到裝置上

mastershipterm是全域性強一致的,依賴這個資料做時鐘的可靠性高

控制器依賴從裝置收上來的資訊來發出網路事件,而真正丟擲事件的只有master,master維護著對應裝置上報事件的序列號,在每乙個term週期內從0開始單調遞增

三、動態擴容對強一致性的影響

當前onos大部分子系統都採用的是強一致性的方式,包括:flowrule, host, mastership等,其中mastership是整體集群數的強一致,其他子系統是基於partition內部節點的強一致。所以onos集群的宕機風險和partition member數量有關,如果partition member只有三個節點,那麼兩台裝置宕機就會造成系統問題。

在節點動態加入集群的場景下,最大的問題是要防止出現腦裂,所謂腦裂就是乙個集群中同時出現兩個leader的場景,在集群節點減少的情況下不會出現,但是在集群新增節點時會出現這種場景,如下圖所示:

在上圖所示的場景之下,假如新的server先以新配置啟動,而舊的server逐步以新配置執行,此時會存在新配置的大多數和舊配置的大多數共存的情況,操作不慎會導致集群存在兩個leader進而腦裂的情況。

onos的raft演算法採用copycat實現,其支援動態節點的加入,但是這個方法不同於raft**中提到的兩階段新增的方案,而是採用了單節點新增方案來避免出現腦裂的情況,這樣使得方案更簡單但是相對操作會麻煩一些。另外在新加入節點開始進行資料同步時,業務要盡量避免寫入。以免影響讀寫效能。

四、onos帶狀態重啟

帶狀態重啟也是生產環境中非常重要的一點。onos大部分分布式資料結構都是支援持久化的,部分不支援的主要是最終一致性資料結構。 這其中ecmap必須配置永續性選項才能將條目寫入磁碟,否則在集群關閉時會丟失。

但是大多數分布式原語(強一致性)使用了raft集群,並且它們是持久化的。 consistentmap,consistenttreemap,documenttree,distributedset,leaderelector以及這些基元的所有async *版本都使用單個raft分割槽或所有raft分割槽。 這些原語有效地由持久的複製日誌支援,該日誌將從該/ data目錄中讀取,並在重新啟動群集時重播。

原文發布時間為:2017-11-14

Android Tinker的問題與解決方案

android n 混合編譯問題 內聯問題 pre verify問題 補丁類與引用類放在同乙個dex中 tinker等全量合成方案突破了此限制。在apk安裝的時候,虛擬機會將dex優化成odex後才拿去執行。在這個過程中會對所有class乙個校驗。校驗方式 假設a該類在它的static方法,priv...

inline block元素的空隙與解決方法

多次遇到了使用inline block後留下間隙的問題,所以記錄一下,以提醒自己以後留意這點。現象描述 使用display inlie block後和一些行內元素都有此現象如 等標籤元素 那沒我們該如何解決呢?方法是很多的。可以參考大神的解決方法 以下方法是我對此部落格的提煉。方法一間隙產生的原因是...

static控制項動態透明顯示的完美解決方案

在有背景的對話方塊中,static控制項的透明顯示是乙個非常普通的問題。常用的解決辦法可以通過過載onctlcolor函式設定背景透明,再返回乙個空畫刷來解決。cpp view plaincopy 01.if nctlcolor ctlcolor static 02.但這種方法有乙個弊端 不能動態更...