在之前的文档,演示了使用 共享文件以及共享数据库的方式去实现了activemq的集群。参见 ActiveMQ高可用方案(HA)之MasterSlave集群部署(一)
这一节,我们演示一下如何通过leveldb + zookeeper 的方式去实现集群。
操作配置一览表
服务 | 节点名称 | 管理端口 | 集群通讯端口 | 服务目录 |
---|---|---|---|---|
activemq | node2181 | 2181 | 2887:3887 | /usr/local/activemq-cluster/node2181 |
activemq | node2182 | 2182 | 2888:3888 | /usr/local/activemq-cluster/node2182 |
activemq | node2183 | 2183 | 2889:3889 | /usr/local/activemq-cluster/node2183 |
zookeeper | node2181 | 2181 | 2887:3887 | /usr/local/activemq-cluster/node2181 |
zookeeper | node2182 | 2182 | 2888:3888 | /usr/local/activemq-cluster/node2182 |
zookeeper | node2183 | 2183 | 2889:3889 | /usr/local/activemq-cluster/node2183 |
关键配置
- activemq.xml
<!-- 持久化的部分为ZooKeeper集群连接地址-->
<persistenceAdapter>
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="localhost:2181,localhost:2182,localhost:2183"
zkPath="/activemq/leveldb-stores"
hostname="localhost"
/>
</persistenceAdapter>
配置很简单,但是网上也有很多例子,但是本人在搭建过程中遇到了一个问题,当应用部署完成后,可以正常访问 master服务,但是尝试将Master服务关闭后,查看Slave服务日志,提示异常信息如下,网上也查了很多资料,也有遇到过相同问题的,清除activemq和 zookeeper数据后重启,或者删除某个jar包和日志信息配置,均无效果,后来想想尝试了一下回退activemq版本,发现能够能够主备了。所以这里我写一下我配置的版本。
2020-02-14 12:20:25,168 | INFO | No IOExceptionHandler registered, ignoring IO exception | org.apache.activemq.broker.BrokerService | LevelDB IOException handler.
java.io.IOException: com/google/common/util/concurrent/internal/InternalFutureFailureAccess
at org.apache.activemq.util.IOExceptionSupport.create(IOExceptionSupport.java:40)[activemq-client-5.15.11.jar:5.15.11]
at org.apache.activemq.leveldb.LevelDBClient.might_fail(LevelDBClient.scala:552)[activemq-leveldb-store-5.15.11.jar:5.15.11]
at org.apache.activemq.leveldb.LevelDBClient.replay_init(LevelDBClient.scala:667)[activemq-leveldb-store-5.15.11.jar:5.15.11]
at org.apache.activemq.leveldb.LevelDBClient.start(LevelDBClient.scala:558)[activemq-leveldb-store-5.15.11.jar:5.15.11]
at org.apache.activemq.leveldb.DBManager.start(DBManager.scala:648)[activemq-leveldb-store-5.15.11.jar:5.15.11]
at org.apache.activemq.leveldb.LevelDBStore.doStart(LevelDBStore.scala:312)[activemq-leveldb-store-5.15.11.jar:5.15.11]
at org.apache.activemq.leveldb.replicated.MasterLevelDBStore.doStart(MasterLevelDBStore.scala:110)[activemq-leveldb-store-5.15.11.jar:5.15.11]
at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:55)[activemq-client-5.15.11.jar:5.15.11]
at org.apache.activemq.leveldb.replicated.ElectingLevelDBStore$$anonfun$start_master$1.apply$mcV$sp(ElectingLevelDBStore.scala:230)[activemq-leveldb-store-5.15.11.jar:5.15.11]
at org.fusesource.hawtdispatch.package$$anon$4.run(hawtdispatch.scala:330)[hawtdispatch-scala-2.11-1.22.jar:1.22]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)[:1.8.0_201]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)[:1.8.0_201]
at java.lang.Thread.run(Thread.java:748)[:1.8.0_201]
2020-02-14 12:20:25,177 | INFO | Stopped LevelDB[/usr/local/activemq-cluster/node8162/data/leveldb] | org.apache.activemq.leveldb.LevelDBStore | LevelDB IOException handler.
当然,如果各位希望看到更详尽的部署步骤,可以参考以下链接博客: