專利名稱:幫助協調獨立更新的分布式數據的方法和系統的制作方法
技術領域:
本發明一般地涉及分布式通信環境,并且特別地涉及對分布式通信環境的獨立更新的分布式數據進行協調。
背景技術:
分布式通信環境包括高度可用、可升級的系統,這些系統可用于各種情形,包括那些需要工作的高吞吐量或者系統的連續或近似連續的可用性的情形。
分布式環境的一個例子是具有一個或多個集群的集群式環境。集群包括例如多個共享資源并彼此協作以執行系統任務的操作系統實例。在集群式環境中,經常對信息進行復制,以使相同信息在集群的所有成員上可用。由于當并非所有成員都在線時成員可能會個別地或分組地進行更新,因此保持這些數據的一致性是很困難的。此外,將這些成員拆分(劃分)為不進行通信的子組要求當修復這種拆分時對在不同子組上所進行的更新進行協調。
目前,為了實現更新,提供了集中式更新日志或集中式數據服務器,或者通過僅當定數(quorum)的成員在線時才允許更新來保持一致性。然而,形成集群的成員通常希望在不依賴于集中式存儲或主成員(primary member)的情況下保持分布式的一致的信息。此外,定數要求是有缺陷的,原因是當定數達不到或丟失時,就不能進行處理。
基于前述內容,需要一種在沒有集中式存儲或定數要求的情況下用于實現更新和用于協調獨立更新的分布式數據的改進的能力。
發明內容
通過提供一種幫助協調分布式通信環境的數據的方法,克服了現有技術的缺點并提供了附加的優點。該方法包括例如確定分布式通信環境的一組分布式數據與該分布式通信環境的另一組分布式數據是否一致,其中該確定包括在確定中使用一個或多個局部單調遞增的值;以及響應于所述確定,對該一組分布式數據和該另一組分布式數據中的至少一組分布式數據進行更新,以協調該一組分布式數據與該另一組分布式數據之間的一處或多處不一致。
根據本發明的另一個方面,提供了一種幫助協調集群式通信環境的數據的方法。該方法包括例如由加入成員發起加入該集群式通信環境的集群的操作,該集群包括至少一個當前成員;由該至少一個當前成員中的當前成員向該加入成員提供當前成員構成數據結構;由該加入成員確定一組增量,該一組增量包括該加入成員與該當前成員之間的零處或多處數據不一致,該確定使用至少一個局部單調遞增的值;由該加入成員向該當前成員提供該一組增量以及加入成員的成員構成數據結構;由該當前成員確定一組增量,該一組增量包括該當前成員與該加入成員之間的零處或多處數據不一致,該確定使用至少一個局部單調遞增的值;由該當前成員解決該加入成員的一組增量與該當前成員的一組增量之間的零處或多處沖突,以提供一組已解決的增量;以及向該集群的一個或多個成員,包括該加入成員提供該一組已解決的增量。
在此還描述和要求保護對應于上述方法的系統和計算機程序產品。
通過本發明的技術可以實現更多的特征和優點。在此詳細地描述了本發明的其他實施例和方面,并且這些實施例和方面可以看作是所要求保護的發明的一部分。
在本說明書所附的權利要求書中作為例子特別地指出和明確地要求保護本發明的一個或多個方面。根據以下結合附圖而進行的詳細描述,本發明的前述和其他目標、特征和優點將顯而易見,在附圖中圖1示出了包含和使用本發明的一個或多個方面的通信環境的一個圖2A示出了根據本發明的一個方面的圖1的通信環境的集群的一個例子;圖2B示出了根據本發明的一個方面的存儲于一個成員上并被協調的所復制的信息的一個例子;圖3示出了根據本發明的一個方面的成員構成表的一個例子;圖4示出了根據本發明的一個方面的數據表的一個例子;圖5示出了根據本發明的一個方面的與成員加入集群相關聯的邏輯的一個實施例;圖6A示出了根據本發明的一個方面的與加入成員確定增量相關聯的邏輯的一個實施例;圖6B示出了根據本發明的一個方面的與當前成員確定增量相關聯的邏輯的一個實施例;圖7示出了根據本發明的一個方面的與確定沖突相關聯的邏輯的一個實施例;圖8示出了根據本發明的一個方面的與對增量進行復制相關聯的邏輯的一個實施例;圖9示出了根據本發明的一個方面的與對增量進行應用相關聯的邏輯的一個實施例;以及圖10示出了根據本發明的一個方面的與為了從一種或多種優化中受益而處理元數據相關聯的邏輯的一個實施例。
具體實施例方式
根據本發明的一個方面,提供了一種用于幫助協調通信環境的獨立更新的分布式數據的能力。為了協調數據,使用了局部單調遞增的值。這些值的例子包括本地計數器、單調遞增的本地時戳等。假設將來的值或時戳不會早于先前的值或時戳(即時間不會向后流轉)。
圖1中示出了包含和使用本發明的一個或多個方面的通信環境的一個例子。分布式通信環境100包括例如通過多個連接104互連的多個節點102。作為一個例子,節點102是RS/6000并且連接104是耦合這些節點的局域網(LAN)連接。作為另一個例子,節點102是通過局域網(LAN)連接、交換機、因特網連接和/或其他類型的連接而互連的個人計算機。此外,多種其他類型的節點和/或連接可以包括在包含和使用了本發明的一個或多個方面的環境中。此外,盡管在圖1的環境中包括了5個節點,但這只是一個例子并且僅用于說明的目的。通信環境可以包括任意數目的節點,這些節點中的一些或全部節點相互耦合。
通信環境100例如是集群式環境。在一個集群式環境中,有由集群成員形成的一個或多個集群。集群的集群成員共享資源并彼此協作以執行任務。例如,Novaes等人在2000年5月31日提交的序列號為09/583,677的題目為“A Method,System And Program Products For Managing AClustered Computing Environment(用于管理集群式計算環境的方法、系統和程序產品)”(存檔號為POU920000004US1)的專利申請中描述了集群式環境的一個例子的各個方面,在此通過引用的方式包含其全部內容。
作為一個例子,通信環境100包括具有多個成員202的集群200(圖2)。在這個特定的例子中,成員202是環境的節點;然而,在其他的例子中,成員是除節點之外的實體,諸如虛擬機或其他實體。盡管將集群200示出為具有5個成員,但是這只是用于說明的目的。集群200可以包括一個或多個成員,包括通信環境的所有節點(或其他實體)或節點(或其他實體)的子集。
在集群200中,在該集群的所有成員上復制信息。這樣,每個成員202包括例如一個成員構成表204(圖2b)和一個或多個數據表206。包括成員構成表和數據表的所復制的信息保持同步,以便集群的每個成員可以訪問相同的一致的信息。為了保持這種一致性,使用協調組件208,以下對其進行更詳細的描述。
參考圖3描述成員構成表204的一個例子。成員構成表204包括例如包含于集群中的成員302的列表;以及每個成員302的最后改變的時戳(LCTS)304。最后改變的時戳表示出現與該最后改變的時戳相關聯的成員是數據表中的一行數據的改變首項(change leader)的情況的最近時間。最后改變的時戳是本地(節點特定的)時間并且不是集群同步時間(cluster-synchronized time)。該值是單調遞增的,并且因此其不是時刻(time-of-day)值,而是計時器本身的基本值。成員構成表204還可以包括其他信息。
參考圖4描述數據表206的一個例子。數據表206包括多個數據行400(圖4),每一行包括例如唯一地標識數據行的關鍵字402;數據404;指示出負責發起對數據行的改變的成員的改變首項406;以及指定改變時間的改變時戳(CTS)408。在一個實施例中,每個集群一次只有一個改變首項。然而,在其他的實施例中,一次可以有多個改變首項是活動的。
協調組件208(圖2b)使用成員構成表和數據表來對已經獨立地更新并且未反映在一個或多個集群成員處的信息進行協調。例如,當集群的一個成員斷開了與集群的其他成員的通信并且在集群中或在該分離的成員處進行了更新時,會發生這種情況。當該成員重新與其他成員進行通信時,對該成員的信息和其他成員的信息進行協調。
作為另一個例子,在集群的成員于斷開的時間點上活動時使用協調。例如,假設5節點(節點1-5)集群的節點1和節點2是活動的,并且隨后停止。然后,集群的節點3-5是活動的。當所有的成員均為活動的時,使用協調來協調集群的彼此不進行通信的兩個子組所進行的更新,因為這些更新是由單獨的子組進行的。
為了成為集群的一個活動的成員,成員加入該集群。在此所用的術語“加入”是指在任意時間上一個成員在集群中變為活動的。作為例子,其包括從系統復位開始成員第一次在集群中變為活動的;以及/或者在集群劃分(即拆分)之后成員變為活動的。還可以存在其他例子,并且可以認為其他例子也包含在“加入”的定義以及本發明的一個或多個方面之內。
在一個實施例中,具有不同改變的多個成員可以同時加入。在這種情況下,集群的當前成員確定其相對于所有加入成員的改變。
協調組件包括用于協調不一致的信息的邏輯。例如,其包括用以將成員加入集群的加入邏輯,確定待協調的任意改變的增量確定邏輯,用以確定是否存在待解決的任意沖突的邏輯,用以將改變復制到集群的所有成員(或者在另一個實施例中,成員子集)的復制邏輯,以及用以對已確定的增量進行應用的應用邏輯。如有必要,則可以既協調數據表又協調成員構成表。以下參考加入處理來描述與協調有關的更多細節。
一個成員加入一個集群以成為該集群的活動成員。例如,成員1可能是集群A的成員,但是其可能不與該集群的其他成員進行通信,并且因此,其是該集群的非活動成員。為了成為活動成員,成員1加入該集群。該成員可以在該成員能夠與該集群的其他成員進行通信的任意時間上請求加入該集群。因此,即使該成員加入并且隨后發生故障,該成員也可以再次加入。
在加入處理期間,請求加入集群的成員確定其所具有的與集群信息不一致的信息。這稱作增量處理。同樣,集群確定該集群是否具有任何與該加入者不一致的信息。同樣,這稱作增量處理。
參考圖5來描述與加入處理相關聯的邏輯的一個實施例。首先,在步驟500中,提出請求以加入集群。在這個例子中,該請求由已經恢復與集群的通信的成員提出。在此將請求加入的成員稱作加入成員或加入者。
在步驟502中,響應于該加入請求,集群的當前成員(例如,集群首項)向該加入成員發送當前成員構成表。在步驟504中,該加入成員使用該成員構成表來確定其相對于當前在其要加入的集群中使用的表的一組增量。例如,加入成員使用其接收到的該成員構成表而針對該加入成員所維護的每個數據表中的每一行確定該行是否是需要由現有成員處理的增量(例如改變)。
可以以多種方式來確定增量。在一個例子中,按照參考圖6A所描述的那樣來執行處理。首先,在步驟600中,由加入成員選擇該加入成員的數據表的一行用于處理。在詢問602中,對當該行最后一次修改時該當前成員是否存在于該集群中進行判斷。如果該行的改變首項(CL)存在于該當前成員的成員構成表(CMT)中,并且如果該當前成員的成員構成表(CMT)中的改變首項的最后改變的時戳(LCTS)大于或等于該數據行的已改變的時戳(CTS)(即CMT[row.CL].LCTS>=row.CTS,其中表中的行用與C++相似的箭頭符號來表示,陣列索引是表關鍵字,并且行中的字段用點(.)來表示),則該當前成員是在線的。
如果當該行最后一次改變時該當前成員在線,則在步驟604中該行不是一個增量。然而,如果當該行最后一次改變時該當前成員不在線,則在步驟608中該行是發送給該當前成員的一個增量。當前成員在加入成員的增量組中維護該增量以便用于進一步的處理,下文將對此進行描述。
接下來,在詢問610中,對是否還有更多的行需要處理進行判斷。如果還有更多的行需要處理,則處理返回步驟600。否則,在步驟612中,對加入成員的增量處理完成。
返回圖5,如果有任何增量,則在步驟506中將增量(例如,數據表的已改變的行)和加入成員的成員構成表發送給當前成員。
除了上述內容之外,當前成員在步驟508中確定其是否具有相對于加入成員的任何增量。參考圖6B描述了這種邏輯的一個實施例。首先,在步驟650中,由當前成員選擇該當前成員的數據表的一行用于處理。在詢問652中,對當該行最后一次修改時該加入成員是否在該集群中進行判斷。如果該數據行的改變首項(CL)存在于該加入成員的成員構成表(JMT)中,并且如果該加入成員的成員構成表中的改變首項的最后改變的時戳(LCTS)大于或等于該行的CTS(即JMT[row.CL].LCTS>=row.CTS),則該加入成員是在線的。如果JMT[row.CL].LCTS>=row.CTS,則該改變在集群中是已知的。如果當該行最后一次改變時,該加入成員已經在線,則在步驟654中該行不是一個增量。另一方面,如果當該行最后一次修改時該加入成員不在線,則在步驟656中將該行添加到由當前成員創建并維護的當前成員的增量組中。
如果沒有任何增量,則在此之后在詢問658中對是否存在更多的行需要處理進行判斷。如果還有更多的行需要處理,則處理從步驟650繼續進行。否則,在步驟660中,與當前成員確定其增量相關聯的處理結束。
返回圖5,在當前成員確定其相對于加入成員的增量之后,假設存在增量,則在步驟510中,當前成員確定是否存在任何沖突,并且如果存在沖突則解決沖突。參考圖7描述了與確定沖突相關聯的邏輯的一個在一個例子中,為了確定是否存在沖突,在步驟700(圖7)中,從當前成員的增量組中選擇一行,并且在詢問702中對所選的行是否在加入成員的增量組中進行判斷。如果該行不在加入成員的增量組中,則沒有沖突,并且可以添加該行,下文將會對此進行描述。
然而,如果在詢問702中該行在加入成員的增量組中,則在詢問706中對該行的數據是否與該加入成員的行的數據相同進行判斷。如果兩行中的數據相同,則在步驟708中該行不是一個增量,并且可以從兩個增量組中將該行移除。
返回詢問706,如果兩行中的數據不同,則存在沖突,并且在詢問710中,對是通過選擇當前成員的增量還是通過選擇加入成員的增量來解決該沖突進行判斷。可以以多種不同方式來處理行沖突,這些方式包括仲裁的方式或者編程的方式,在仲裁的方式中,將兩行之一選擇為當前行,在編程的方式中,編寫一個程序來確定要使用的行。程序參考例如其他成員上的數據表來作出決定。在一個例子中,在選擇要使用的行時,對兩行的改變首項是否相同進行判斷。如果兩行的改變首項相同,則進一步對當前成員的LCTS和加入成員的LCTS哪一個更大進行判斷。選擇與較大的LCTS相關聯的行。
如果確定選擇當前成員的增量行,則在步驟714中從加入成員的增量組中移除該行。然而,如果確定通過選擇加入成員的增量行來解決沖突,則在步驟712中從當前成員的增量組中移除該行。
在步驟704、708、712或714之后,在詢問716中對是否有更多的行需要處理進行判斷。如果有更多的行需要處理,則處理從步驟700繼續進行。否則,沖突處理結束。
返回圖5,在解決沖突之后,在步驟512中,在本例中,將增量(如果存在)發送給所有的成員。參考圖8描述了與該處理相關聯的邏輯的一個實施例。在圖8的處理中,創建一個累積的增量組,其包括來自當前成員的增量組和加入成員的增量組的增量。在本例中,隨后將該累積的組發送給集群的所有成員。(在另一個例子中,將其發送給一個子集的成員)。
參考圖8,首先,在步驟800中,從當前成員的增量組中選擇一行,并在步驟802中將所選的行添加到累積的增量組中。在此之后,在詢問804中對該當前成員的增量組中是否有更多的行需要處理進行判斷。如果還有更多的行需要處理,則處理從步驟800開始繼續;否則,該邏輯就繼續處理加入成員的增量組。
在步驟806中,從加入成員的增量組中選擇一行,并且在步驟808中將該行應用到當前成員的表中。另外,在步驟810中,將該改變添加到累積的增量組。
然后,在詢問812中對加入成員的增量組中是否有更多的行需要處理進行判斷。如果還有更多的行,則處理從步驟806繼續進行;否則,在步驟814中,將累積的增量組發送給集群的所有成員,包括加入成員和已加入成員。
返回圖5,在將增量發送給所有成員之后(假設有增量需要發送),在步驟514中,對這些增量進行應用。參考圖9描述了與該處理相關聯的邏輯的一個實施例。圖9的處理是由接收到增量的每個集群成員執行的。
首先,在步驟900中,從累積的增量組中選擇一個增量行,并且在詢問902中對該行是否存在于執行該處理的成員的表中進行判斷。如果該行存在于表中,則在詢問904中進一步對該增量是否是“刪除”進行判斷。如果該增量是“刪除”,則在步驟906中刪除該行;否則,在步驟908中改變該行。在此之后,處理從如下所述的詢問912繼續進行。
返回詢問902,如果該行不存在于表中,則在詢問909中對該增量是否為“刪除”進行判斷。如果該增量是“刪除”,并且該行不存在,則不需要對該行進行處理,并且處理從如下所述的詢問912繼續進行。然而,如果該行不存在于該表中并且該該增量不是“刪除”,則在步驟910中添加該行,并且處理從詢問912繼續進行。
在詢問912中,對成員構成表是否需要更新進行判斷。作為一個例子,對該增量的改變首項的時戳是否大于該成員構成表中的改變首項的最后改變的時戳(即,CL.CTS>CL.LCTS)進行判斷。如果CL.CTS>CL.LCTS,則在步驟914中利用改變首項的最后改變的時戳來對成員構成表進行更新。在此之后,或者如果該成員構成表不需要進行更新,則在詢問916中對累積增量組中是否有更多的行需要被應用進行判斷。如果有更多的行需要被應用,則處理從步驟900開始繼續進行;否則,應用增量邏輯結束。由此,使用兩階段提交過程來提交所有成員處的改變,然后在假設該提交成功的情況下,結束加入處理。
如上所述,利用加入處理,與成員構成表相結合的數據表的改變首項和已改變的時戳的信息實現了對表改變的相對先后順序的確定。這提供了一種機制,其用于忽略先前已經包含在合并的表中的行。
在一個實施例中,不管加入成員是否具有任何增量,當前成員都復制已更新的表。這考慮的是加入成員不具有數據表或者當前成員的數據表中的行不在加入成員的數據表中的情況。如果成員的成員構成表被無意地(或惡意地)刪除了,則加入處理仍可以工作。在這種情況下,成員加入時不帶有成員構成表。當成員加入一個集群時,加入操作有效地引起全部表被傳送。這也是將新安裝的成員初次添加到集群的情況。然而,如果該成員是所出現的第一個成員,則其他的成員確定他們的所有表都是增量。在另一個實施例中,可能確定在當前成員的表中沒有任何數據,并且作為代替,復制該加入者的表。
在又一個實施例中,有多個加入成員。在這種情況下,每個加入成員都執行在此所述的處理,然而,當前成員確定其相對于任何加入成員是否具有增量。這在當前成員的圖表中引入了外部循環,其中在確定增量時針對加入成員的成員構成表中的每個表對當前成員的數據行進行檢查,并且還引入了一個循環,該循環用以在確定沖突時和在沖突解決之后移除未被選擇的增量時以及在當增量相同時從多個加入者的增量組中移除增量時檢查每個加入成員的增量組。
此外,在對增量進行應用時,在改變一行之前,成員(當前成員或加入者)將檢查該改變是否適用。因此,如果其成員構成表(MT)[row.CL].LCTS==row.CTS,則不需要對該改變進行處理并且可以跳過該改變(因為所選的增量來自于該節點)。在處理期間可以在每一個成員上進行該項操作,因為任何當前成員或加入成員都可能處于這種“健忘”的狀態。
由于加入成員已經是非活動的,因此加入集群所包括的步驟可能根據已經發生的處理而不同。因此,下面描述了為實現加入而發生的處理的不同例子。
例1簡單合并。這描述了子集群同時選擇一個當前成員來進行處理的拆分修復情況。
5個成員{N1-N5}。改變首項為N1。
所有成員上的成員構成表(MT)為成員 LCTSN10N20N30N40N50LCTS==0表示成員不曾是任何行的改變首項。
所創建的兩個數據行條目關鍵字CL CTSRG12 N1 0100CG5 N1 0101集群的MT成員 LCTSN10101
N20N30N40N50該集群隨后拆分(即劃分)。
子集群A={N1-N3},CL=N1。
子集群B={N4-N5},CL=N4。
子集群A改變了RG12關鍵字CL CTSRG12 N1 0200RG45 N1 0101子集群A的MT成員 LCTSN10200N20N30N40N50子集群B改變了RG45關鍵字CL CTSRG12 N1 0100RG45 N4 0200子集群B的MT成員 LCTSN10101N20N30N40200N50
修復了網絡拆分,并且子集群A和子集群B重新合并為一個完整的集群{N1-N5},CL=N1。假設子集群A的主項N1是當前成員。N1將N1的MT發送給所選的加入成員(N4)。N4隨后將計算一個增量,N4將這個增量發送給N1。N1隨后將針對N的增量的每一行而確定是否存在與該行的沖突。這可以描述為1.將N1.MT發送給N4。
2.針對N4中的每一行,確定N4是否具有增量。
a.N4.RG12.CL=N1。N1.MT[N1].LCTS=0200,N4.RG12.CTS=0100。
N1更大,因此N1具有更近的改變。RG12不是增量。
b.N4.RG45.CL=N4。N1.MT[N4].LCTS=0;N4.RH45.CTS=0200。
N4更大,因此RG45是增量。
3a.將來自N4的增量(RG45)連同N4.MT一起發送給N1。
3b.N1確定其相對于N4的增量。該檢查不是利用每個增量行,而是利用相對于N4的MT的數據表中的每個行。如果其是增量,則可以檢查從N4接收到的增量以查看該行是否為其中的增量以及其是否具有相同的數據值。
4.針對增量中的每一行,確定是否存在沖突。
a.針對行N1.RG45。N1.RG45.CL=N1。N4.MT[N1].LCTS=0101。N1.RG45.CTS=0101。它們相等,這意味著N4知道RG45的N1版本,因此N4.RG45是已更新的行。N1利用來自N4的行對RG45進行更新。
5.通過上述步驟,合并所有的數據行。現在合并成員構成行。針對N1.MT中的每一行,與N4中相同的行進行比較。選擇具有最大LCTS的行。
6.現在N1復制MT和數據表。
例2復雜合并如果集群{N1,N2,N3,N4,N5}具有完全復制的數據表和成員構成表,并且隨后拆分成子集群A{N1,N2,N3}和子集群B{N4,N5},則每一方都知道當劃分發生時有效的LCTS值。因此,如果A方進行了改變并定義了RG12,則該條目的CTS值將大于該行的CL的先前的LCTS。如果B方(N4,N5)改變了先前的用于RG45的條目,則該條目的CTS同樣將大于CL的先前的LCTS。
如果修復了該拆分并且兩個子集群準備合并,則A方將具有1行的增量組(RG12),并且B方將具有1行的增量組(RG45)。與上述的簡單情況相似,當應用到A方時,B方的增量將代替該行。
然而,假設N5在修復拆分之前發生故障。然后,當修復拆分時,成員N4將并入子集群A,從而成員構成為{N1-N4}。該行增量仍將被發現和應用。
如果隨后N4死機,使成員構成再次成為{N1-N3},并且再次修改了RG45,則RG45將會接收到已更新的CTS。更重要的是,RG45的CL值將從N4變為N1。注意,現在有行RG45的3個單獨的組。即成員構成{N1-N3},N4以及N5,并且它們都具有截然不同的CTS值。
如果N5隨后加入該集群,則N5將發現它相對于集群沒有增量,原因是對RG45的改變是當N4在集群中時應用的。而該集群將發現它相對于N5具有兩個必須應用的改變(RG12和RG45)。下面將進一步描述這個例子。
網絡拆分成子集群A={N1-N3},CL=N1以及子集群B={N4,N5},CL=N4。
子集群A的成員構成表成員 LCTSN10101N20N30N40N50子集群B的成員構成表成員 LCTSN10101N20
N30N40N50子集群A和子集群B上的數據行關鍵字CL CTSRG12 N1 0100RG45 N1 0101子集群A改變了RG12關鍵字CL CTSRG12 N1 0200RG45 N1 0101子集群B改變了RG45關鍵字CL CTSRG12 N1 0101RG45 N4 0200N5發生故障。A={N1-N3},B={N4}。
N4與A合并。A={N1-N4}。將N4上發生的RG45改變反映到A中。
子集群A的成員構成表成員 LCTSN10200N20N30N40200N50子集群A上的數據行關鍵字CL CTSRG12 N1 0200RG45 N4 0200
N4發生故障。使得A={N1-N3}。
子集群A(N1-N3)改變了RG45關鍵字CL CTSRG12 N1 0200RG45 N1 0201子集群A的成員構成成員 LCTSN10201N20N30N40200N50N5加入A方。
N5的成員構成成員 LCTSN10101N20N30N40200N50N5上的數據行關鍵字CL CTSRG12 N1 0101RG45 N4 02001.將N1.MT發送給N5。
2.針對N5中的每一行,確定N5是否具有增量。
a.N5.RG12.CL=N1。N1.MT[N1].LCTS=0201,N5.RG12.CTS=0101。行RG12的CTS小于N1的MT LCTS,因此N1上的數據行比N5上的數據行更近,因此該行不是增量。
b.N5.RG45.CL=N4。N1.MT[N4].LCTS=0200;N5.RG45.CTS=0200。N4的MT LCTS與行RG45中的N4的CTS相同,因此該行不是增量。
3.沒有增量被發送給N1,但是仍然合并成員構成表(在這種情況下,N1的成員構成表將不發生改變)。N1仍復制合并的成員構成表和數據表。
盡管在此描述了加入處理的例子,但是在不偏離本發明的精神的情況下可以對這一處理進行各種變更。作為一個例子,提供一種優化,其中處理和/或復制的信息保持最少。例如,在處理的早期階段(例如,在加入處理的初始階段)對是否有任何需要處理的增量進行判斷。如果沒有任何增量,則處理迅速停止。參考圖10對此進行了更詳細的描述。
參考圖10,如在此所描述的那樣,既在當前成員處又在加入成員處執行處理。首先,在步1000中,當前成員將其最后改變的時戳發送給加入成員,并且加入者將其最后改變的時戳發送給當前成員。在此之后,加入成員和當前成員中的每一個對當前成員的改變首項是否等于加入成員的改變首項進行判斷。在這一例子中,每個成員都知道另一個成員的首項;然而,在另一個實施例中,對改變首項信息進行交換。如果改變首項不同,則不對時戳進行比較,因此在步1006中,如果有增量,則當前成員和加入成員都將處理增量。然而,如果當前成員的改變首項與加入成員的改變首項相等,則在詢問1004中進一步對當前的LCTS是否與加入的LCTS相等進行判斷。如果當前的LCTS與加入的LCTS相等,則在步1008中沒有增量需要處理,并且處理完成。然而,如果當前的LCTS與加入的LCTS不相等,則在詢問1010中進一步對當前LCTS是否大于加入成員的LCTS進行判斷。如果當前LCTS大于加入成員的LCTS,則在步1012中當前成員可能具有增量。然而,如果當前成員的LCTS小于或等于加入的LCTS,則在步1014中加入成員可能具有需要處理的增量。如果在步1006和步1014中有需要處理的增量,則在步1016中,如以上參考圖6A和圖6B所述的那樣,處理從確定是否有任何增量開始繼續進行。
在上面的實施例中,如果沒有需要處理的增量,則處理結束。如果加入者或當前成員具有需要處理的增量,則處理繼續。當前成員將它的表的元數據(例如,成員ID、CL以及LCTS)發送給加入者,并且加入者將它的表的元數據發送給當前成員。對于每個表,分別對每個元數據的值進行比較。在當前成員或加入成員上只對那些具有增量的表進行處理。
在上述的例子中,已經假設成員在集群中的存在表示已經合并了在其中成員是改變首項的任意改變。然而,如果在特定成員上丟失了數據,則情況將不是這樣。例如,如果例如由于表刪除或替代,成員(例如,節點)上的成員構成表全部丟失,則成員已經忘記了當它作為改變首項存在時所進行的改變。該成員就叫做一個“健忘”的成員。
對于健忘的成員,對元數據進行交換以使得可以確定這種情況。當對表進行改變時,將針對該已改變的時戳保存為表中的元數據(CL.CTS),并且作為整組表的元數據。因此,每個表記錄所應用的最后時戳,并且成員構成表記錄應用到任意表的最后時戳。當成員加入時,其與當前的集群交換這組元數據,并且因此,可以確定該成員是否已經忘記了它的任何改變。例如,如果表已經被移除,則將元數據時戳交換為CL=0,CTS=0。這直接意味著包含在集群成員上的表應當在不考慮任何增量的情況下被使用。如果成員是加入該集群的第一個成員,則加入成員將發現整個數據表都將被看做增量并被用來與當前成員進行交換。
為了處理從不同成員移動或恢復表的情況,表的元數據還包含成員標識。因此,在導入后,成員能夠確定該表是否是在其自身上創建的,并且如果不是,則忽略并移除該表,用包含于加入成員的集群中的當前信息對該表進行替換。
如果重置了成員的系統時間,從而使時間值不再是單調遞增的,則這也可以被發現,因此不會使改變具有不正確的時戳。為了處理這一點,成員構成表的元數據還包含由成員自身形成的用于LCTS的條目。因此,在導入后,如果元數據LCTS小于系統時間,則將使用的值是LCTS+1,直到系統時間之類的時間重置為正確的值,或系統時間跟上改變計數器為止。這確保了值保持單調遞增。
如果兩種情況同時發生,則重置系統時間并將表恢復到前一個鏡像,以成員作為改變首項的一些改變將以大于正由成員使用的單調確定的值的CTS值存在于集群中。在這種情況下,復制的已解決的成員構成表包括晚于在成員上使用的單調遞增的值的LCTS值。當檢測到這一點時,將該值重置為包含于復制的成員構成表中作為該表的條目的值LCTS+1。
此外,如果將表恢復到先前的版本,并且將計時器向后調,則檢查接收到的成員構成表以查看LCTS是否大于所記錄的LCTS,并且將時戳設定為較大的值。對于多個加入者,這一處理相對于所有的成員構成表,即當前成員和所有加入者而進行。在增量處理期間進行檢測是因為最新的時戳存在于增量中。因此,該邏輯是如果row.CL==該成員&&row.CTS>該成員的MT[該成員],則將計時器更新為單調遞增的。(注意,這將時戳恢復為該成員為CL時的最后CTS。如果其他的成員未對改變進行記錄,則有可能在數據表被替換時這些改變已經丟失。)下面描述與健忘的成員相關聯的處理的例子。
例3健忘的成員(例如,節點)時間動作16:00 N1和N2是所定義的節點。
20:36 N1和N2開啟并運行,以N1作為主項。
23:45 將一個備份鏡像切換到磁帶上。
00:01 進行一個改變(C1).
00:45 N1發生故障,N2成為主項。
01:15 進行另一個改變(C2)。
02:15 一個人停止了N2。
02:23 N1被擦除(scratch)并從備份磁帶上重新加載。
03:02 N1啟動。
03:04 N2啟動并加入到與N1一起。改變C1和C2都只存在于N2上。
與上面的例子相似,當N2計算其增量時,C1和C2都在增量中,原因是在進行這些改變之前就恢復了成員構成表,N1和N2的LCTS都來自第一次備份發生之前。改變C1和C2在備份之后,因此當N2加入時,N2將正確地將C1和C2放在其增量中。N1接受了這兩個改變,原因是每一行的CTS都大于該行的CL的LCTS,并且這些行的N1的CTS小于N2針對這些行的CL而具有的LCTS。
上面詳細描述了用于在諸如集群成員之類的獨立更新的條目之間提供一致的信息的協調處理。除了上述內容之外,在此還敘述了兩種情形。一種情形是當表中的行被刪除時的情形,并且另一種情形是處理刪除的成員。
當數據表中的一行被刪除時,其被標記為已經被刪除,但是仍保留在數據表中。處理這種已刪除的行的一種方式是一旦刪除了一行就不允許改變。因此,如果檢測到增量改變,則忽略該改變并且該行仍保持為已刪除狀態。保留已經被刪除的行,直到集群的所有成員都在線為止,此時將這些“未處理的刪除”行從復制到加入成員的數據表中移除。如果在所有成員在線的同時刪除行,則無需將該行保留為“未處理的”并且可以移除該行。
如同對任意其他的數據行那樣處理已刪除的行。其包括指示出進行刪除的時間的時戳,并且可以作為增量被檢測并在加入處理期間被處理。一種潛在的機制是將刪除看做相對于改變具有優先權。因此,如果在沖突解決期間檢測到行的增量改變,則對刪除進行處理,而不是進行改變。
如果將刪除的行添加回表中(該行的關鍵字與已刪除的行的關鍵字相同),則如果成員都未記錄了對該行的未處理的刪除,則保留該行。還存在其他的機制,其在這些情況下通過使沖突解決處理確定應當保留哪一行來實現正確的處理。
在一個實施例中,對已刪除的行進行累積,直到每個成員都加入了該集群為止。如果所有的成員都存在于集群中,則可知每個成員都已經看到了該已刪除的行并且該已刪除的行可以被丟棄。
當刪除一個成員時,在成員構成表中將該成員標記為已刪除,并且將其保留在成員構成表中,直到所有的成員都已經加入為止。將已刪除的成員保留在成員構成表中是因為其成員ID(標識)和時戳可能在數據表中,并且該信息被用于確定增量。然而,已刪除的成員不計算在所需的成員數目中,以便丟棄已刪除的行或已刪除的成員。
當所有已定義的成員都已經加入集群時,從成員構成表中丟棄已刪除的成員。將數據表處理為移除該已刪除成員的條目。在表被復制之前,以該已刪除的成員作為改變首項值的行替換它們的時戳以表明處理該加入的當前集群成員是改變首項并且當前的時戳是已改變的時戳,使得數據表的行都不指向已刪除的成員。這一處理是以不可再分的方式進行的,因此從成員構成表中刪除成員并改變時戳標簽是以不可再分的方式進行的。如果這些動作之一失敗,則它們就都失敗。
在又一個實施例中,還處理已添加的成員的情況。在此,一個成員上的成員構成表具有比另一個成員上的成員構成表更多的條目。在這種情況下,如果時戳屬于一個不存在于成員構成表中的改變首項,則其被假設為一個增量。當解決成員構成表條目時,將該條目添加到成員構成表。
在另一個實施例中,不是單獨的節點個別地加入,而是通過拆分創建的兩個子集群在修復拆分之后又回到一起。在這種場景中,來自于一個子集群的一個成員被看做是當前成員,并且另一個子集群的一個成員被看做是加入者。在該加入子集群中的所有成員不需要處理合并步,但是需要進行增量應用和提交的處理。(注意,有可能有多于兩個子集群進行合并,并且因此仍會有多個加入者——來自于除了從中選擇當前成員的那個子集群之外的每個子集群的加入者)。
以上詳細描述了用于幫助協調通信環境的獨立更新的分布式數據的能力。為了協調數據,使用了局部單調遞增的值。這些值的一個例子是本地時戳。這些時戳是單調遞增的,因此確保了在更新中使用的將來的時戳早于先前的時戳。通過使用局部單調遞增的值,在不需要集中式更新日志,集中式數據服務器,共享磁盤或其他的共享介質,或者硬件時鐘的情況下對更新進行有利的協調。此外,在不需要定數的情況下進行協調。
在本發明的一個或多個方面中,以這樣一種方式在多個正在進行通信的節點之間復制永久性的數據,即允許在任意時間段上當未與其余節點進行通信的節點(包括已經從一組節點中被刪除的節點)的任意子集可能已經對數據進行了更新時,節點同時對已明確更新的數據條目以及未明確更新的條目進行正確的標識,允許在一些節點上刪除數據條目并且允許對從節點上丟失的數據進行檢測。
盡管上文已經描述了多個例子,但在不偏離本發明的精神的情況下,可以進行多種變更。例如,除了在此描述的那些環境之外的環境也可以包含和使用本發明的一個或多個方面。例如,盡管已經參考集群式環境描述了本發明的一個或多個方面,但是這只是一個例子。任何具有待協調的獨立更新的數據的環境都可以使用本發明的一個或多個方面。此外,集群或其他環境的成員可以不是節點,諸如可以是虛擬機或其他類型的實體。此外,在其他的實施例中,為了執行用于協調獨立更新的數據的加入處理或其他處理,可以進行一種或多種優化或其他改變。在其他的例子中,附加的、不同的或更少的邏輯可以作為協調組件的一部分。還有可能有多種其他的變更。
此外,盡管這些例子使用了時戳,但是可以使用任意的單調遞增的值,包括但不限于計數器。時戳只是一個例子。
本發明的一個或多個方面的能力可以以軟件、固件、硬件或它們的某些組合來實現。
本發明的一個或多個方面可以包括在具有例如計算機可讀介質的一種制造產品(例如一個或多個計算機程序產品)中。該介質中具有例如用以提供和實現本發明能力的計算機可讀程序代碼裝置或邏輯(例如指令、代碼、命令等)。這種制造產品可以作為計算機系統的一部分而包括或單獨地進行銷售。
另外,可以提供機器可讀的至少一種程序存儲裝置,其包含至少一個指令程序,該指令程序可由機器來執行以實現本發明能力。
在此描述的流程圖僅僅是例子。在不偏離本發明的精神的情況下,可以對在此描述的這些示圖或步驟(或操作)進行多種變更。例如,可以以不同次序來執行各步驟,或可以添加、刪除或修改各步驟。所有這些變更都應看做是所要求保護的發明的一部分。
盡管在此已經詳細示出和描述了優選的實施例,但是本領域的普通技術人員將很容易理解,在不偏離本發明精神的情況下,可以進行各種修改、添加、替換等,并且因此這些修改、添加、替換等都應看做是在所附權利要求書中所限定的本發明的范圍之內。
權利要求
1.一種幫助協調分布式通信環境的數據的方法,所述方法包括確定所述分布式通信環境的一組分布式數據與所述分布式通信環境的另一組分布式數據是否一致,其中所述確定包括在所述確定中使用一個或多個局部單調遞增的值;以及響應于所述確定,對所述一組分布式數據和所述另一組分布式數據中的至少一組分布式數據進行更新,以協調所述一組分布式數據與所述另一組分布式數據之間的一處或多處不一致。
2.根據權利要求1所述的方法,其中所述使用包括將所述一組分布式數據的局部單調遞增的值與所述另一組分布式數據的局部單調遞增的值進行比較。
3.根據權利要求1所述的方法,其中所述分布式通信環境包括集群式環境,所述一組分布式數據包括所述集群式環境的集群的一個成員的數據,并且所述另一組分布式數據包括所述集群的另一個成員的數據。
4.根據權利要求3所述的方法,其中所述一個成員包括所述集群的當前成員并且所述另一個成員包括所述集群的加入成員,并且其中所述使用包括將所述加入成員的局部單調遞增的值與從所述當前成員的成員構成數據結構中獲得的局部單調遞增的值進行比較,以確定所述加入成員是否具有一個或多個增量,其中與所述加入成員的局部單調遞增的值相關聯的值是為了從所述當前成員的成員構成數據結構中獲得局部單調遞增的值而用于所述當前成員的成員構成數據結構中的索引;以及將所述當前成員的局部單調遞增的值與從所述加入成員的成員構成數據結構中獲得的局部單調遞增的值進行比較,以確定所述當前成員是否具有一個或多個增量,其中與所述當前成員的局部單調遞增的值相關聯的值是為了從所述加入成員的成員構成數據結構中獲得局部單調遞增的值而用于所述加入成員的成員構成數據結構中的索引。
5.根據權利要求4所述的方法,其中用于所述當前成員的成員構成數據結構中的索引的值包括對與所述加入成員的局部單調遞增的值相關聯的數據的改變首項的指示,并且其中用于所述加入成員的成員構成數據結構中的索引的值包括對與所述當前成員的局部單調遞增的值相關聯的數據的改變首項的指示。
6.根據權利要求1所述的方法,其中所述分布式通信環境包括集群式環境,所述一組分布式數據包括所述集群式環境的集群的當前成員的數據,并且所述另一組分布式數據包括所述集群的加入成員的數據,并且其中所述使用包括將所述當前成員的局部單調遞增的時間值與所述加入成員的局部單調遞增的時間值進行比較,以確定所述當前成員和所述加入成員中的一個或多個是否具有相對于對方的一個或多個增量。
7.根據權利要求6所述的方法,其中所述比較是響應于所述當前成員的改變首項與所述加入成員的改變首項的比較結果為相等而進行的。
8.根據權利要求1所述的方法,其中在所述分布式通信環境的一個通信節點上維護所述一組分布式數據,并且所述另一組分布式數據是所述一組分布式數據的一組復制數據并且在所述分布通信環境的另一通信節點上維護所述另一組分布式數據,并且其中當所述一個通信節點與所述另一通信節點彼此不進行通信時,作為對所述一組分布式數據和所述另一組分布式數據中的至少一組分布式數據進行更新的結果,存在一處或多處不一致。
9.一種幫助協調集群式通信環境的數據的方法,所述方法包括由加入成員發起加入所述集群式通信環境的一個集群的操作,所述集群包括至少一個當前成員;由所述至少一個當前成員中的當前成員向所述加入成員提供當前成員構成數據結構;由所述加入成員確定一組增量,所述一組增量包括所述加入成員與所述當前成員之間的零處或多處數據不一致,所述確定使用至少一個局部單調遞增的值;由所述加入成員向所述當前成員提供所述一組增量以及加入成員的成員構成數據結構;由所述當前成員確定一組增量,所述一組增量包括所述當前成員與所述加入成員之間的零處或多處數據不一致,所述確定使用至少一個局部單調遞增的值;由所述當前成員解決所述加入成員的一組增量與所述當前成員的一組增量之間的零處或多處沖突,以提供一組已解決的增量;以及向所述集群的一個或多個成員,包括所述加入成員提供所述一組已解決的增量。
10.根據權利要求9所述的方法,其中由所述加入成員確定增量包括從所述加入成員的數據結構中選擇數據行;確定當所述數據行最后一次改變時所述當前成員是否存在于所述集群中,所述確定使用至少一個局部單調遞增的值;以及針對所述數據結構的零個或多個數據行重復所述選擇和確定。
11.根據權利要求9所述的方法,其中由所述當前成員確定增量包括從所述當前成員的數據結構中選擇數據行;確定當所述數據行最后一次改變時所述加入成員是否存在于所述集群中,所述確定使用至少一個局部單調遞增的值;以及針對所述數據結構的零個或多個數據行重復所述選擇和確定。
12.根據權利要求9所述的方法,其中所述發起包括同時向所述集群加入多個加入成員。
13.根據權利要求9所述的方法,其中所述加入成員的一組增量和所述當前成員的一組增量中的至少一組增量包括已刪除的行,并且其中保留所述已刪除的行,直到所述集群的所有非活動成員都已經加入所述集群為止。
14.根據權利要求9所述的方法,其中具有復制的且彼此一致的數據的多個加入成員準備加入所述集群,并且其中所述多個加入成員中的單個加入成員與所述發起、由當前成員進行的提供、由所述加入成員進行的確定、由所述加入成員進行的提供、由所述當前成員進行的確定以及所述解決相關聯。
15.一種幫助協調分布式通信環境的數據的系統,所述系統包括用于確定所述分布式通信環境的一組分布式數據與所述分布式通信環境的另一組分布式數據是否一致的裝置,其中所述用于確定的裝置包括用于在所述確定中使用一個或多個局部單調遞增的值的裝置;以及用于響應于所述確定而對所述一組分布式數據和所述另一組分布式數據中的至少一組分布式數據進行更新以協調所述一組分布式數據與所述另一組分布式數據之間的一處或多處不一致的裝置。
16.根據權利要求15所述的系統,其中所述用于使用一個或多個局部單調遞增的值的裝置包括用于將所述一組分布式數據的局部單調遞增的值與所述另一組分布式數據的局部單調遞增的值進行比較的裝置。
17.根據權利要求15所述的系統,其中所述分布式通信環境包括集群式環境,所述一組分布式數據包括所述集群式環境的集群的當前成員的數據,并且所述另一組分布式數據包括所述集群的加入成員的數據,并且其中所述用于使用一個或多個局部單調遞增的值的裝置包括用于將所述加入成員的局部單調遞增的值與從所述當前成員的成員構成數據結構中獲得的局部單調遞增的值進行比較以確定所述加入成員是否具有一個或多個增量的裝置,其中與所述加入成員的局部單調遞增的值相關聯的值是為了從所述當前成員的成員構成數據結構中獲得所述局部單調遞增的值而用于所述當前成員的成員構成數據結構中的索引;以及用于將所述當前成員的局部單調遞增的值與從所述加入成員的成員構成數據結構中獲得的局部單調遞增的值進行比較以確定所述當前成員是否具有一個或多個增量的裝置,其中與所述當前成員的局部單調遞增的值相關聯的值是為了從所述加入成員的成員構成數據結構中獲得所述局部單調遞增的值而用于所述加入成員的成員構成數據結構中的索引。
18.根據權利要求17所述的系統,其中用于所述當前成員的成員構成數據結構中的索引的值包括對與所述加入成員的局部單調遞增的值相關聯的數據的改變首項的指示,并且其中用于所述加入成員的成員構成數據結構中的索引的值包括對與所述當前成員的局部單調遞增的值相關聯的數據的改變首項的指示。
19.根據權利要求15所述的系統,其中所述分布式通信環境包括集群式環境,所述一組分布式數據包括所述集群式環境的集群的當前成員的數據,并且所述另一組分布式數據包括所述集群的加入成員的數據,并且其中所述使用包括將所述當前成員的局部單調遞增的時間值與所述加入成員的局部單調遞增的時間值進行比較,以確定所述當前成員和所述加入成員中的一個或多個是否具有相對于對方的一個或多個增量。
20.根據權利要求19所述的系統,其中所述比較是響應于所述當前成員的改變首項與所述加入成員的改變首項的比較結果為相等而進行的。
21.一種幫助協調集群式通信環境的數據的系統,所述系統包括加入成員,發起加入所述集群式通信環境的集群的操作,所述集群包括至少一個當前成員;所述至少一個當前成員中的當前成員,其向所述加入成員提供當前成員構成數據結構;所述加入成員確定一組增量,所述一組增量包括所述加入成員與所述當前成員之間的零處或多處數據不一致,所述確定使用至少一個局部單調遞增的值;所述加入成員向所述當前成員提供所述一組增量以及加入成員的成員構成數據結構;所述當前成員確定一組增量,所述一組增量包括所述當前成員與所述加入成員之間的零處或多處數據不一致,所述確定使用至少一個局部單調遞增的值;所述當前成員解決所述加入成員的一組增量與所述當前成員的一組增量之間的零處或多處沖突,以提供一組已解決的增量;以及所述集群的一個或多個成員,包括所述加入成員,其被提供所述一組已解決的增量。
22.根據權利要求21所述的系統,其中所述加入成員確定所述一組增量包括所述加入成員從所述加入成員的數據結構中選擇數據行;確定當所述數據行最后一次改變時所述當前成員是否存在于所述集群中,所述確定使用至少一個局部單調遞增的值;以及針對所述數據結構的零個或多個數據行重復所述選擇和確定。
23.根據權利要求21所述的系統,其中所述當前成員確定所述一組增量包括所述當前成員從所述當前成員的數據結構中選擇數據行;確定當所述數據行最后一次改變時所述加入成員是否存在于所述集群中,所述確定使用至少一個局部單調遞增的值;以及針對所述數據結構的零個或多個數據行重復所述選擇和確定。
24.根據權利要求21所述的系統,其中具有復制的且彼此一致的數據的多個加入成員準備加入所述集群,并且其中所述多個加入成員中的單個加入成員與所述發起、由當前成員進行的提供、由所述加入成員進行的確定、由所述加入成員進行的提供、由所述當前成員進行的確定以及所述解決相關聯。
25.一種產品,包括至少一個計算機可用介質,所述計算機可用介質具有用于幫助協調分布式通信環境的數據的計算機可讀程序代碼邏輯,所述計算機可讀程序代碼邏輯包括用于執行根據權利要求1-15中任意一項所述的步驟的指令。
全文摘要
對分布式通信環境的獨立更新的數據進行協調以便向該環境的多個成員,諸如集群式環境的集群的多個成員提供一致的數據。使用局部單調遞增的值來協調數據。在協調不一致的數據時所用的一類局部單調遞增的值是本地時戳。
文檔編號H04L29/08GK1964297SQ200610148459
公開日2007年5月16日 申請日期2006年11月10日 優先權日2005年11月10日
發明者杰弗里·S·盧卡施, 羅伯特·米勒 申請人:國際商業機器公司