纯主从
警告
LevelDB 存储已从生产环境中移除。此页面仅作为先前版本的存档页面。请改用 共享存储主从。
纯主从
此功能已弃用,将在 5.8 版本中移除。
此功能将在 5.8 中移除,因为它尚未发展到生产就绪状态。建议您使用 共享存储主从 或 复制 LevelDB 存储。请参阅 AMQ-4165
纯主从配置提供了一个基本的无共享、完全复制的拓扑结构,它不依赖于共享文件系统或共享数据库。
纯主从的工作原理
-
主代理的从代理会从主代理中获取所有消息状态 - 消息、确认和事务状态。
当从代理主动连接到主代理时,它不会允许或启动任何网络或传输连接器,它的唯一目的是复制主代理的状态。 -
主代理仅在将消息交换成功传递给从代理后才会响应客户端。例如,一个提交
在客户端事务中,只有在主代理和从代理都处理了提交后才会完成。 - 如果主代理出现故障(例如硬件故障),从代理可以选择两种操作模式
- 启动所有网络和传输连接器 - 允许连接到主代理的客户端在从代理上恢复。
- 或者可以配置为关闭。在这种模式下,从代理仅用于复制主代理的状态。
- 客户端应使用故障转移传输来首先连接到主代理,然后再连接到从代理。例如,使用以下 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,则从代理将在主代理出现故障时关闭,否则从代理将接管成为新的主代理。从代理确保在另一台机器上有一个每个消息和确认的单独副本,这可以防止灾难性的硬件故障。如果主代理出现故障,您可能希望从代理也关闭,因为您可能始终希望将消息复制到两个物理位置,以防止在灾难性数据中心或硬件故障时丢失消息。如果您希望系统在主代理出现故障后继续运行,则将此标志保留为 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.apache.org/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>