第 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 用于唯一标识代理实例,无论代理是独立实例还是集群的一部分。live-backup 代理对共享相同的节点 ID,因为它们共享相同的日志。
在代理集群中,代理实例(节点)相互连接,并创建网桥和内部 "store-and-forward" 队列。这些内部队列的名称基于其他代理实例的节点 ID。代理实例还监控集群广播,以了解与其自身匹配的节点 ID。如果日志标识了重复的 ID,代理会在日志中生成警告消息。
当您使用复制高可用性(HA)策略时,启动并把 check-for-live-server
设置为 true
的 master 代理会搜索使用节点 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 节 “实现高可用性”。