![]() | |
Sun Java System Message Queue 3 2005Q1 管理指南 |
第 9 章
使用代理群集Message Queue Enterprise Edition 支持使用代理群集:一组协同工作为客户机提供消息传送服务的代理。通过使用群集,消息服务器可将客户机连接分布在多个代理上,从而调整对消息流量的操作。有关群集及其工作原理的概述,请参见 Message Queue 技术概述。
本章介绍如何管理代理群集、将其与代理连接以及对其进行配置。它包含以下各节:
群集配置属性可通过为群集中的每个成员代理指定群集配置属性来定义群集。可为群集中的每个代理单独设置这些属性,但是,通常将这些属性收集到所有代理参考的中心群集配置文件中会更方便一些。这样,可防止设置出现不一致的情况,确保群集中的所有代理都共享相同、一致的配置信息。
表 14-11 中详细介绍了群集配置属性。其中包括以下内容:
- imq.cluster.brokerlist 给出了属于群集的所有代理的主机名和端口号。
- imq.cluster.masterbroker 指定跟踪状态变化的主代理(如果有)。
- imq.cluster.url 指定群集配置文件(如果有)的位置。
- imq.cluster.hostname 给出 cluster 连接服务(用于群集中代理之间的内部通信)的主机名或 IP 地址。如果有多个可用主机,该设置可能比较有用:例如,如果一台计算机中安装了多个网络接口卡。
- imq.cluster.port 给出 cluster 连接服务的端口号。
- imq.cluster.transport 指定 cluster 连接服务所使用的传输协议,例如 tcp 或 ssl。
可为每个代理单独设置 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 属性设置为指向该群集配置文件。
Linux 前提条件:设置 IP 地址
在 Linux 系统中,将代理连接为群集时有一个特殊的前提条件。某些 Linux 安装程序自动将 localhost 条目设置为网络回送 IP 地址 (127.0.0.1)。您必须设置系统的 IP 地址,以便为群集中的所有代理设置正确的地址。
对于加入群集的所有 Linux 系统,选中 /etc/hosts 文件作为群集设置的一部分。如果系统使用静态 IP 地址,请编辑 /etc/hosts 文件以指定 localhost 的正确地址。如果地址是使用域名服务 (DNS) 注册的,请编辑 /etc/nsswitch.conf 文件以更改条目顺序,使系统在查阅本地 hosts 文件前执行 DNS 查找。/etc/nsswitch.conf 文件中行的读取顺序如下:
hosts:dns files
代理间的安全连接
如果要在群集中的代理之间传送安全、加密的消息,请配置 cluster 连接服务以使用基于 SSL 的传输协议。对于群集中的各个代理,请设置基于 SSL 的连接服务,如使用基于 SSL 的服务中所述。然后,将每个代理的 imq.cluster.transport 属性设置为 ssl。可以在群集配置文件中进行设置,也可以为每个代理单独进行设置。
将代理添加到群集
在群集中添加新代理的步骤取决于该群集是否使用群集配置文件。
使用群集配置文件在群集中添加新代理
- 将新代理添加到群集配置文件中的 imq.cluster.brokerlist 属性。
- 对群集中的各个代理执行以下命令:
imqcmd reload cls
该命令强制每个代理重新加载群集配置,确保群集中代理的所有持久性信息都是最新的。
- (可选)在代理的 config.properties 文件中将 imq.cluster.url 属性的值设置为指向群集配置文件。
- 启动新代理。
如果未执行步骤 3,请使用 imqbrokerd 命令行中的 -D 选项设置 imq.cluster.url 的值。
不使用群集配置文件向群集中添加新代理通过编辑 config.properties 文件或者使用 imqbrokerd 命令行中的 -D 选项设置以下属性的值:
从群集中删除代理
从群集中删除代理所使用的方法取决于最初是通过命令行创建群集,还是通过中央群集配置文件创建群集的。
使用命令行删除代理
如果在命令行中使用 imqbrokerd 命令将代理连接为群集,则必须停止每个代理,然后重新启动它们,以便在命令行中指定一组新的群集成员。过程如下所示:
使用命令行从群集中删除代理使用群集配置文件删除代理
如果最初创建群集时,在中央群集配置文件中使用 imq.cluster.brokerlist 属性指定其成员代理,则不必停止这些代理以删除其中一个代理。相反,只需编辑配置文件来排除要删除的代理,强制群集中的其他代理成员重新加载群集配置,并重新配置被排除的代理,以使它不再指向同一群集配置文件。过程如下:
使用群集配置文件从群集中删除代理
主代理群集可选择包含一个主代理,它维护配置更改记录以跟踪群集持久性状态所发生的任何变化。主代理是使用 imq.cluster.masterbroker 配置属性标识的。该属性位于群集配置文件或者单个代理的实例配置文件中。
配置更改记录包含与群集关联的持久性实体的相关更改信息,例如长期订阅和管理员创建的物理目标。群集中的所有代理在启动时都会咨询主代理,以便更新与这些持久性实体相关的信息。如果主代理出现故障,就不会实现上述同步;有关详细信息,请参见主代理不可用时。
管理配置更改记录
因为配置更改记录中包含的信息很重要,所以要定期进行备份以便在出现故障时能够恢复,这一点非常重要。虽然从备份恢复会丢失群集持久性状态自备份以后发生的任何更改,但经常进行备份可以将信息丢失的可能性降到最低。备份和恢复操作也有利于压缩和优化配置更改记录中的更改历史,因为该记录会随时间迅速增加。
备份配置更改记录使用 imqbrokerd 命令的 -backup 选项指定备份文件的名称。例如:
imqbrokerd -backup mybackuplog
恢复配置更改记录主代理不可用时
因为群集中的所有代理都需要利用主代理来执行持久性操作,在主代理不可用时,群集中任一代理的以下 imqcmd 子命令将返回一条错误信息:
自动创建的物理目标和临时目标均不受影响。
在没有主代理时,任何尝试创建长期订户或取消长期订阅的客户机应用程序都会收到一条错误信息。但是,客户机可以成功地指定现有长期订阅,并与其进行交互。