第 14 章 设置代理集群
集群由多个已分组在一起的代理实例组成。代理集群通过在多个代理间分布消息处理负载来提高性能。另外,代理集群可以通过高可用性来最小化停机时间。
您可以在许多不同的集群拓扑中连接代理。在集群中,每个活跃代理管理自己的信息,并处理自己的连接。
您还可以平衡跨集群的客户端连接并重新分发信息,以避免代理不足。
14.1. 了解代理集群
在创建代理集群前,您应该了解一些重要的集群概念。
14.1.1. 代理集群如何平衡消息负载
当代理连接到集群时,AMQ Broker 会自动平衡代理之间的消息负载。这样可确保集群可以维护高消息吞吐量。
考虑四个代理的对称集群。每个代理都配置有名为 OrderQueue
的队列。OrderProducer
客户端连接到 Broker1
,并将消息发送到 OrderQueue
。Broker1
以轮循方式将消息转发到其他代理。连接到每个代理的 OrderConsumer
客户端会消耗消息。
图 14.1. 集群中的消息负载均衡
如果没有消息负载均衡,发送到 Broker1
的消息将保留在 Broker1
上,只有 OrderConsumer1
可以使用它们。
AMQ Broker 默认自动负载均衡消息,将第一个消息组分发到第一个代理,第二个信息组发送到第二个代理。代理启动的顺序决定了哪个代理是第一个、第二个代理,以此类推。
您可以配置:
- 集群将消息负载平衡到具有匹配队列的代理。
- 集群将消息负载平衡到具有活跃消费者匹配队列的代理。
- 集群不进行负载平衡,而是从没有消费者的队列重新分发消息到具有消费者的队列。
- 从队列自动重新分发没有消费者的消息的地址。
其他资源
-
消息负载均衡策略配置有每个代理的以太网连接中的
message-load-balancing
属性。更多信息请参阅 附录 C, 集群连接配置元素。 - 有关消息重新发布的详情,请参考 第 14.4.2 节 “配置消息重新发布”。
14.1.2. 代理集群如何提高可靠性
代理集群使高可用性和故障转移成为可能,这使其比独立代理更可靠。通过配置高可用性,您可以确保客户端应用程序可以继续发送和接收消息,即使代理遇到失败事件。
借助高可用性,集群中的代理被分组到 live-backup 组中。live-backup 组由一个实时代理组成,它会提供客户端请求,以及等待被动替换 live 代理(如果其失败)的一个或多个备份代理。如果发生故障,备份代理会替换其 live-backup 组中的 live 代理,客户端重新连接并继续其工作。
14.1.3. 集群限制
在集群环境中使用 AMQ 代理时应用以下限制。
- 临时队列
- 在故障转移期间,如果客户端有使用临时队列的消费者,则会自动重新创建这些队列。重新创建队列名称与原始队列名称不匹配,这会导致消息重新发布失败,并可以在现有的临时队列中保留消息。红帽建议您避免在集群中使用临时队列。例如,使用请求/回复模式的应用程序应该将固定队列用于 JMSReplyTo 地址。
14.1.4. 了解节点 ID
代理 节点 ID 是一个全局唯一标识符(GUID),在首次创建和初始化代理实例时,以编程方式生成代理实例的日志。节点 ID 存储在 server.lock
文件中。节点 ID 用于唯一标识代理实例,无论代理是独立实例还是集群的一部分。实时备份代理对共享相同的节点 ID,因为它们共享相同的日志。
在代理集群中,代理实例(节点)相互连接,并创建网桥和内部"store-and-forward"队列。这些内部队列的名称基于其他代理实例的节点 ID。代理实例还监控与其自身匹配的节点 ID 的集群广播。如果代理标识重复 ID,则代理会在日志中生成警告信息。
当您使用复制高可用性(HA)策略时,启动 master 代理并将 check-for-live-server
设置为 true
,搜索使用其节点 ID 的代理。如果 master 代理使用同一节点 ID 查找另一个代理,它不会启动,或者根据 HA 配置启动故障恢复。
节点 ID 是持久的,这意味着它在代理重启后保留。但是,如果您删除了代理实例(包括其日志),则节点 ID 也会被永久删除。
其他资源
- 有关配置复制策略的更多信息,请参阅配置复制高可用性。
14.1.5. 常见代理集群拓扑
您可以连接代理来形成 对称 或 链 集群拓扑。您实现的拓扑取决于您的环境和消息传递要求。
对称集群
在对称集群中,每个代理都连接到所有其他代理。这意味着,每个代理都不止一个跃点,而每个代理都没有其他代理。
图 14.2. 对称集群拓扑
对称集群中的每个代理都知道集群中所有其他代理上存在的所有队列,以及侦听这些队列的消费者。因此,对称集群可以比链集群以最佳方式负载均衡和重新分发信息。
对称集群比链集群更容易设置,但很难在阻止代理直接连接的环境中使用网络限制。
链集群
在链集群中,集群中的每个代理都没有直接连接到集群中的每个代理。相反,代理会在链的末尾使用一个代理组成一个代理,所有其他代理只是连接到链中的前和下一个代理。
图 14.3. 链集群拓扑
链集群比对称集群更难以设置,但当代理位于单独的网络上时,可能很有用,且无法直接连接。通过使用链集群,中间代理可以间接连接两个代理,以便消息在它们之间流,即使这两个代理没有直接连接。
14.1.6. 代理发现方法
Discovery 是集群中的代理相互传播其连接详情的机制。AMQ Broker 支持动态发现 和静态发现。
动态发现
集群中的每个代理都通过 UDP 多播或 JGroups 将连接设置广播到其他成员。在这个方法中,每个代理都使用:
- 一个 广播组,将其集群连接的信息推送到集群的其他潜在成员。
- 用于接收和存储集群中其他代理的集群连接信息的 发现组。
静态发现
如果无法在网络中使用 UDP 或 JGroups,或者要手动指定集群的每个成员,您可以使用静态发现。在这个方法中,通过连接到第二个代理并发送其连接详情,代理"加入集群"。然后,第二个代理将这些详情传播到集群中的其他代理。
14.1.7. 集群大小注意事项
在创建代理集群前,请考虑消息传递吞吐量、拓扑和高可用性要求。这些因素会影响集群中要包含的代理数量。
创建集群后,您可以通过添加和删除代理来调整大小。您可以在不丢失任何信息的情况下添加和删除代理。
消息传递吞吐量
集群应该包含足够的代理来提供您需要的消息传递吞吐量。集群中的更多代理,吞吐量越大。但是,大型集群可能比较复杂。
Topology
您可以创建对称集群或链集群。您选择的拓扑类型会影响您可能需要的代理数量。
更多信息请参阅 第 14.1.5 节 “常见代理集群拓扑”。
高可用性
如果您需要高可用性(HA),请考虑在创建集群前选择 HA 策略。HA 策略会影响集群的大小,因为每个主代理都应该至少有一个从代理。
更多信息请参阅 第 14.3 节 “实施高可用性”。