activemq+zookeeper+leveldb集群

一、搭建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。 配置完成后启动activemq,进入目录:/opt/apache-activemq-5.10.2/bin下面, 执行:./activemq start 三台同时启动,如果报错,则用./activemq console命令启动,查看日志,如果其中一台机器报如下错误: No IOExceptionHandler registered, ignoring IO exception | org.apache.activemq.broker.BrokerService | LevelDB IOExcepti
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

猜你喜欢

转载自sxlkk.iteye.com/blog/2281961