共享檔案系統主從
共享檔案系統主從
如果您有 SAN 或共享檔案系統,它可以用來提供高可用性,這樣如果一個代理程式被終止,另一個代理程式可以立即接管。
確保您的共享檔案鎖定運作正常
請注意,此容錯移轉系統的要求是分散式檔案系統(例如 SAN),其獨佔檔案鎖定能可靠運作。如果您沒有此類系統,請考慮改用 主從,它會實作類似的功能,但在使用 ActiveMQ Classic 執行複寫的本地檔案系統上,於一般硬體上運作。
OCFS2 警告
使用 OCFS2 測試時,兩個代理程式都認為自己擁有主鎖定 - 這是因為「OCFS2 僅支援使用 ‘fcntl’ 而非 ‘lockf 和 flock’ 進行鎖定,因此不支援 Java 的互斥檔案鎖定」。
來自 http://sources.redhat.com/cluster/faq.html#gfs_vs_ocfs2
OCFS2:不支援叢集感知 flock 或 POSIX 鎖定
GFS:完全支援叢集範圍的 flock 和 POSIX 鎖定,並支援使用。
請參閱此 JIRA 以瞭解更多討論:https://issues.apache.org/jira/browse/AMQ-4378NFSv3 警告
如果 NFSv3 客戶端異常終止(即 ActiveMQ Classic 主代理程式),NFSv3 伺服器將不會逾時該客戶端持有的鎖定。這實際上會使 ActiveMQ Classic 資料目錄無法存取,因為 ActiveMQ Classic 從代理程式無法取得鎖定,因此無法啟動。使用 NFSv3 解決此困境的唯一方法是重新啟動所有 ActiveMQ Classic 執行個體以重設所有內容。
使用 NFSv4 是另一個解決方案,因為其設計包含鎖定的逾時。當使用 NFSv4 且持有鎖定的客戶端發生異常終止時,根據設計,鎖定會在 30 秒後釋放,允許另一個客戶端取得鎖定。如需更多相關資訊,請參閱此部落格文章。
基本上,您可以從同一個共享檔案系統目錄執行任意數量的代理程式。第一個取得檔案獨佔鎖定的代理程式是主代理程式。如果該代理程式終止並釋放鎖定,則另一個代理程式會接管。從代理程式會處於迴圈中,嘗試從主代理程式取得鎖定。
以下範例說明如何為共享檔案系統主從設定代理程式,其中 /sharedFileSystem 是共享檔案系統上的某個目錄。它只是設定基於檔案的儲存區來使用共享目錄的情況。
<persistenceAdapter>
<kahaDB directory="/sharedFileSystem/sharedBrokerData"/>
</persistenceAdapter>
或
<persistenceAdapter>
<levelDB directory="/sharedFileSystem/sharedBrokerData"/>
</persistenceAdapter>
或
<persistenceAdapter>
<amqPersistenceAdapter directory="/sharedFileSystem/sharedBrokerData"/>
</persistenceAdapter>
啟動
在啟動時,一個主代理程式會取得代理程式檔案目錄的獨佔鎖定 - 所有其他代理程式都是從代理程式,並暫停等待獨佔鎖定。
客戶端應該使用容錯移轉傳輸來連線到可用的代理程式。例如,使用類似以下的 URL
failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)
只有主代理程式才會啟動其傳輸連接器,因此客戶端只能連線到主代理程式。
主代理程式故障
如果主代理程式遺失獨佔鎖定,則它會立即關閉。如果主代理程式關閉或發生故障,則其他從代理程式之一會取得鎖定,因此拓撲會切換為以下圖表
其他從代理程式之一會立即取得檔案系統的獨佔鎖定,然後開始成為主代理程式,啟動其所有傳輸連接器。
客戶端會失去與已停止主代理程式的連線,然後容錯移轉傳輸會嘗試連線到可用的代理程式 - 其中唯一可用的代理程式是新的主代理程式。
主代理程式重新啟動
您可以隨時重新啟動加入叢集的其他代理程式,它們會以從代理程式身分啟動,等待在主代理程式關閉或發生故障時成為主代理程式。因此,在重新啟動舊主代理程式後,會建立以下拓撲...
排程器支援
ActiveMQ Classic 維護獨立於持久性配接器設定的排程資訊。因此,對於共享檔案系統,務必明確告知 ActiveMQ Classic 在哪裡儲存排程器資訊。若要執行此操作,請在 broker
上設定 dataDirectory
屬性,例如
<broker xmlns="https://activemq.dev.org.tw/schema/core"
dataDirectory="/some/location"
brokerName="mmuserb2" useJmx="true" advisorySupport="false"
persistent="true" deleteAllMessagesOnStartup="false"
useShutdownHook="false" schedulerSupport="true">