Share via


多重叢集通訊

設定網路的方式必須讓任何 Orleans 定址接收器都可以透過 TCP/IP 連線至任何其他 Orleans 定址接收器,而不論其所在位置為何。 達到此目的的確切方式不在 Orleans 的範圍內,因為其取決於部署定址接收器的方式和位置。

例如,在 Windows Azure 上,我們可以使用 VNet 來連線區域與閘道內的多個部署,以連線不同區域中的 VNet。

叢集識別碼

每個叢集都有自己的唯一叢集識別碼。叢集識別碼必須在全域設定中指定。

叢集識別碼可能不是空的,也可能包含逗號。 此外,如果使用 Azure 資料表儲存體,叢集識別碼可能不會包含資料列索引鍵禁止的字元 (/、 、#、?)。

我們建議針對叢集識別碼使用非常簡短的字串,因為叢集識別碼會經常傳輸,且可能會由某些記錄檢視提供者儲存在存放區中。

叢集閘道

每個叢集都會自動指定其作用中定址接收器的子集作為「叢集閘道」。 叢集閘道會直接向其他叢集公告其 IP 位址,因此可作為「第一個連絡點」。 根據預設,最多可將 10 個定址接收器 (或任何設定為 MaxMultiClusterGateways 的數量) 指定為叢集閘道。

不同叢集中定址接收器之間的通訊「不」一定會通過閘道。 一旦定址接收器得知並快取粒紋啟用的位置 (不論叢集為何),其都會直接將訊息傳送至該定址接收器,即使定址接收器不是叢集閘道也一樣。

Gossip

Gossip 是叢集共用設定和狀態資訊的機制。 如名稱所示,gossip 是分散式且為雙向:每個定址接收器都會直接與相同叢集中和其他叢集中的其他定址接收器通訊,以雙向交換資訊。

內容。 Gossip 包含下列部分或所有資訊:

  • 目前時間戳記的多重叢集組態
  • 包含叢集閘道相關資訊的字典。 索引鍵是定址接收器位址,而值包含 (1) 時間戳記、(2) 叢集識別碼,以及 (3) 狀態,也就是作用中或非作用中。

快速和緩慢傳播。 當閘道變更其狀態,或操作員插入新的設定時,此 gossip 資訊會立即傳送至所有定址接收器、叢集和 gossip 通道。 這會快速發生,但並不可靠。 如果訊息因為任何原因 (例如爭用、中斷的通訊端、定址接收器失敗) 而遺失,我們的定期背景 gossip 可確保資訊最終會擴張,但速度較慢。 所有資訊最終都會傳播到任何地方,且對於偶爾的訊息遺失和失敗具有高度彈性。

所有 gossip 資料都具有時間戳記,這可確保新的資訊會取代較舊的資訊,而不論訊息的相對時間為何。 例如,較新的多叢集設定會取代較舊的叢集設定,而較新的閘道相關資訊會取代該閘道的較舊資訊。 如需 gossip 資料表示的詳細資料,請參閱 MultiClusterData 類別。 其具有結合 gossip 資料的 Merge 方法,即使用時間戳解決衝突。

Gossip 通道

當接收器第一次啟動,或在失敗後重新啟動時,必須要有方法可以啟動 gossip。 這是可在定址接收器設定中設定的「gossip 通道」角色。 啟動時,定址接收器會從 gossip 通道擷取所有資訊。 啟動之後,定址接收器會定期、每隔 30 秒或設定為 BackgroundGossipInterval 的任何間隔進行通訊。 每次同步處理其 gossip 資訊時,都會隨機從所有叢集閘道和 gossip 通道中選取合作夥伴。

  • 雖然並非嚴格必要,但建議您一律在不同區域中至少設定兩個 gossip 通道,以取得更好的可用性。
  • 與 gossip 通道的通訊延遲並不嚴重。
  • 多個不同的服務可以使用相同的 gossip 通道而不會產生干擾,只要 ServiceId Guid (依其各自的設定所指定) 不同即可。
  • 只要通道足以讓定址接收器一開始與「gossip community」連線,就不需要嚴格要求所有定址接收器都使用相同的 gossip 通道。 但是,如果 gossip 通道不是定址接收器設定的一部分,而該定址接收器是閘道,則不會將其狀態更新推送至通道 (快速傳播),因此在透過定期背景 gossip (緩慢傳播) 時,更新到達通道之前可能需要較長的時間。

Azure 資料表型 gossip 通道

我們已根據 Azure 資料表實作 gossip 通道。 設定會指定用於 Azure 帳戶的標準連接字串。 例如,設定可以指定兩個具有個別 Azure 儲存體帳戶 usaeurope 的 gossip 通道,如下所示:

var silo = new HostBuilder()
    .UseOrleans(builder =>
    {
        builder.Configure<MultiClusterOptions>(options =>
        {
            options.GossipChannels.Add(
                "AzureTable",
                "DefaultEndpointsProtocol=https;AccountName=usa;AccountKey=...");
            options.GossipChannels.Add(
                "AzureTable",
                "DefaultEndpointsProtocol=https;AccountName=europe;AccountKey=...")
        });
    })

多個不同的服務可以使用相同的 gossip 通道而不會產生干擾,只要其各自設定所指定的 ServiceId Guid 不同即可。