一、搭建zookeeper集群
第一步:服务器配置
三台Ubuntu server准备好之后,假设它们的IP地址分别为192.168.0.11,192.168.0.12和192.168.0.13
安装Zookeeper需要先装JDK。
第二步:Zookeeper安装参考:http://sxlkk.iteye.com/blog/2308556.
下面搭建activemq集群
二、搭建activemq集群
第一步:
下载mq,地址:http://www.apache.org/dyn/closer.cgi?path=/activemq/5.10.2/apache-activemq-5.10.2-bin.tar.gz
第二步:
将apache-activemq-5.10.2-bin.tar.gz放到/opt文件夹下,然后tar -zxvf apache-activemq-5.10.2-bin.tar.gz进行解压缩
第三步:配置
主要修改配置文件conf/activemq.xml
(1)broker-name的统一
将broker标签的brokerName属性设置为统一的值,系统默认名称都为“localhost”,只有三个实例的brokerName一致,zookeeper才能识别它们属于同一个集群。
(2)persistenceAdapter的配置
persistenceAdapter设置持久化方式,主要有三种方式:kahaDB(默认方式)、数据库持久化、levelDB(v5.9.0+提供支持)。
本文采用levelDB来进行持久化,并使用zookeeper实现集群的高可用,配置如下:
首先注释掉原来kahaDB的持久化方式,然后配置levelDB+zookeeper的持久化方式。
<persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:0" zkAddress="192.168.0.11:2181,192.168.0.12:2181,192.168.0.13:2181" hostname="192.168.0.11" sync="local_disk" zkPath="/activemq/leveldb-stores" /> </persistenceAdapter>注意上述配置中的hostname属性值,不同的activemq实例对应不同的hostname值,其他两个实例配置的hostname值分别为:192.168.0.11, 192.168.0.12。
on handler.
java.io.IOException: com.google.common.base.Objects.firstNonNull(Ljava/lang/Object;Ljava/lang/ObjectLjava/lang/Object;
at org.apache.activemq.util.IOExceptionSupport.create(IOExceptionSupport.java:39)[activemq-client-5.10.0.jar:5.10.0]
at org.apache.activemq.leveldb.LevelDBClient.might_fail(LevelDBClient.scala:552)[activemq-leveldb-store-5.10.0.jar:5.10.0]
at org.apache.activemq.leveldb.LevelDBClient.replay_init(LevelDBClient.scala:657)[activemq-leveldb-store-5.10.0.jar:5.10.0]
at org.apache.activemq.leveldb.LevelDBClient.start(LevelDBClient.scala:558)[activemq-leveldb-store-5.10.0.jar:5.10.0]
at org.apache.activemq.leveldb.DBManager.start(DBManager.scala:648)[activemq-leveldb-store-5.10.0.jar:5.10.0]
at org.apache.activemq.leveldb.LevelDBStore.doStart(LevelDBStore.scala:235)[activemq-leveldb-store-5.10.0.jar:5.10.0]
at org.apache.activemq.leveldb.replicated.MasterLevelDBStore.doStart(MasterLevelDBStore.scala:110)[activemq-leveldb-store-5.10.0.jar:5.10.0]
at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:55)[activemq-client-5.10.0.jar:5.10.0]
at org.apache.activemq.leveldb.replicated.ElectingLevelDBStore$$anonfun$start_master$1.apply$mcV$sp(ElectingLevelDBStore.scala:226)[activemq-lev
eldb-store-5.10.0.jar:5.10.0]
at org.fusesource.hawtdispatch.package$$anon$4.run(hawtdispatch.scala:330)[hawtdispatch-scala-2.11-1.21.jar:1.21]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_20]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_20]
下面是从老外那查到的解决方案:
After going through tickets in activeMQ found following ticket has been reported https://issues.apache.org/jira/browse/AMQ-5225. Workaround described in the ticket will solve the issue. The work around for this issue,
1、remove pax-url-aether-1.5.2.jar from lib directory
2、comment out the log query section
解决方案:
(1)移除lib目录中的pax-url-aether-1.5.2.jar包;
(2)注释掉配置文件中的日志配置(或者删掉)
<bean id="logQuery" class="org.fusesource.insight.log.log4j.Log4jLogQuery" lazy-init="false" scope="singleton" init-method="start" destroy-method="stop"> </bean>
这样集群就搭建完毕
客户端连接使用failover方案:
failover:(tcp://192.168.1.11:61616,tcp://192.168.1.12:61616,tcp://192.168.1.13:61616)?initialReconnectDelay=1000