1.为什么选择zookeepr+leveldb,构建activemq主从集群
  官网关于主从集群的描述的原文地址为:http://activemq.apache.org/masterslave.html。下面是我的翻译.
   activemq有3中主从配置方式
     官方建议:
     - 如果你使用共享文件系统,例如SAN,我们建议使用 Shared File System Master Slave(共享文件系统主从)。
- 如果你乐于降低高性能并且使用纯JDBC作为持久化引擎,你可以使用JDBC主从进行持久化。(我公司做过测试,1s也就不到200条,严重受到Mysql性能制约。)
- 对于那些愿意尝试新技术的人,可以使用复制的leveldb存储。速度与SAN差不多,并且不需要安装高可用的共享文件系统。
注:
  SAN(https://baike.baidu.com/item/%E5%AD%98%E5%82%A8%E5%8C%BA%E5%9F%9F%E7%BD%91%E7%BB%9C/6091260?fr=aladdin)主要用于存储量大的工作环境,如ISP、银行等,成本高、标准尚未确定等问题影响了SAN的市场,不过,随着这些用户业务量的增大,SAN也有着广泛的应用前景。
  出于成本性能考虑 ,我们使用zookeeper+leveldb实现activemq的主从集群。
   zookeepr+leveldb如何工作:
  官方原文出处为:http://activemq.apache.org/replicated-leveldb-store.html
  
  使用zookeeper确定集群中的那个节点是主节点。被选举出来的主节点接收客户端连接。其他节点进入从节点模式,连接主节点,同步他们的持久状态。从节点不接收客户端连接。所有持久化操作会复制到从节点中。如果主节点失效,最新更新的从节点将作为主节点。失效的节点恢复后,将作为从节点。
  所有需要持久化的消息,都将同步到额定的从节点。
  如果你配置的replicas=‘3’,额度节点数为:
  (3/2+1)=2,主将本地存储更新,之后等待另外一个从节点更新成功,后才会返回调用方处理成功。
  换言之,主与一个额定节点之间是同步更新,其他节点是异步更新。
  当一个新的主节点被选举出来后,也需要至少一个额定节点有效,用于找到最近一次更新的节点作为备选主节点。
  因此建议至少运行3个activemq,如果一个宕机不会造成服务停机。
   配置属性说明
  复制的leveldb配置的属性(Replicated LevelDB Store Properties)
   下列参数,所有节点必须一致:
              | 属性名称 | 默认值 | 备注 | 
         | replicas | 3 | 集群中节点数量。至少需要 (replicas/2)+1 ,节点才不会宕机 | 
         | securityToken |   | 安全token,所有节点必须一致,用于互相访问 | 
         | zkAddress | 127.0.0.1:2181 | zk地址,用","隔开多个地址 | 
         | zkPassword |   | 连接zk时使用的密码 | 
         | zkPath | /default | zookeeper上存储主从信息的目录。 | 
         | zkSessionTimeout | 2s | zookeeper多长时间会认为一个节点失效,5.11之后加入 | 
         | sync | quorum_mem | 用于控制同步的区域,以“,”分割多个区域。 可选项有:local_mem, local_disk, remote_mem, remote_disk, quorum_mem, quorum_disk. 如果你配置多个区域,将更强的保证机制将被触发。 例如: local_mem, local_disk 与 local_disk 等同 quorum_mem 与local_mem, remote_mem 等同 quorum_disk  与local_disk, remote_disk等同 | 
     
   下面的配置是每个节点特殊的配置
              | 属性名称 | 默认值 | 备注 | 
         | bind | tcp://0.0.0.0:61619 | 当该节点成为主节点时,绑定的地址和端口,用于服务复制协议 还支持使用动态端口,只需配置tcp:/ / 0.0.0.0:0 | 
         | hostname |   | The host name used to advertise the replication service when this node becomes the master. I f not set it will be automatically determined. 个人认为上述原文的意思为: 当该节点成为主节点时,主机名用于暴露主从服务。 如果不设置,它将自动确定(注意,不设置的话,Spring连接不上) | 
         | weight | 1 | 权重 具有最高权重的最新更新的从节点将成为主节点。 给设置,使某些节点更容易成为主节点。 | 
     
   
   特别注意,该集群的缺点:
  不支持,延迟与计划消息(Delay and Schedule Message Delivery.)
   配置示例
   用例版本:  
     - apache-activemq-5.9.0-bin.tar.gz下载地址:http://activemq.apache.org/activemq-590-release.html
- zookeeper-3.4.11.tar.gz下载地址:http://mirror.bit.edu.cn/apache/zookeeper/
- jdk1.8.0_151下载地址http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
节点分配
  activemq节点分配
              | ip地址 | activemq的tcp端口号 | 管理界面端口 | 
         | 192.168.1.8 | 51511 | 8161 | 
         | 192.168.1.9 | 51512 | 8161 | 
         | 192.168.1.10 | 51513 | 8161 | 
     
  
 zk节点配置
              | 节点IP | 端口地址 | 
         | 192.168.1.8 | 2181 | 
         | 192.168.1.9 | 2181 | 
         | 192.168.1.10 | 2181 | 
     
   详细配置说明
  JDK配置不做赘述,这里仅仅说明activemq的高可用配置。
 zk集群配置  
    cd /usr mkdir zookeeper
    cd /usr/zookeeper # 利用rz命令上传本地tar包到虚拟机 rz # 若没有rz命令可以先安装 # yum -y install lrzsz tar -xzvf zookeeper-3.4.11.tar.gz ``` 3. 修改zoo.cfg文件配置集群信息(所有几点可以一致) 注意zoo.cfg的server.X,的X对应myid中的值
    cd /usr/zookeeper/zookeeper-3.4.11/conf # 初次配置,拷贝zoo_sample.cfg cp zoo_sample.cfg zoo.cfg vim zoo.cfg # 在zoo.cfg中加入必备配置 server.1=192.168.1.8:2888:3888 server.2=192.168.1.9:2888:3888 server.3=192.168.1.10:2888:3888
   
    # 切换到zoo.cfg中配置的dataDir目录,这里是默认的/tmp/zookeeper cd /tmp/zookeeper   touch myid # 这里以192.168.1.8为准 echo 1 > myid
   
     zk集群启动已验证
    分别启动,3个机子上的zookeeper,使用bin目录下的zkServer.sh start
  cd /usr/zookeeper/zookeeper-3.4.11/bin ./zkServer.sh start
    ./zkServer.sh status命令
 其中的Mode会标识节点状态leader为主节点,follow为从节点。  
 leader 会显示类似信息:
     ZooKeeper JMX enabled by default
 Using config: /usr/zookeeper/zookeeper-3.4.11-02/bin/../conf/zoo.cfg
 Mode: leader
  
  
 follower 会显示类似信息  
     ZooKeeper JMX enabled by default
 Using config: /usr/zookeeper/zookeeper-3.4.11-03/bin/../conf/zoo.cfg
 Mode: follower
  
   
 # activemq配置
   
            方法类似zookeeper安装的步骤。
         示例命令如下:
  cd /usr mkdir activemq cd /usr/activemq # 利用rz命令上传本地文件到虚拟机 rz # 若没有rz命令可以先安装 # yum -y install lrzsz tar -xzvf apache-activemq-5.9.0-bin.tar.gz
   
            在conf/activemq.xml中配置replicatedLevelDB
         activemq.xml中加入如下配置
         本例以192.168.1.8为例,不同的节点其hostname的ip地址不同。、
  <persistenceAdapter>     <replicatedLevelDB             directory="/usr/activemq/leveldb"             replicas="3"             bind="tcp://0.0.0.0:0"             zkAddress="192.168.1.8:2181,192.168.1.9:2181,192.168.1.10:2181"             zkPassword=""             zkPath="/activemq/leveldb-stores"             hostname="192.168.1.8"              /> </persistenceAdapter>
   
            下边以192.168.1.8位例,按照上边的分配为51511,在conf/activemq.xml中配置
     <transportConnectors>             <!-- DOS protection, limit concurrent  connections to 1000 and frame size to 100MB -->             <transportConnector name="openwire"  uri="tcp://0.0.0.0:51511?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> ......... <transportConnectors/>
   
     - client配置,这里以springBoot,maven示例为例
        在pom.xml中加入依赖
  <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 支持spring.activemq.pool.enabled属性 --> <dependency>   <groupId>org.apache.activemq</groupId>   <artifactId>activemq-pool</artifactId>   </dependency>  
     - 在application.properties配置连接信息如下:
# activemq的配置 spring.activemq.broker-url=failover:(tcp://192.168.1.8:51511, tcp://192.168.1.9:51512,tcp://192.168.1.10:51513)  spring.activemq.user=admin spring.activemq.password=admin spring.activemq.pool.enabled=true spring.activemq.pool.max-connections=50
   activemq集群启动,校验
  逐个启动使用bin/activemq 命令进行启动
 示例如下:
  cd /usr/activemq/apache-activemq-5.9.0/bin ./acteivemq start
  校验单个节点以./activemq status确定,如果节点运行会显示如下:
     [root@localhost bin]# ./activemq status
 INFO: Using default configuration
 (you can configure options in one of these file: /etc/default/activemq /root/.activemqrc)
   INFO: Invoke the following command to create a configuration file
 ./activemq setup [ /etc/default/activemq | /root/.activemqrc ]
   INFO: Using java '/usr/java/jdk1.8.0_151/bin/java'
 ActiveMQ is running (pid '2774')
  
  集群判断利用zookeeper监控工具,ZooInspector.jar,连接192.168.1.8进行查看。
 
 只有主节点才有在address中显示连接,从节点address为null。  
 注意:ZooInspector.jar 的下载地址:
 https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
   总结
  本文描述了zookeeper+leveldb搭建集群的方式。
  与zookeeper+leveldb如何运行。
  注意,以该模式搭建的主从集群,不能保证延迟与计划消息的同步。