自己学习ActiveMq集群化的时候可以使用多台虚拟机模拟真实环境。也可以在单机上使用多个ActiveMq节点,也就是单机多实例的伪集群方式
-
看一下目录结构,activemq-single是平时使用的单节点,activemq123就是用来构成集群的三个节点
目录结构 - 通过levelDB+zookeeper的方式实现集群化
- 每个ActiveMq节点的brokerName必须相同,否则无法加入集群
- directory表示ActiveMq使用levelDB将消息持久化的路径
- replicas表示的是集群中有几个ActiveMq节点
- bind表示各个节点的通信地址,端口设为0表示使用动态端口,如果写死的话要保证每个节点不同的端口(因为是伪集群)
- zkAddress表示使用的zk地址,使用三个表示使用的时zk集群,也可以只用一个zk
- zkPath表示节点信息在zk中的存储路径
- hostname表示集群端口的主机名,节点启动后会访问hostname:port,因为这里是伪集群,所以都是localhost
- openwire的端口要保证不一样,这个是消息端口
- 修改后的activemq.xml如下,省略了没有修改的部分
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
<!--省略-->
<persistenceAdapter>
<!-- 不使用kahadb,使用levelDB+zookeeper构建集群-->
<!--<kahaDB directory="${activemq.data}/kahadb"/>-->
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"
zkPath="/activemq/leveldb-stores"
hostname="localhost"
/>
</persistenceAdapter>
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire"
uri="tcp://0.0.0.0:60001?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp"
uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp"
uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt"
uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws"
uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="admin" password="admin" groups="users,admins"/>
<!--<authenticationUser username="user" password="password" groups="users"/>-->
<!--<authenticationUser username="guest" password="password" groups="guests"/>-->
</users>
</simpleAuthenticationPlugin>
</plugins>
<!--省略-->
</broker>
- 还需要修改每个节点下jetty.xml中的端口,这个端口是ActiveMq管控台的端口,需要保证端口不冲突,只有master节点的管控台可以使用
- 在程序中的brokerUrl为
failover:(tcp://127.0.0.1:60001,tcp://127.0.0.1:60002,tcp://127.0.0.1:60003)?randomize=false
- 如果需要两套ActiveMq集群一起提供服务(负载均衡),需要在persistenceAdapter标签的上面加上另一套集群的地址
<networkConnectors>
<networkConnector uri="static:(tcp://xxx:xxx,tcp://xxx:xxx,tcp://xxx:xxx)" duplex="false"/>
</networkConnectors>
网友评论