Message QueueTM Enterprise Edition 支持使用代理群集:代理群集是一组协同工作为客户端提供消息传送服务的代理。通过使用群集,消息服务可以将客户端连接分布在多个代理上,从而根据消息流量相应地调整自己的操作。有关群集及其工作原理的概述,请参见 Message Queue 技术概述。
本章介绍如何管理代理群集,如何将代理连接到群集,以及如何配置代理群集。本章包含以下各节:
可通过为群集中的每个成员代理指定群集配置属性来定义群集。可以为群集中的每个代理单独设置这些属性,但是,通常较为方便的一种做法是将这些属性收集到所有代理均引用的一个中央群集配置文件中。这样可防止设置出现不一致的情况,并确保群集中的所有代理都共享相同、一致的配置信息。
表 14–9 中详细介绍了群集配置属性。其中包括以下内容:
imq.cluster.hostname 给出 cluster 连接服务(用于群集中代理之间的内部通信)的主机名或 IP 地址。 如果有多个主机可用,该设置会很有用:例如,如果一台计算机中安装了多个网络接口卡。
可以为每个代理单独设置 hostname 和 port 属性,但群集中所有代理的 brokerlist、masterbroker、url 和 transport 值必须相同。
以下部分介绍了如何设置代理的群集配置属性。可以对群集中的每个代理单独进行设置,也可以使用群集配置文件来集中进行设置。
可以在代理的实例配置文件(或在启动代理时的命令行)中设置代理的群集配置属性。例如,要创建由 host1 端口 9876 上的代理、host2 端口 5000 上的代理以及 ctrlhost 默认端口 (7676) 上的代理组成的群集,应在这三个代理的实例配置文件中包含以下属性:
imq.cluster.brokerlist=host1:9876,host2:5000,ctrlhost
请注意,如果采用此方法,则当群集配置需要更改时,您必须更新群集中每个代理的实例配置文件。
为保持一致性和易维护性,建议将所有共享群集配置属性收集到一个群集配置文件中,而不是分别为每个代理设置这些属性。采用此方法时,每个代理的实例配置文件必须将 imq.cluster.url 属性设置为指向该群集配置文件的位置:例如,
imq.cluster.url=file:/home/cluster.properties
然后群集配置文件定义群集中所有代理的共享配置属性,例如要连接的代理的列表 (imq.cluster.brokerlist)、用于 cluster 连接服务的传输协议 (imq.cluster.transport) 以及(可选)主代理的地址 (imq.cluster.masterbroker)。以下代码定义了与前面的示例相同的群集,其中在 ctrlhost 上运行的代理充当主代理:
imq.cluster.brokerlist=host1:9876,host2:5000,ctrlhost imq.cluster.masterbroker=ctrlhost
本节介绍如何将一组代理连接成一个群集,如何在现有群集中添加新代理,以及如何从群集中删除代理。
将代理连接成群集一般有两种方法:一种方法是通过命令行(使用 -cluster 选项)来实现,一种方法是通过在群集配置文件中设置 imq.cluster.brokerlist 属性来实现。无论采用哪种方法,启动的每个代理都每隔五秒钟就尝试与其他代理连接;在主代理(如果已配置)启动后,连接就会成功。如果群集中的某个代理在主代理之前启动,它将保持暂停状态,并拒绝客户端连接,直到主代理启动为止;之后,暂停的代理将自动进入正常运行状态。
要通过命令行配置代理群集,请在启动群集中的每个代理时使用 imqbrokerd 命令的 -cluster 选项指定群集中代理的完整列表。例如,以下命令启动一个新代理,并将它连接到在 host1 默认端口 (7676) 上运行的代理、在 host2 端口 5000 上运行的代理以及在默认主机 (localhost) 端口 9876 上运行的代理:
imqbrokerd -cluster host1,host2:5000,:9876
有一种更适用于生产系统的替代方法,即创建一个群集配置文件,它使用 imq.cluster.brokerlist 属性来指定要连接的代理的列表。然后群集中的每个代理必须将其自身的 imq.cluster.url 属性设置为指向该群集配置文件。
无论使用哪种方法,必须确保给群集中任何代理分配的地址都不会解析到网络回送 IP 地址 (127.0.0.1)。任何配置了这个地址的代理将不能连接到群集中的其他代理。
某些 Linux 安装程序自动将 localhost 条目设置为网络回送地址。在这些系统上,您必须修改系统 IP 地址,以便为群集中的所有代理设置正确的地址。
在设置群集的过程中,应针对加入群集的所有 Linux 系统检查 /etc/hosts 文件。如果系统使用静态 IP 地址,请编辑 /etc/hosts 文件以指定 localhost 的正确地址。如果地址已向域名服务 (Domain Name Service, DNS) 注册,请编辑 /etc/nsswitch.conf 文件以更改条目的顺序,使系统在查阅本地 hosts 文件前先执行 DNS 查找。/etc/nsswitch.conf 文件中的行应显示为如下顺序:
hosts:dns files
如果要在群集中的代理之间以安全加密的方式传送消息,请配置 cluster 连接服务以使用基于 SSL 的传输协议。请按照消息加密中的说明,为群集中的各个代理设置基于 SSL 的连接服务。然后,将每个代理的 imq.cluster.transport 属性设置为 ssl。可以在群集配置文件中进行此设置,也可以为每个代理单独进行此设置。
对群集中的任一代理执行以下命令:
imqcmd reload cls |
该命令强制每个代理重新加载群集配置,从而确保群集中代理的所有持久性信息都是最新的。注意,不必对群集中的每个代理都执行此命令;对任一代理执行此命令都会使所有代理重新加载群集配置。
(可选)在代理的 config.properties 文件中将 imq.cluster.url 属性的值设置为指向群集配置文件。
启动新代理。
如果未执行在群集中添加代理,请使用 imqbrokerd 命令行中的 -D 选项设置 imq.cluster.url 的值。
通过编辑 config.properties 文件或者使用 imqbrokerd 命令行中的 -D 选项设置以下属性的值:
从群集中删除代理的方法取决于群集最初是通过命令行创建的,还是通过中央群集配置文件来创建的。
如果群集是通过在命令行中使用 imqbrokerd 命令由代理连接而成的,则必须停止每个代理,然后通过在命令行中指定一组新的群集成员来重新启动它们。过程如下所述:
使用 imqcmd 命令停止群集中的每个代理。
重新启动仍然保留在群集中的代理(使用 imqbrokerd 命令的 -cluster 选项,并仅仅指定那些要保留的代理)。
例如,假设最初创建的群集包括代理 A、B、C,而且这三个代理是通过以下命令启动的:
imqbrokerd -cluster A,B, C |
要从群集中删除代理 A,请使用以下命令重新启动代理 B 和 C:
imqbrokerd -cluster B,C |
如果群集最初是通过在中央群集配置文件中使用 imq.cluster.brokerlist 属性指定其成员代理来创建的,则不必停止这些代理即可删除其中的某个代理。只需编辑配置文件来排除要删除的代理,强制群集中的其他代理成员重新加载群集配置,并重新配置被排除的代理,使它不再指向原来的群集配置文件。过程如下:
对保留在群集中的每个代理执行以下命令:
imqcmd reload cls |
该命令强制代理重新加载群集配置。
停止要从群集中删除的代理。
编辑该代理的 config.properties 文件,删除 imq.cluster.url 属性或为该属性指定其他值。
可以选择为群集指定一个主代理。主代理维护配置更改记录以跟踪群集的持久性状态所发生的任何变化。主代理是使用 imq.cluster.masterbroker 配置属性来标识的。该属性在群集配置文件中或在单个代理的实例配置文件中。
配置更改记录包含与群集关联的持久性实体(例如长期订阅和管理员创建的物理目的地)的相关更改信息。 群集中的所有代理在启动时都会咨询主代理,以更新与这些持久性实体有关的信息。如果主代理出现故障,就无法实现上述同步;有关详细信息,请参见主代理不可用时的情况。
因为配置更改记录中包含的信息很重要,所以要定期备份配置更改记录,以便在发生故障的情况下能够恢复此记录。这一点非常重要。 虽然从备份恢复的记录不包含群集持久性状态自备份以来发生的任何更改,但经常进行备份有助于将丢失的信息降到最少。备份和恢复操作还有利于压缩和优化配置更改记录中保留的更改历史,因为该记录会随时间的推移迅速膨胀。
使用 imqbrokerd 命令的 -backup 选项,并指定备份文件的名称。例如:
imqbrokerd -backup mybackuplog
关闭群集中的所有代理。
使用以下命令从备份文件中恢复主代理的配置更改记录:
imqbrokerd -restore mybackuplog |
如果为主代理分配了新的名称或端口号,请在群集配置文件中相应地更新 imq.cluster.brokerlist 和 imq.cluster.masterbroker 属性。
重新启动群集中的所有代理。
因为群集中的所有代理都需要利用主代理来执行持久性操作,因此,当主代理不可用时,群集中任一代理的以下 imqcmd 子命令都将返回一条错误消息:
create dst
destroy dst
update dst
destroy dur
自动创建的物理目的地和临时目的地均不受影响。
在没有主代理时,任何尝试创建长期订户或取消长期订阅的客户端应用程序都会收到一条错误消息。 但是,客户端可以成功地指定现有长期订阅,并与其进行交互。