Artemis集群允许将Artemis服务组组合在一起,便于共享消息的负载处理。集群中每个活动节点都是一个活动的Artemis服务,它管理自己的消息并处理自己的连接。集群中的每个节点都通过broker.xml配置文件来声明与其他节点关系,从而形成集群。当一个集群节点连接到另一节点时,通过在内部创建一个core bridge来建立他们之间的连接。不需要为每个节点都声明一个明确的bridge,这些集群连接允许消息在集群的节点之间流动并且进行负载均衡。
节点可以使用不同的网络拓扑来连接到一起形成一个集群。通过集群来进行客户端负载均衡,并且考虑消息重新分发机制。
注意,通常情况下配置了集群节点,通常只需将配置复制到其他节点即可生成对称集群。但是在复制配置时需注意,不要将Artemis数据(即绑定,日志和大消息目录)进行复制,当第一次启动节点并初始化日志文件时,将会在日志目录中存储一个特殊标识符。此ID必须在集群节点之间是唯一的,否则集群将无法正确形成。
服务器能通过服务发现机制传播其连接细节,称之为拓扑:
- 消息客户端。消息客户端希望连接到集群服务器时,在任何时候都无需知道集群中那些服务器处于良好服务状态。
- 其他服务器。集群中的服务器能够在事先不知道集群中所有其他服务器的情况下彼此之间创建集群连接。
通常在建立集群拓扑时,需要一种方式来建立最初的第一个连接,可以使用如基于UDP和JGROUP之类的动态发现或者通过提供初始连接器列表来完成。
1.动态发现
使用UDP多播或者JGroups来广播服务器连接设置。
1.1 广播组
广播组是服务器通过网络广播连接器信息,连接器定义客户端(或其他服务器)可以与服务器建立连接的方式。关播组使用一组连接器对,每个连接器对包含一个活动服务和备份服务(如果存在)并且在网络上广播它们。通过在集群上配置(broker.xml)基于UDP或JGroup的方式来广播连接器对信息。
每个Artemis服务器可以有许多广播组,所有广播组都定义在broadcast-groups元素中。如下通过UDP的广播组配置例子如下:
<broadcast-groups>
<broadcast-group name="my-broadcast-group">
<local-bind-address>172.16.9.3</local-bind-address>
<local-bind-port>5432</local-bind-port>
<group-address>231.7.7.7</group-address>
<group-port>9876</group-port>
<broadcast-period>2000</broadcast-period>
<connector-ref>netty-connector</connector-ref>
</broadcast-group>
</broadcast-groups>
- name:定义广播组的唯一名称
- local-bind-address:socket数据包绑定的本地地址。如果有服务器有多个网卡,需要通过此属性指定使用哪个地址用于广播。如果未设置此属性,将由内核选定socket绑定的ip地址。这是UDP的特定属性。
- local-bind-port:socket数据包绑定的本地端口。通常只需使用默认值-1,意味着可以使用任何端口。此参数总是与local-bind-address一起制定。这是UDP的特定属性。
- group-address:用于广播数据的多播地址,是一个D类IP地址(多播地址),用于声明共享同一协议的一组服务器。范围从224.0.0.0到239.255.255.255(含)。地址224.0.0.0是保留地址,此参数必填。UDP特定属性。
- group-port:用于关播的UDP端口号,此参数必须设置。UDP特定属性。
- broadcast-period:广播之间的时间间隔,此参数可选,默认值为2000ms。
- connector-ref:指定将要播报的连接器和可选的备份连接器。
如下通过JGroups的广播组配置例子如下:
<broadcast-groups>
<broadcast-group name="my-broadcast-group">
<jgroups-file>test-jgroups-file_ping.xml</jgroups-file>
<jgroups-channel>activemq_broadcast_channel</jgroups-channel>
<broadcast-period>2000</broadcast-period>
<connector-ref>netty-connector</connector-ref>
</broadcast-group>
</broadcast-groups>
为了能够使用JGroups进行广播,必须指定两个属性:jgroups-file和jgroups-channel:
- jgroups-file:JGroups配置文件名称,用于初始化JGroups通道,确保此文件位于java资源路径中。
- jgroups-channel:用于广播的连接JGroups通道的名称。
JGroups配置文件例子如下:
<config xmlns="urn:org:jgroups"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/JGroups-3.0.xsd">
<TCP loopback="true"
recv_buf_size="20000000"
send_buf_size="640000"
discard_incompatible_packets="true"
max_bundle_size="64000"
max_bundle_timeout="30"
enable_bundling="true"
use_send_queues="false"
sock_conn_timeout="300"
thread_pool.enabled="true"
thread_pool.min_threads="1"
thread_pool.max_threads="10"
thread_pool.keep_alive_time="5000"
thread_pool.queue_enabled="false"
thread_pool.queue_max_size="100"
thread_pool.rejection_policy="run"
oob_thread_pool.enabled="true"
oob_thread_pool.min_threads="1"