計算系統已經變得無處不在,從小型嵌入式設備到手機和平板電腦,到PC和后端服務器。這些計算系統中的每一個被設計為處理軟件代碼。軟件允許用戶執行功能,與由計算系統提供的硬件交互。在一些情況下,這些計算系統可以鏈接在一起以形成計算資源的云。這些云資源可以包括托管、處理、數據存儲或其他服務。這些云資源被設計為容錯的,使得一個計算系統可以在需要時立即替換另一個計算系統。然而,這種容錯系統可能生成大量的云內網絡流量,從而確保系統正常工作。
本文描述的實施例涉及在節點集群中的計算節點之間進行通信。在一個實施例中,計算機系統(例如主節點)從工作節點(worker node,或工作者節點)接收包括工作節點的當前工作負載標識符和健康狀態的數據分組,其中數據分組包括相關聯的版本號。計算機系統確定接收到的數據分組中的版本號不同于先前發送到工作節點的最新工作負載配置的版本,并且評估工作節點的當前工作負載配置以確定是否要在工作節點上做出工作負載變更。然后,在確定要在工作節點上做出工作負載變更時,計算機系統選擇工作負載變更的子集以應用于工作節點,生成對工作節點的所選擇的工作負載變更的子集的指示,并向工作節點發送所生成的工作負載變更的指示。
在另一實施例中,計算機系統(例如工作節點)生成包括工作負載標識符(ID)的列表的數據分組,該工作負載標識符由工作節點負責。數據分組還包括針對每個工作負載ID的版本號和工作負載健康狀態。計算機系統向節點集群中的主節點發送所生成的數據分組,并且接收差量數據分組,該差量數據分組包括指定將應用于工作節點的工作負載中的至少一個工作負載的所選擇的變更的子集的信息。然后,計算機系統將所選擇的工作負載變更的子集應用于工作節點上的工作負載。
本
技術實現要素:
被提供以用于以簡化形式介紹概念的選擇,其在以下的具體實施方式中將做出進一步的描述。本發明內容并不旨在識別要求保護的主題的關鍵特征或者核心特征,其也并不旨在被用來確定要求保護的主題的范圍。
附加的特征和優點將在下面的描述中闡述,并且從描述中部分地對于本領域的普通技術人員將是顯而易見的,或者可以通過實踐本文的教導而習得。本文描述的實施例的特征和優點可以通過在所附權利要求中特別指出的手段和組合來實現和獲得。通過以下描述和所附權利要求,本文描述的實施例的特征將變得更加顯而易見。
附圖說明
為了進一步闡明本文描述的實施例的上述和其他特征,將通過參考附圖給出更具體的描述。應當理解,這些附圖僅僅描繪了本文所描述的實施例的示例,因此不應被認為是對其范圍的限制。將通過使用附圖以附加的特性和細節來描述和解釋實施例,在附圖中:
圖1示出了計算機體系結構,其中本文描述的實施例可以包括在節點集群中的計算節點之間進行通信。
圖2示出了用于在節點集群中的計算節點之間通信的示例方法的流程圖。
圖3示出了用于在節點集群中的計算節點之間通信的備選示例方法的流程圖。
圖4示出了其中主集群中的主節點正在監視和控制工作集群中的工作節點的實施例。
圖5示出了其中主節點和工作節點使用心跳分組和差量數據分組進行通信的實施例。
圖6示出了其中工作節點確定工作節點與主節點之間的物理鏈路上的連通性的實施例。
具體實施方式
本文描述的實施例涉及在節點集群中的計算節點之間進行通信。在一個實施例中,計算機系統(例如主節點)從工作節點接收標識工作節點的當前工作負載標識符和健康狀態的數據分組,其中數據分組包括相關聯的版本號。計算機系統確定接收到的數據分組中的版本號不同于先前接收到的數據分組,并且評估工作節點的當前工作負載配置以確定是否要在工作節點上做出工作負載變更。然后,在確定要在工作節點上做出工作負載變更時,計算機系統選擇工作負載變更的子集以應用于工作節點,生成對工作節點的所選擇的工作負載變更的子集的指示,并向工作節點發送所生成的工作負載變更的指示。
在另一個實施例中,計算機系統生成包括工作負載標識符(ID)的列表的數據分組,該工作負載標識符由工作節點負責。數據分組還包括針對每個工作負載ID的版本號和工作負載健康狀態。計算機系統向節點集群中的主節點發送所生成的數據分組,并且接收差量數據分組,該差量數據分組包括指定將應用于工作節點的工作負載中的至少一個工作負載的所選擇的變更的子集的信息。然后,計算機系統將在差量數據分組中指定的所選擇的工作負載變更的子集應用到工作節點上的至少一個工作負載。
以下討論現在涉及可以執行的多種方法和方法動作。應當注意,盡管方法動作可以以特定順序討論或者以流程圖示出為以特定順序發生,但是除非特別聲明或需要特定順序,否則不必要求特定順序,因為動作依賴于在執行該動作之前完成的另一動作。
本文描述的實施例可以實現各種類型的計算系統。這些計算系統現在越來越多地采取各種各樣的形式。計算系統例如可以是手持式設備、家用電器、膝上型計算機、臺式計算機、大型機、分布式計算系統、或甚至通常不被認為是計算系統的設備。在本說明書和權利要求書中,術語“計算系統”被廣義地定義為包括任何以下設備或系統(或其組合):其包括至少一個物理和有形處理器,以及能夠在其上具有可由處理器執行的計算機可執行指令的物理和有形存儲器。計算系統可以分布在網絡環境上并且可以包括多個組分計算系統。
如圖1所示,計算系統101通常包括至少一個處理單元102和存儲器103。存儲器103可以是物理系統存儲器,其可以是易失性、非易失性或兩者的某種組合。術語“存儲器”在本文也可以用于指非易失性大容量存儲器,諸如物理存儲介質。如果計算系統是分布式的,則處理、存儲器和/或存儲能力也可以被分布。
如本文所使用的,術語“可執行模塊”或“可執行組件”可以指能在計算系統上執行的軟件對象、例程或方法。本文描述的不同組件、模塊、引擎和服務可以被實現為在計算系統上執行的對象或進程(例如,作為單獨的線程)。
在下面的描述中,參考由一個或多個計算系統執行的動作來描述實施例。如果這樣的動作以軟件實現,則執行動作的相關聯的計算系統的一個或多個處理器響應于已經執行的計算機可執行指令來指導計算系統的操作。例如,這樣的計算機可執行指令可以在形成計算機程序產品的一個或多個計算機可讀介質上實現。這種操作的示例涉及數據的操縱。計算機可執行指令(和被操縱的數據)可以存儲在計算系統101的存儲器103中。計算系統101還可以包含允許計算系統101通過有線或無線網絡與其他消息處理器通信的通信信道。
本文所述的實施例可以包括或利用包括計算機硬件(例如,一個或多個處理器和系統存儲器)的專用或通用計算機系統,如下面更詳細討論的。系統存儲器可以包括在總存儲器103內。系統存儲器還可以稱為“主存儲器”,并且包括可由至少一個處理單元102通過存儲器總線尋址的存儲器位置,在這種情況下,地址位置在存儲器總線本身上被斷言。系統存儲器在傳統上是易失性的,但是本文描述的原理也適用于系統存儲器部分地或甚至完全非易失性的情況。
本發明的范圍內的實施例還包括用于攜載或存儲計算機可執行指令和/或數據結構的物理和其他計算機可讀介質。這樣的計算機可讀介質可以是可由通用或專用計算機系統訪問的任何可用介質。存儲計算機可執行指令和/或數據結構的計算機可讀介質是計算機存儲介質。攜帶計算機可執行指令和/或數據結構的計算機可讀介質是傳輸介質。因此,作為示例而非限制,本發明的實施例可以包括至少兩種截然不同種類的計算機可讀介質:計算機存儲介質和傳輸介質。
計算機存儲介質是存儲計算機可執行指令和/或數據結構的物理硬件存儲介質。物理硬件存儲介質包括計算機硬件,諸如RAM、ROM、EEPROM、固態驅動器(“SSD”)、閃存、相變存儲器(“PCM”)、光盤存儲器、磁盤存儲器或其他磁存儲設備,或可以用于以計算機可執行指令或數據結構的形式存儲程序代碼的任何其他硬件存儲設備,其可以由通用或專用計算機系統訪問和執行以實現本發明公開的功能。
傳輸介質可以包括網絡和/或數據鏈路,其可以用于攜帶計算機可執行指令或數據結構形式的程序代碼,并且可以由通用或專用計算機系統訪問。“網絡”被定義為使得能夠在計算機系統和/或模塊和/或其他電子設備之間傳輸電子數據的一個或多個數據鏈路。當通過網絡或另一通信連接(硬連線、無線、或硬連線或無線的組合)向計算機系統傳送或提供信息時,計算機系統可將該連接視為傳輸介質。上述的組合也應包括在計算機可讀介質的范圍內。
此外,在到達各種計算機系統組件時,計算機可執行指令或數據結構形式的程序代碼可以從傳輸介質自動傳輸到計算機存儲介質(反之亦然)。例如,通過網絡或數據鏈路接收的計算機可執行指令或數據結構可以緩存在網絡接口模塊(例如,“NIC”)內的RAM中,然后最終傳送到計算機系統RAM和/或在計算機系統處的更少易失性計算機存儲介質。因此,應當理解,計算機存儲介質可以被包括在也(或甚至主要地)利用傳輸介質的計算機系統組件中。
計算機可執行指令例如包括指令和數據,當在一個或多個處理器上執行時,使得通用計算機系統、專用計算機系統或專用處理設備執行特定功能或功能組。計算機可執行指令例如可以是二進制,諸如匯編語言的中間格式指令,或甚至源代碼。
本領域技術人員將理解,本文描述的原理可以在具有許多類型的計算機系統配置的網絡計算環境中實踐,包括個人計算機、臺式計算機、膝上型計算機、消息處理器、手持設備、多處理器系統、基于微處理器或可編程消費電子產品、網絡PC、小型計算機、大型計算機、移動電話、PDA、平板電腦、尋呼機、路由器、交換機等。本發明還可以在分布式系統環境中實踐,其中通過網絡鏈接(通過硬連線數據鏈路、無線數據鏈路、或通過硬連線和無線數據鏈路的組合)的本地和遠程計算機系統都執行任務。因此,在分布式系統環境中,計算機系統可以包括多個組分計算機系統。在分布式系統環境中,程序模塊可以位于本地和遠程存儲器儲存設備兩者中。
本領域技術人員還將理解,本發明可以在云計算環境中實踐。云計算環境可以是分布式的,但這不是必需的。當分布式時,云計算環境可以在組織內國際地分布和/或具有跨越多個組織所擁有的組件。在本說明書和所附權利要求中,“云計算”被定義為用于實現對可配置計算資源(例如,網絡、服務器、存儲裝置、應用和服務)的共享池的按需網絡訪問的模型。“云計算”的定義不限于在正確部署時可從這樣的模型獲得的任何其他眾多優點。
此外,本文所描述的系統架構可以包括多個獨立的組件,每個獨立的組件作為整體貢獻于系統的功能。這種模塊化允許在接近平臺可擴展性的問題時增加靈活性,并且為此目的提供了各種優點。通過使用功能范圍有限的較小規模的部件,可以更容易地管理系統復雜性和增長。通過使用這些松散耦合的模塊來增強平臺容錯。個別組件可以根據業務需要而逐漸增長。模塊化開發還意味著減少新功能的上市時間。可以添加或減少新功能,而不影響核心系統。
圖1示出了其中可以采用至少一個實施例的計算機架構100。計算機架構100包括計算機系統101。計算機系統101可以是任何類型的本地或分布式計算機系統,包括云計算系統。計算機系統101包括用于執行各種不同功能的模塊。例如,通信模塊104可以被配置為與其他計算系統通信。通信模塊104可以包括可從其他計算系統接收和/或發送數據的任何有線或無線通信裝置。通信模塊104可以被配置為與數據庫、移動計算設備(諸如移動電話或平板電腦)、嵌入式或其他類型的計算系統交互。
計算機系統101可以包括其他模塊,包括確定模塊105、評估模塊106和變更選擇模塊107。這些模塊中的每個模塊執行將在下面進一步解釋的某些功能。在一些實施例中,管理或其他用戶可能期望將一組計算節點組織成聯合集群(例如集群111)。用戶可以提供指示每個類型的多少節點將在聚類聯合中的輸入。如本文所使用的術語,“集群聯合”或“聯合集群”是指多個獨立集群一起協作的聚合,以提供聯合范圍的服務,并且還保持單個集群即使在與其他集群的連接丟失和/或其他集群的失效期間也繼續操作的能力。每個集群由一個或多個物理計算節點組成,其可以包括諸如服務器刀片、硬件處理器或處理核心、大型機、嵌入式或其他類型的計算系統的計算系統。因此,集群是計算系統的集合,其一起工作以運行工作負載并根據需要而失效轉移以提供容錯。集群聯合可以包括各種類型的集群,包括主集群(master cluster)和工作集群(worker cluster)。
如本文所指的“主集群”是運行軟件組件的集群,其負責監視工作集群并做出失效轉移決定。如本文所指的“工作集群”是運行所分配的工作負載的集群。工作集群將在工作集群的節點內嘗試本地失效轉移。如果工作集群無法傳輸工作負載,則可以使用主集群來托管工作負載。“主代理”是托管在主集群上的軟件組件,其實現聯合的控制和監視邏輯。“工作代理”是托管在工作集群上的軟件組件,其接受來自主集群的分配并向主集群提供狀態更新。“工作負載”是在集群節點上運行的軟件應用或服務或代碼的其他部分,其可以根據需要而失效轉移到其他集群節點。“失效轉移”包括在失效情況下將工作負載從一個集群節點快速轉移到另一個集群節點的能力,或者針對性能、負載平衡或其他原因將工作負載快速轉移到更理想的集群節點的能力。
本文的實施例聯合任何類型的集群并且可以與基本上任何集群解決方案一起使用,其允許工作負載被托管在計算節點上并且在硬件或軟件失效的情況下提供工作負載的失效轉移。實施例提供容錯存儲(例如集群數據庫),其允許在主集群上運行的代理持續用于運行集群聯合110的信息。在主集群上托管的主代理軟件可以被拆分為每次僅在一個主集群節點處活動的導引器組件,以及監視和控制其他節點并且在其他集群節點上活動的主導器組件。工作節點和主節點可以具有在不同時間分配給它們的不同角色,并且計算節點本身可以被重新分配為工作節點或主節點。在一些實施例中,主角色和工作者角色可以在相同的計算系統上共存(即主節點也可以托管工作負載)。
導引器角色(或者本文中簡稱為“導引器”)被配置為做出決策,包括但不限于以下:1)哪些主導器負責哪些工作集群,2)哪些工作節點負責托管哪些工作負載,3)決定從工作集群中提升一節點以退出其當前工作集群并加入主集群,或降級一主節點,使其成為工作節點并加入工作集群。這允許在主集群或工作集群上的失效計算節點從它們各自的集群中的計算節點池幾乎立即替換。導引器角色將其決策記錄在集群數據庫中(其對于主集群可以是本地或遠程的)。主導器角色(或本文中的“主導器”)監視對集群數據庫的更改,并了解它們是否需要將導引器決策傳達至它們負責的工作集群。主導器向工作集群發送分配,并從工作節點接收狀態更新。如果主導者沒有在預定的超時間隔內(無論是以秒、分鐘還是小時等為單位)接收到狀態更新,導引器將把缺少響應解釋為失效,并將在集群數據庫中記錄該失效。
在一些實施例中,導引器可以了解工作者的失效并且決定如何重新分布由工作者托管的工作負載。一旦已做出關于工作負載的重新分布的決定,導引器將在集群數據庫中記錄該決定。然后,導引器可以了解新的工作負載,并將其傳達至它們負責的工作集群。在主導器失效的情況下,導引器可以通過由主集群遞送的通知了解它,該主集群報告主節點向下或向上事件。當導引器獲知主節點失效時,導引器在剩余的主集群節點之間重新分布由該特定主集群節點監視的工作集群節點。然后,導引器將此決策寫入主數據庫。導引器將經由數據庫通知變更了解該決策,并開始監視和控制新獲取的工作集群。
當失效的主集群節點恢復在線狀態時,它會通過在集群數據庫中將其狀態記錄為在線來通知導引器它可用于監視。主集群了解到該情況,并將一些工作集群重新分布到新的主集群節點,以更好地分布主集群節點上的監視和控制負載。如果失效的主集群節點在預定時間段內沒有在線,并且活動主集群節點的數目降到低于期望的活動主集群節點數目的閾值以下,則導引器可以選擇從工作集群中移除節點,并將其加入主集群以在主集群中保留期望的冗余度。相反的操作也是可能的,如果被監視的工作集群的數目很小,則導引器可以選擇從主集群中移除節點并重新加入工作集群(或形成新的工作集群)。工作集群可以是一個節點集群或多節點集群。在多節點工作集群中,將嘗試在工作集群的其他節點上重新啟動失效的工作負載。一旦工作集群的恢復嘗試耗盡,在工作集群上運行的工作代理可以請求主集群幫助,將失效的工作負載傳遞到別處。
為了在具有數千個節點(或更多個)的分布式系統上托管工作負載,可擴展故障恢復協議用于處理數千個托管節點與監視它們的節點之間的通信。同樣重要的是,這些控制分組所采用的網絡帶寬以及在托管節點和監視節點上發生的CPU處理都是低的。本文描述的實施例提供了一種確保大規模可擴展分布式集群系統中的高度可擴展故障恢復通信的協議。托管節點以使得信息簡潔的方式發送工作負載的狀態。同時,監視節點不是發送關于工作負載(如虛擬機(VM))可用的所有信息,而是僅發送確保托管節點將工作節點帶到適當狀態所需的信息。同時,本文描述的協議確保其可以容忍分組丟失,并且在一些通信路徑中出現失效的情況下也在不同的網絡適配器之間通信。通過在適當的情況下節流消息和捎帶其他消息,可進一步實現更高的可擴展性。
在一些實施例中,容錯通信協議提供由監視和托管節點每秒發送或接收的分組數目的上限,優化在監視節點與托管節點之間交換的總信息的大小,避免發送未從監視節點更改為托管節點或從托管節點更改為監視節點的配置或狀態信息,對數據包丟失是恢復性的,并且幫助工作節點監視主節點上的遠程端點的健康狀態,使得主節點可以向可達端點發送分組。主節點和托管節點兩者都可以容忍除了一個網絡接口控制器(NIC)之外的所有NIC的失效,如下面將進一步解釋的。此外,協議允許在可用NIC之間的網絡流量的負載平衡,允許星狀(aster)節點在可配置的時間量中檢測工作節點的失效,并且允許流量的隨機化,使得工作節點不在同一時間發送導致網絡流量的峰值的心跳分組。
如本文所使用的術語,“心跳分組”是指由工作節點周期性地發送到主節點以提供關于在工作節點上運行的工作負載(例如工作節點112上的工作負載114)的信息的數據分組(例如簡潔串行化用戶數據報協議(UDP)分組)。如本文中所使用的,“分配分組”是指主節點僅在工作節點上的(多個)工作負載的配置信息自從上次收到心跳分組后發生更改時響應于心跳分組而發送的數據分組(例如簡潔串行化UDP分組)。因此,如圖1所示,工作節點112可以發送數據分組113(即心跳分組),其包括含工作負載標識符116、工作節點的當前健康狀態117、以及用于數據分組的版本標識符118的信息。分配分組可以包括要應用于工作節點112的變更119的指示。
主節點120可以被配置為知道它應該管理的所有工作節點。主節點周期性地向租賃已過期(即,主節點120在規定的超時間隔中尚未為其接收到單個心跳分組的工作節點)的所有工作節點(例如112)發送歡迎分組。當工作節點接收到歡迎分組時,它開始周期性地向工作節點發送歡迎分組的主節點發送心跳。心跳分組113包括取決于實現的實施例的各種類型的信息。如下面進一步解釋的,在至少一個實施例中,心跳分組可以包括序列號,健康狀態和與工作負載配置相關聯的配置版本標識符118。每次發生工作負載配置變更時,版本號都會增加。
當負責工作者的主節點(或本文的“主導器”)接收心跳分組并且驗證序列號高于接收到的最后一個序列號時,主導器將工作節點112所托管的那些工作負載與其應該擁有的那些工作負載進行比較。主節點還會檢查與工作負載關聯的版本是否與主集群數據庫中的最新版本匹配。在該比較之后,主導者知道要被添加到工作者、從工作者中移除、或在工作節點上改變的工作負載的集合。主導者從添加、刪除或改變的工作負載中選擇一個子集,并形成分配分組,并將其發送到工作節點。在本文中應當注意,術語“子集”是指可以從現有集合中選擇的項目集合,并且不包括具有零項目的“空子集”。確定要在子集中包括多少項目取決于將消耗多少帶寬(即,分配數據分組將有多大)。如果添加、刪除或改變的數目太大,則可以選擇子集以便將分配分組保持在指定大小以下。在一些情況下,分配分組可以保持在最大傳輸單元(MTU)大小以下,以避免分段。只要主導者發送關于每個分配分組中的至少一個工作負載的信息,協議收斂且工作者最終學習它應該擁有的每個工作負載,并且移除其不應該擁有的所有工作負載。
本文描述的容錯、可擴展協議通過復制和重新排序心跳和/或分配分組的遞送而恢復損失。當主節點120具有要被發送到一個或多個工作節點的信息時,可能出現這樣的情況,其中一些工作節點的分配比對其他工作節點的分配更重要(例如,因為一個分配相比其他分配涉及較高優先級工作負載)。為了確保首先傳送高優先級分配,主節點將高優先級分配推送到高優先級隊列中,并將正常分配推送到較低優先級隊列中。主節點可以被配置為在從較低優先級隊列發送分配分組之前完成高優先級隊列上的分配。這確保了在分配對時間關鍵的情況下,那些分配被首先發送。
使用本文所述的協議,工作節點和主節點可以容忍一個或多個網絡接口和/或通信路徑的失效。正如分配分組包含有關針對工作者的工作負載的信息和相應的版本號一樣,它還包括網絡接口的列表、互聯網協議(IP)地址的列表和與該信息相關聯的版本號。當工作者獲得分配分組時,它將針對接口的版本信息與本地版本信息進行比較。如果由主節點發送的信息的版本大于在工作節點處的信息的版本,則工作節點知道自從上次接收到該信息以來,一個或多個IP地址已經改變。工作節點更新其版本號,隨后的心跳分組具有更新的信息。當主設備接收到具有更新版本的下一個心跳分組時,它知道工作者具有最新的IP地址列表,并且它不需要將該信息傳送到工作節點,直到下一次在主節點上發生IP地址變更。
基于主節點的該IP地址列表,工作節點比較本地可用的IP地址列表,并標識多個通信路由以提供最大冗余。例如,如果主節點120在兩個子網上具有兩個接口,并且工作節點112在相同的兩個子網上具有兩個接口,則工作節點可以從主節點的每個接口中選擇一個IP地址用于通信。如果主節點在三個子網上有三個接口,并且工作節點具有與前面示例中相同的配置,則工作者從主節點上的每個接口中選擇一個IP地址進行通信,并允許網絡堆棧決定在將通信發送到遠程IP地址時使用哪個本地接口。這將在下面關于圖6進一步解釋。
當確定通信路由的健康時,被選擇用于通信的每個遠程端點可以以指示工作節點認為所有端點均健康的任意權重(例如100)開始。每60秒(或在一些其他可配置的時間間隔),工作節點可以發起針對下n個心跳分組的基于ACK的語義,其中n是遠程端點的數目。因此,即使關于工作節點的信息是最新的,如果主節點接收到分組,則以ACK響應。為了最小化臨時網絡故障對健康監視(例如,如果兩個接口共享相同的網絡交換機)可能具有的影響,基于ACK的語義在時間間隔(在該示例中為60秒)中擴展。因此,如果工作者具有用于主節點的三個遠程接口,則三個心跳將以20秒的間隔隔開。
當工作節點沒有從遠程端點(接口)獲得針對其尋求ACK的心跳分組的ACK時,工作節點將端點的權重減少一定量。然后,在每個時間間隔,當工作者發送心跳分組時,工作節點可以實施循環方法來選擇下一個可用端點。然后考慮端點的權重。如果權重為100,則使用該端點發送心跳。如果不是,工作者生成0到100之間的隨機數。如果生成的隨機數落在范圍[0,<endpoint_weight>]中,則該特定端點用于該時間間隔的通信。否則,選擇下一個端點,并遵循相同的方法。如果端點的權重變為零,則僅當端點正在尋找針對該分組的ACK時(在上面的示例中,每60秒一次,直到其分數增加),該端點才用于發送分配分組。由于遠程端點為不響應于ACK請求的心跳而被懲罰,如果通過遞增權重來接收ACK,則端點也被獎勵(盡管在上面的示例中,權重不能大于100)。
該方法使網絡流量的量最小化,并且如果至少一個遠程端點可達,則確保主節點將在n個時間間隔(n是可用遠程端點的數目)中獲得心跳分組。如果所有可用的端點都健康,則使用循環方法自動允許通過可用接口進行負載分配。主節點在從其接收到心跳的同一端點上回復心跳分組。為了確保來自許多不同工作節點的分組幾乎不同時到達主節點,每個工作節點可以將從范圍[0,差量]選擇的隨機數添加到時間間隔。至少在一些實施例中,該差量值通常將小于時間間隔。還應當注意,與其他配置參數(例如,工作負載的存儲器使用)相比,對應于工作負載的一些配置參數變更較小(例如工作負載狀態)。為了最大限度地減少針對每個工作負載在每個心跳中發送的數據量,針對工作負載的配置參數分為兩組。在每個心跳中僅發送對應于更頻繁變更的參數的信息。下面將分別關于圖2和圖3的方法200和300進一步解釋這些概念。
考慮到上述系統和架構,將參照圖2和圖3的流程圖更好地理解可以根據所公開的主題實現的方法。為了簡化說明的目的,將方法示出和描述為一系列框。然而,應當理解和明白的是,所要求保護的主題不受塊的順序的限制,因為一些塊可以以與本文所描繪和描述的順序不同的順序和/或與其他塊同時發生。此外,可能不需要所有所示的框來實現下文所描述的方法。
圖2示出了用于在節點集群中的計算節點之間通信的方法200的流程圖。現在將頻繁參考環境100的組件和數據來描述方法200。
方法200包括從工作節點接收標識該工作節點的當前工作負載標識符和健康狀態的數據分組的動作,該數據分組包括相關聯的版本標識符(動作210)。例如,計算機系統101的通信模塊104可以從工作節點112接收數據分組113。數據分組113可以是通知計算機系統101工作節點112仍然活躍且正在工作的心跳分組。心跳分組可以包括各種類型的信息,包括標識工作節點112的當前工作負載(例如,虛擬機或正在運行的其他應用或服務的數目和類型)的工作負載標識符116。工作負載標識符116可以包括用于每個工作負載114(例如VM、應用、服務或其他工作負載)的多個單獨的工作負載標識符115。或者,工作負載標識符116可以包括正由工作節點112處理的一組工作負載的單個標識符。
心跳分組還可以包括工作節點的健康狀態117作為版本標識符118的指示,該版本標識符118可以是數字或其他類型的標識符。版本標識符標識工作節點當前正在運行的工作負載配置的版本。如果計算機系統101(在一些實施例中其可以是主節點)確定工作節點正在運行過時的工作負載配置(如由比由主節點傳播的當前版本更舊的版本標識符所表明的),則計算機系統101知道在變更的指示119中發送更新的工作負載配置。
應當注意,不同的實施例可以涉及在諸如數據分組113之類的心跳分組中傳送不同的信息。例如,在一些情況下,工作節點112可以在心跳分組中發送完全工作負載配置和健康狀態117。在其他情況下,工作節點112可以發送在工作節點上運行的工作負載的工作負載標識符116以及健康狀態117和版本ID 118。在其他情況下,工作節點112可以發送工作負載標識符116和版本標識符118,并且在其他情況下,可以僅發送標識工作節點112正在運行的工作負載配置版本的版本ID 118。在后一種情況下。如果工作負載配置和狀態保持相同,則未來的心跳數據分組可僅包括全局版本號。因此,設想了許多不同的選項和優化,并且任何工作節點均可以在任何給定時間實現上述實施例中的任一個。
方法200還包括確定接收到的數據分組中的版本標識符不同于先前接收到的數據分組的動作(動作220)。計算機系統101的確定模塊105可以確定版本ID 118不同于先前接收到的心跳數據分組。例如,版本ID可以是諸如“版本31”或“版本6.0.1”之類的版本號。在一個分組中,版本可以是6.0.1,并且在下一個分組中,它可以被遞增以示出發生了變更。因此,后續心跳分組將包括6.0.2作為其版本標識符,以此類推,直到另一變更發生并且增加到6.0.3。無論對于版本標識符使用哪種編號、字母或命名方案,如果在分組之間的標識符存在差異,則將通知計算機系統101已經發生工作負載配置變更(例如,添加、移除或以某種方式改變工作負載),并且如果工作節點仍然不在最近的工作負載配置版本上,則計算機系統101可以繼續在分配分組119中發送更新的變更。
方法200接下來包括評估工作節點的當前工作負載配置以確定是否在工作節點上進行工作負載變更的動作(動作230)。計算機系統101的評估模塊106可以訪問工作負載配置或簡單地訪問工作負載標識符116以確定是否在工作節點上進行工作負載變更。例如,評估模塊106可以將工作節點的當前工作負載配置與主節點關于哪些工作負載要由工作節點112處理的指示進行比較。如果主節點關于哪些工作負載要由工作節點處理的指示不同于所接收到的工作負載配置,則主節點可以提供要應用于工作節點112上的更新的變更,以使其與主節點保持同步。
一旦已經確定要在工作節點上做出工作負載變更,方法200包括選擇工作負載變更的子集以應用于工作節點的動作(動作240),生成對工作節點的所選擇的工作負載變更的子集的指示(動作250),并且將所生成的工作負載變更的指示發送到工作節點(動作260)。計算機系統101的變更選擇模塊107可以選擇將哪些變更傳播到工作節點112。如上所述,在網絡帶寬方面可能有利的是避免超過正在用于傳送數據分組的協議的最大傳輸單元(MTU)。因此,所選擇的變更可以基于優先級(首先做出較高優先級變更)或數據大小,以便不超過針對給定數據分組的MTU。如果給定的更新分組不包括要被最終傳播到工作節點的所有變更,則該協議將最終提供所有的變更——它可能只需要更多的數據分組和更多的時間。最終,所有工作負載變更將通過分配分組傳播到工作節點,而不超過帶寬限制或傳輸單元限制。
因此,容錯通信協議可以用于在工作節點之間傳播工作負載變更。在一些實施例中,容錯協議可以指定計算系統101每個時間段發送或接收的數據分組的數目的上限。該上限可以控制例如在分鐘、小時、天或其他時間段內從一個或多個工作節點接收的心跳分組113的數目。附加地或可替代地,由協議指定的上限可以指示分配分組的數目(例如119)在指定時間段內低于某個數量。在一些情況下,上限可以基于主節點和工作節點的數目,使得在存在非常大數目的節點的情況下,上限可以比在存在更少節點的情況下更高。附加地或可替代地,可以為用于在計算環境100內傳送數據分組的每個協議指定不同的上限。
在一些實施例中,計算機系統101的確定模塊105可以確定帶寬限制適用于工作負載變更的指示119,并且可以將所選擇的工作負載變更的子集劃分為至少兩個指示消息。這些工作負載變更可以包括將工作負載(例如VM)添加到工作節點112,從工作節點移除工作負載或者改變工作節點上的一個或多個工作負載。對工作負載的改變可以包括改變工作負載的處理優先級、改變分配給工作負載的處理核心的數目、或改變影響如何在工作節點上托管或處理工作負載的其他設置。
計算機系統101的指示生成模塊109基于從變更選擇模塊107接收到的所選變更子集108來生成變更的指示119。發送到工作節點112的變更的指示119可以表示工作節點的工作負載配置的指示和主節點關于哪些工作負載要由工作節點處理的指示之間的差量。變更的指示還可以包括向工作節點指示要應用工作負載更新的更新版本號。因此,例如,工作者可以發送指示它當前正在處理四個工作負載的心跳分組,并且變更的指示119可以指示要在工作節點上處理第五工作負載。由此,工作節點將開始處理所標識的第五工作負載。可以使用工作負載ID 115來標識每個工作負載。由此,主節點可以比較工作負載ID的列表,并發送表示移除某工作負載ID、添加某工作負載ID或基于其標識符來改變工作負載的分配。
在一些情況下,將所生成的工作負載變更的指示(即119)作為狀態查詢消息的一部分發送到工作節點。因此,可以作為另一狀態查詢消息(其通常作為常規操作過程的一部分而被發送)的一部分來發送變更,而不是發送單獨的分配消息。該狀態查詢消息可以以對應于由工作節點正在處理的工作負載的優先級的指定間隔而被發送到工作節點。例如,如果工作負載具有高優先級,則將更頻繁地發送狀態更新,以確保正如預期地處理工作負載。可以為較低優先級工作負載發送較少的狀態更新,因為狀態更新不那么緊急。狀態查詢消息發送到工作節點的間隔可以根據為工作負載指定的優先級而動態地改變。如果工作負載的優先級增加,則狀態更新的頻率也可能增加。類似地,如果工作負載的優先級降低,則狀態更新的頻率可以相應地減少。可以對每個工作節點或由該工作節點處理的每個工作負載做出這些變更。
應當注意,上文和本文中所描述的容錯協議可以避免發送ACK分組,而是可以僅僅依賴輸入的心跳分組來確定適當的工作負載是否正由適當的工作節點處理,工作節點的健康狀態是什么,以及它們是否正在運行最新的工作負載配置(由附加到心跳分組的版本號指示)。此外,應當注意,容錯協議即使在級聯失效的情況下也限制消耗的帶寬量,并且仍然使進展傳播工作負載配置,即使分組被丟棄或者即使分組僅包括要對工作負載做出的變更的子集。每個心跳分組和每個狀態請求或分配分組包括版本標識符以使其他節點知道是否需要做出變更以及是否已經應用變更。
現在轉到圖3,示出了用于在節點集群中的計算節點之間通信的方法300的流程圖。現在將頻繁參考環境100的組件和數據來描述方法300。
方法300包括生成數據分組的動作,該數據分組包括工作節點負責的工作負載標識符(ID)的列表,該數據分組還包括針對每個工作負載ID的版本號和工作負荷健康狀態(動作310)。例如,計算機系統101的數據分組生成模塊110可以生成數據分組121,其包括工作節點112負責的工作負荷ID 122的列表,針對每個工作負荷ID的健康狀態117和標識正在實施哪個工作負荷配置的版本ID118。將數據分組121發送到節點集群中的主節點(例如120)(動作320)。例如,如圖4所示,節點集群可以包括主集群401和包括403A、403B和403C的一個或多個工作集群。主集群401可以包括基本上任何數目的主節點,包括主節點402A、402B和402C。每個主節點可以被配置為監視和控制由它們對應的工作集群的工作節點404A、404B和404C正在處理的工作負載。因此,主節點402A可以監視和控制工作集群403A的工作節點404A的工作負載,等等。
方法300還包括接收差量數據分組的動作,該差量數據分組包括指定要應用于工作節點的工作負載中的至少一個工作負載的所選變更的子集的信息(動作330)。計算機系統101的通信模塊104可以從主節點120接收指示要應用于工作節點112的所選變更子集124的差量數據分組123。附加地或可替代地,差量數據分組123可以直接發送到工作節點112。差量數據分組可以指示要應用于工作負載114的那些工作負載移除、添加或配置變更。每個變更可以與標識要對哪個工作負載做出變更的特定工作負載ID 115相關聯。然后可以將在差量數據分組中指定的工作負載變更的所選子集應用于工作節點上的至少一個工作負載(動作340)。
因此,以這種方式,如圖5所示,主節點501可以聲明要應用于給定工作負載或工作負載集合的變更的列表。該變更列表可以出現在指定所選變更503的差量數據分組502中。該差量數據分組(或單獨的數據分組)還可以包括工作負載配置509和版本ID 510。工作節點504接收這些變更并應用它們,更新它發送出的心跳分組中的版本號(例如版本ID 508)。心跳分組505然后返回到主節點501,包括當前工作負載標識符506(即,其當前正在處理的工作負載的標識符),其當前健康狀態597和指示它在哪個工作負載配置版本上進行操作的版本標識符508。以該方式,每個心跳間隔向主節點通知每個工作節點的狀態。如果心跳分組被丟棄,則主節點假定它是一個丟棄,并且將最終接收另一個心跳分組(直到主節點聲明工作節點廢棄并重新分配其工作負載的超時時段為止)。類似地,如果在主節點501與工作節點504之間丟棄差量或分配分組,則工作節點將繼續在舊工作負載配置上操作,直到接收到更新的差量分組。心跳分組將繼續告訴主節點工作者正在舊版本下操作,由此主節點將繼續發送差量分組,直到心跳指示適當的版本。
在一些實施例中,數據分組121(例如心跳分組)在隨機化的時間被發送到主節點,使得來自多個工作節點的數據分組在不同的時間被發送。隨機化時間可以基于具有在零與指定的心跳時間間隔之間的增加的差量時間的指定的心跳時間間隔。由此,所添加的差量時間空間相對于其他節點離開心跳,導致來自工作節點的交錯的心跳傳輸。在一些情況下,使用已由主節點120限制為每個時間段指定的帶寬量的容錯通信協議發送數據分組121。可以為每個協議指定該帶寬限制,并且使用給定協議的每個傳輸可以被隨機化以避免網絡流量中的尖峰。
圖6示出了以下情景,工作節點604向主節點601發送狀態查詢分組(即狀態請求或REQ分組)以驗證計算系統與主節點之間的物理鏈路正常工作。例如,工作節點604可以使用不同的物理路由(例如603A、603B或603C)與主節點601通信。每個路由可以具有不同類型的物理硬件(除了圖6所示的NIC或者作為圖6所示的NIC的替代),包括負載平衡器、路由器、網關等。在圖6所示的實施例中,工作者可以在路由603A上發送REQ,并接收確認包括NIC 602A的物理路由在正常工作的確認(ACK)消息。這樣的REQ消息可以分別通過路由603B和603C的NIC 602B和602C發送。然后可以沿著這些路由接收ACK消息。可以以指定的時間間隔發送REQ消息,這對于較高優先級工作負載或路由可能更頻繁。
如果工作節點604確定經過了指定的時間段而沒有從主節點601接收到ACK分組,則它可以減小針對主節點和/或路由的對應的可靠性分數605,其中可靠性分數指示主節點與計算系統之間的物理鏈路在正常工作的可能性。一旦從主節點601接收到ACK分組,則將主節點的可靠性分數增加到最大級別,指示主節點與計算系統之間的物理鏈路在正常工作。由此,工作節點可以能夠評估每個路由,并且如果路由停止工作,則可以切換到新的通信路由并指示應該修復或替換失效的路由上的物理硬件。
在一些情況下,如果閾值數目的主節點已失效或變得不可用,則工作節點可以在可靠性分數605減小之前動態地減少允許經過而不從主節點接收確認分組的時間量。因此,隨著主節點的可靠性分數降低,工作節點越來越不愿意等待確認分組,因為變得更加明顯的是,主節點可能已經失效。以該方式,主節點和工作節點可以以意識到帶寬的有效且容錯的方式進行通信,并且可以動態地適應變更的情況。因此,本文提供了促進主節點與工作節點之間的容錯和可擴展通信的方法、系統和計算機程序產品。
在不脫離其精神或描述特征的情況下,本文所描述的概念和特征可以以其他具體形式實施。所描述的實施例在所有方面都被認為僅是說明性的而不是限制性的。因此,本公開的范圍由所附權利要求而不是前述描述來指示。在權利要求的等同物的含義和范圍內的所有改變將被包括在其范圍內。