第 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, Cluster Connection Configuration Elements。 - 有关消息重新分发的详情,请参考 第 14.4.2 节 “配置消息重新分发”。
14.1.2. 代理集群如何提高可靠性
代理集群使高可用性和故障转移成为可能,使其比独立代理更可靠。通过配置高可用性,您可以确保客户端应用程序可以继续发送和接收消息,即使代理遇到失败事件。
使用高可用性功能时,集群中的代理被分组到 live-backup 组。live-backup 组包含提供客户端请求的实时代理,以及一个或多个备份代理(如果是被动)替换实时代理(如果失败)。如果发生故障,备份代理会替代其 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)策略时,启动并设置了 check-for-live-server
的主
代理会搜索使用其节点 ID 的代理。如果 master 代理使用相同的节点 ID 找到另一个代理,则根据 HA 配置启动或启动故障恢复。
节点 ID 是持久的,这意味着它可在重启代理后保留。但是,如果您删除一个代理实例(包括其日志),则节点 ID 也会被永久删除。
其他资源
- 有关配置复制 HA 策略的更多信息,请参阅配置复制高可用性。
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 策略会影响集群的大小,因为每个 master 代理应该至少有一个从代理。
更多信息请参阅 第 14.3 节 “实施高可用性”。