Message QueueTM Enterprise Edition 支援使用代理程式叢集,也就是會共同協作,向用戶端提供訊息傳送服務的代理程式群組。叢集可使訊息服務透過分發用戶端的連線至數個代理程式,來延展其訊息流量的作業。如需叢集和其運作方式的一般說明,請參閱「Message Queue 技術摘要」。
本章描述如何管理代理程式叢集、將叢集與代理程式連線並進行配置。它包含下面各節:
您可以為叢集的每個代理程式成員指定叢集配置特性,以定義叢集。您可以為叢集中的每個代理程式個別設定這些特性,但通常較方便的做法是將所有配置特性集中至所有代理程式均參照的叢集配置檔案中。這樣可以防止違反合約的設定,並確保叢集中的所有代理程式都能共用相同且一致的配置資訊。
叢集配置特性詳述於表 14–9 中。這些部分包括:
imq.cluster.hostname 將主機名稱或 IP 位址賦予 cluster 連線服務,用於在叢集的各代理程式之間進行內部通訊。如果有多個主機,此設定才會有用:例如,如果一部電腦中有多個網路介面卡。
您可以單獨設定個別代理程式的 hostname 和 port 特性,但是叢集中所有代理程式的 brokerlist、masterbroker、url 和 transport 值必須相同。
以下各節描述如何設定代理程式叢集配置特性,可以為叢集中的每個代理程式個別設定,或者使用叢集配置檔案集中設定。
您可以在代理程式的實例配置檔案中 (或啟動代理程式時在指令行上) 設定叢集配置特性。例如,若要建立的叢集包含 host1 連接埠 9876 上、host2 連接埠 5000 上和 ctrlhost 預設連接埠 (7676) 上的代理程式,三個代理程式的實例配置檔案中都將包含以下的特性:
imq.cluster.brokerlist=host1:9876,host2:5000,ctrlhost
請注意,如果您需要變更叢集配置,則此方法要求更新叢集中所有代理程式的實例配置檔案。
基於一致性以及便於維護的考量,建議您將所有的共用叢集配置特性集合至單一叢集配置檔案中,而不要為每個代理程式個別地進行設定。在此方法中,每個代理程式的實例配置檔案都必須設定 imq.cluster.url 特性指向叢集配置檔案的位置,例如:
imq.cluster.url=file:/home/cluster.properties
接著,叢集配置檔案會為叢集中的所有代理程式定義共用配置特性,例如要連線的代理程式清單 (imq.cluster.brokerlist)、用於 cluster 連線服務的傳輸協定 (imq.cluster.transport ),以及可以選擇性設定的主代理程式的位址 (imq.cluster.masterbroker)。以下的程式碼定義與上一個範例中相同的叢集,其中在 ctrlhost 上執行的代理程式作為主代理程式:
imq.cluster.brokerlist=host1:9876,host2:5000,ctrlhost imq.cluster.masterbroker=ctrlhost
本節說明如何連線一組代理程式以形成一個叢集、將新的代理程式增加至現有叢集,以及從叢集中移除代理程式。
有兩種通用方法可將代理程式連線至叢集:從指令行使用 -cluster 選項進行連線,或在 叢集配置檔案中設定 imq.cluster.brokerlist 特性。無論使用哪種方法,您啟動的每個代理程式每 5 秒鐘會嘗試連線至其他代理程式;在此叢集中的主代理程式 (如果已配置) 啟動後,連線即可成功。如果叢集中有代理程式比主代理程式先啟動,則此代理程式將保持暫停狀態,從而拒絕用戶端連線,直到主代理程式啟動時;然後暫停的代理程式的全部功能將自動可用。
若要從指令行配置代理程式叢集,請在啟動每個代理程式時,使用 imqbrokerd 指令的 -cluster 選項,指定叢集的完整代理程式清單。例如,以下指令啟動新的代理程式,並將其連線至在 host1 的預設連接埠 (7676) 上執行的代理程式、在 host2 的連接埠 5000 上執行的代理程式,以及在預設主機 (localhost) 的連接埠 9876 上執行的代理程式:
imqbrokerd -cluster host1,host2:5000,:9876
另一種更適合用於生產系統的替代方法,就是建立一個使用 imq.cluster.brokerlist 特性的叢集配置檔案,以指定要連線之代理程式的清單。叢集中的每個代理程式均必須將自己的 imq.cluster.url 特性設定為指向此叢集配置檔案。
無論您使用哪種方法,都必須確定叢集中沒有代理程式位址解譯為網路迴路 IP 位址 (127.0.0.1)。任何配置為這個位址的代理程式將無法連線至叢集中的其他代理程式。
一些 Linux 安裝程式會自動將 localhost 項目設定為網路迴路位址。在這類系統上,您必須修改系統 IP 位址,這樣才能為叢集中的所有代理程式設定正確的位址。
在設定叢集時,請在參與叢集的所有 Linux 系統中檢查 /etc/hosts 檔案。如果系統使用的是靜態 IP 位址,請編輯 /etc/hosts 檔案,為 localhost 指定正確的位址。如果位址已註冊網域命名服務 (DNS),請編輯 /etc/nsswitch.conf 檔案以變更項目的順序,讓系統可以在參考本機 hosts 檔案之前執行 DNS 查找。/etc/nsswitch.conf 中的行應如下所示:
hosts:dns files
如果您想要在叢集中的代理程式之間以安全加密的方式進行訊息傳送,請配置 cluster 連線服務以使用 SSL 型傳輸協定。針對叢集中的每個代理程式,設定 SSL 型連線服務,如訊息加密中所述。然後再使用叢集配置檔案,或透過為每個代理程式個別設定的方式,將 imq.cluster.transport 特性設定為 ssl。
將新代理程式增加至叢集的程序取決於叢集是否使用叢集配置檔案。
向叢集中的每個代理程式發出以下指令:
imqcmd reload cls |
此指令強制所有代理程式重新載入叢集配置,確保此叢集中代理程式的所有永久性資訊均為最新的。請注意,您不需要為叢集中的每個代理程式發出此指令;只要對任何一個代理程式執行此指令,就會使得所有代理程式都重新載入叢集配置。
(選擇性) 在代理程式的 config.properties 檔案中設定 imq.cluster.url 特性的值,讓其指向叢集配置檔案。
啟動新的代理程式。
如果您並未執行將代理程式新增至叢集,請使用 imqbrokerd 指令行上的 -D 選項以設定 imq.cluster.url 的值。
您可以編輯 config.properties 檔案或使用 imqbrokerd 指令行上的 -D 選項來設定以下特性的值:
您用來從叢集中移除代理程式的方法,取決於原先是透過指令行建立叢集,還是使用集中叢集配置檔案所建立。
如果您是使用指令行的 imqbrokerd 指令將代理程式連線至叢集,則必須停止各代理程式,然後在指令行上指定一組新的叢集成員並重新啟動。程序如下:
使用 imqcmd 指令停止叢集中的各代理程式。
重新啟動將保留在叢集中的代理程式 (使用 imqbrokerd 指令的 -cluster 選項,指定要保留的代理程式)。
例如,假設您原本使用以下的指令來啟動 A、B 和 C 代理程式來建立包含這三者的叢集:
imqbrokerd -cluster A,B, C |
若要從叢集中移除代理程式 A,請使用以下指令重新啟動代理程式 B 和 C:
imqbrokerd -cluster B,C |
如果您原本是集中使用叢集配置檔案中的 imq.cluster.brokerlist 特性來指定叢集的成員代理程式以建立叢集,就不需要為了移除其中一個代理程式而停止所有的代理程式。反之,您只要編輯配置檔案來排除要移除的代理程式,以強制剩餘的叢集成員重新載入叢集配置,並重新配置已排除的代理程式,這樣它就不再指向相同的叢集配置檔案。程序如下:
向叢集中每個保留的代理程式發出以下指令:
imqcmd reload cls |
這會強制代理程式重新載入叢集配置。
停止要從叢集中移除的代理程式。
編輯此代理程式的 config.properties 檔案,移除 imq.cluster.url 特性或指定一個不同的值。
您可以選擇是否讓叢集擁有一個主代理程式,它可維護配置變更記錄,以記錄叢集持續性狀態中的任何變更。無論在叢集配置檔案或個別代理程式的實例配置檔案中,主代理程式都是由 imq.cluster.masterbroker 配置特性所識別。
配置變更記錄包含與叢集相關聯之永久性實體中的變更資訊,例如長期訂閱和管理員建立之實體目標。叢集中的所有代理程式會在啟動期間參考主代理程式,以更新這些永久性實體的資訊。主代理程式發生故障時,將無法進行這類同步化作業;如需更多資訊,請參閱當主代理程式無法使用時。
由於配置變更記錄包含重要資訊,您必須定期進行備份,使其能夠在發生故障的情況下復原。雖然從備份中復原將會失去自當時備份後叢集持續性狀態中的任何變更,但經常定期備份可儘量減低此潛在的資訊遺失。備份與復原作業可以有效地壓縮和最佳化包含在配置變更記錄中的變更歷史,且配置變更記錄能夠隨著時間而迅速增長。
使用 imqbrokerd 指令的 -backup 選項來指定備份檔案的名稱。例如:
imqbrokerd -backup mybackuplog
關閉叢集中的所有代理程式。
使用下列指令從備份檔案中復原主代理程式的配置變更記錄
imqbrokerd -restore mybackuplog |
如果您為主代理程式指定一個新的名稱或連接埠號,請相應地在叢集配置檔案中更新 imq.cluster.brokerlist 和 imq.cluster.masterbroker 特性。
重新啟動叢集中的所有代理程式。
由於叢集中的所有代理程式都需要主代理程式才能執行永久性作業,因此沒有可用的主代理程式時,叢集中所有代理程式的下列 imqcmd 子指令都會傳回錯誤:
create dst
destroy dst
update dst
destroy dur
自動建立的實體目標和暫時目標不受影響。
在未配置主代理程式的環境中,任何嘗試建立或取消長期訂閱的用戶端應用程式都會收到一個錯誤。但是用戶端可以指定並與現有的長期訂閱進行互動。