純主從式
警告
LevelDB 儲存已從生產環境中移除。此頁面僅作為先前版本的歸檔頁面。請改用共用儲存主/從式。
純主從式
此功能已被棄用,將在 5.8 版本中移除
此功能將在 5.8 版本中移除,因為它尚未發展到可供生產環境使用的程度。建議您改用共用儲存主/從式或複製的 LevelDB 儲存。請參閱AMQ-4165
純主從式配置提供了一個基本、不共享任何資源的完全複製拓撲,它不依賴共享檔案系統或共享資料庫。
純主從式如何運作
-
主代理的從屬代理會消耗來自主代理的所有訊息狀態 - 訊息、確認和交易狀態。
當從屬代理主動連線到主代理時,它不會允許或啟動任何網路或傳輸連接器,它的唯一目的是複製主代理的狀態。 -
只有當訊息交換已成功傳遞到從屬代理時,主代理才會回應客戶端。例如,一個 commit
在客戶端的交易中,除非主代理和從屬代理都處理了該 commit,否則不會完成。 - 如果主代理發生故障(例如,硬體故障),從屬代理可以選擇兩種操作模式
- 啟動其所有網路和傳輸連接器 - 允許連線到主代理的客戶端在從屬代理上恢復。
- 或者可以配置為關閉。在這種模式下,從屬代理僅用於複製主代理的狀態。
- 客戶端應使用容錯移轉傳輸來首先連線到主代理,然後連線到從屬代理。例如,使用類似以下的 URL
failover://(tcp://masterhost:61616,tcp://slavehost:61616)?randomize=false
randomize 屬性只是停用隨機性,以便傳輸始終首先嘗試主代理,如果無法連線到主代理,則嘗試從屬代理。請注意,從屬代理在成為主代理之前不會接受連線
純主從式的限制
- 只有一個從屬代理可以連線到主代理
- 如果沒有關閉從屬代理,則無法重新引入發生故障的主代理(沒有自動容錯回復)
- 代理之間沒有自動同步。這是一個手動過程。
復原純主從式拓撲
這是一個手動過程 - 一旦主代理發生故障,確保拓撲再次同步的唯一方法是手動
- 關閉從屬代理(客戶端不需要關閉 - 如果它們是容錯移轉客戶端,它們會等到拓撲重新建立)
- 將資料目錄從從屬代理複製到主代理的資料目錄上
- 重新啟動主代理和從屬代理
配置純主從式
您不應配置主代理和從屬代理之間的連線。連線是使用從屬代理的配置自動建立的。如果明確配置網路連線,則當主代理處於高負載時,可能會遇到競爭條件。
主代理不需要任何特殊配置 - 它在從屬代理附加自身之前是一個正常的代理。
要將代理識別為從屬代理 - 只需設定一個屬性(見下文),如這個範例所示 - 因此配置非常簡單
<broker masterConnectorURI="tcp://masterhost:62001" shutdownOnMasterFailure="false">
<persistenceAdapter>
<journaledJDBC journalLogFiles="5" dataDirectory="${activemq.base}/data/broker2" />
</persistenceAdapter>
<transportConnectors>
<transportConnector uri="tcp://slavehost:61616"/>
</transportConnectors>
</broker>
代理屬性|預設值|描述 —|—|— masterConnectorURI|null|主代理的 URI,例如 tcp://masterhost:62001
shutdownOnMasterFailure|false|如果為 true,則當主代理發生故障時,從屬代理將關閉,否則從屬代理將接管成為新的主代理。從屬代理確保每個訊息和確認在另一台機器上都有一個單獨的副本,可以防止災難性的硬體故障。如果主代理發生故障,您可能希望從屬代理也關閉,因為您可能總是希望將訊息複製到 2 個實體位置,以防止在災難性資料中心或硬體故障時訊息遺失。如果您希望系統在主代理故障後繼續運行,則將此標誌保留為 false。waitForSlave|false|版本 5.2+,如果為 true,則主代理將等到從屬代理附加後再完成其啟動順序 shutdownOnSlaveFailure|false|版本 5.2+,如果為 true,則如果從屬代理連線遺失,主代理將關閉,確保主代理不會與從屬代理失去同步。
配置從屬代理的身份驗證
在 ActiveMQ Classic 4.1 或更高版本中,您可以使用 <masterConnector/>
元素作為替代的 XML 配置機制,如以下範例中所示,以配置從屬代理將用於連線到主代理的使用者名稱和密碼
<broker brokerName="slave" useJmx="false" deleteAllMessagesOnStartup="true" xmlns="https://activemq.dev.org.tw/schema/core">
<services>
<masterConnector remoteURI= "tcp://127.0.0.1:62001" userName="James" password="Cheese"/>
</services>
<transportConnectors>
<transportConnector uri="tcp://127.0.0.1:62002"/>
</transportConnectors>
</broker>