activemq负载均衡
activemq负载均衡可以通过动态或者静态方式配置.负载均衡的activemq们之间的关系相当于互相监听,如果消息来了,就往其他activemq推消息(如果其他activemq有连接者才会推,这是为了性能)
一.动态组播
1.在每一个ActiveMQ服务节点的主配置文件中(activemq.xml),添加/更改 以下配置信息即可:
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61617?maximumConnections=1000&wireFormat.maxFrameSize=104857600" discoveryUri="multicast://239.0.0.5:19999"/>
</transportConnectors>
<!-- 关键的networkConnector标签, uri属性标示为组播发现-->
<networkConnectors>
<networkConnector uri="multicast://239.0.0.5:19999" duplex="false"/>
</networkConnectors>
2.networkConnector标签
如果使用ActiveMQ的组播发现功能,请在networkConnector标签的uri属性中添加如下格式的信息:
multicast://[组播地址][:端口]
例如,您可以按照如下方式使用ActiveMQ默认的组播地址来发现网络种其他ActiveMQ服务节点:
#ActiveMQ集群默认的组播地址(239.255.2.3):
multicast://default
也可以按照如下方式,指定一个组播地址——这在高安全级别的网络中很有用,因为可能其他的组播地址已经被管理员禁用。注意组播地址只能是D类IP地址段:
#使用组播地址239.0.0.5
multicast://239.0.0.5
3.transportConnector标签的关联设置
任何一个ActiveMQ服务节点A,要连接到另外的ActiveMQ服务节点,都需要使用当前节点A已经公布的transportConnector连接端口,例如以下配置中,能够供其它服务节点进行连接的就只有两个transportConnector连接中的任意一个:
<transportConnectors>
<!-- 其它ActiveMQ服务节点,只能使用以下三个连接协议和端口进行连接 -->
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="tcp" uri="tcp://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="nio" uri="nio://0.0.0.0:61618?maximumConnections=1000" />
<transportConnector name="auto" uri="auto://0.0.0.0:61617?maximumConnections=1000" />
</transportConnectors>
那么要将哪一个连接方式通过UDP数据报向其他ActiveMQ节点进行公布,就需要在transportConnector标签上使用discoveryUri属性进行标识,如下所示:
<transportConnectors>
......
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="auto" uri="auto+nio://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600" discoveryUri="multicast://239.0.0.5" />
</transportConnectors>
<networkConnectors>
<networkConnector uri="multicast://239.0.0.5"/>
</networkConnectors>
4其他注意事项
关于防火墙:请记得关闭您Linux服务器上对需要公布的IP和端口的限制;
关于hosts路由信息:由于基于组播的动态发现机制,能够找到的是目标ActiveMQ服务节点的机器名,而不是直接找到的IP。所以请设置当前服务节点的hosts文件,以便当前ActiveMQ节点能够通过hosts文件中的IP路由关系,得到机器名与IP的映射:
# hosts文件
192.168.61.139 activemq1
192.168.61.138 activemq2
关于哪些协议能够被用于进行Network Bridges连接:根据笔者以往的使用经验,只有tcp头的uri格式(openwire协议)能够被用于Network Bridges连接;当然您可以使用auto头,因为其兼容openwire协议;另外,您还可以指定为附加nio头。
二.静态组播
相比于基于组播发现方式的动态Network Connectors而言,虽然静态Network Connectors没有那样灵活的横向扩展性,但是却可以适用于网络环境受严格管理的情况。例如:管理员关闭了交换机/路由器的组播功能、端口受到严格管控等等。
配置静态Network Connectors的ActiveMQ集群的方式也很简单,只需要更改networkConnectors标签中的配置即可,而无需关联改动transportConnectors标签。但是配置静态Network Connectors的ActiveMQ集群时,需要注意非常关键的细节:每一个节点都要配置其他所有节点的连接位置。
为了演示配置过程,我们假设ActiveMQ集群由两个节点构成,分别是activemq1:192.168.61.138 和 activemq2:192.168.61.139。那么配置情况如下所示:
192.168.61.138:需要配置activemq2的位置信息以便进行连接:
<transportConnectors>
<transportConnector name="auto" uri="auto+nio://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600&consumer.prefetchSize=5"/>
</transportConnectors>
<!-- 请注意,一定需要192.168.61.139(activemq2)提供了这样的连接协议和端口 -->
<networkConnectors>
<networkConnector uri="static:(auto+nio://192.168.61.139:61616)"/>
</networkConnectors>
如果携带账户密码,需要输入账户密码:
<networkConnectors>
<networkConnector userName="liuy" password="123456" uri="static:(auto+nio://192.168.61.139:61616)"/>
</networkConnectors>
192.168.61.139:需要配置activemq1的位置信息以便进行连接:
<transportConnectors>
<transportConnector name="auto" uri="auto+nio://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600&consumer.prefetchSize=5"/>
</transportConnectors>
<!-- 请注意,一定需要192.168.61.138(activemq1)提供了这样的连接协议和端口 -->
<networkConnectors>
<networkConnector uri="static:(auto+nio://192.168.61.138:61616)"/>
</networkConnectors>
同理,如果您的ActiveMQ集群规划中有三个ActiveMQ服务节点,那么任何一个节点都应该配置其它两个服务节点的连接方式。在配置格式中使用“,”符号进行分割:
<networkConnectors>
<networkConnector uri="static:(tcp://host1:61616,tcp://host2:61616,tcp://..)"/>
</networkConnectors>