activemq 集群master-salve

一、序言

        作为一种中间件,很多系统都会依赖它,因此几乎所有的中间件都会考虑挂掉怎么办?压力过大怎么办?因此都得考虑容错以及水平伸缩的问题。 所谓的分布式 集群 Master-Slave 等等概念就由此而生了,他主要是为了高可用性、负载均衡来分摊压力 等效果,这里介绍AMQ 的集群概念和配置。

 

二、场景描述:

       1.如果broker 挂了,那么我们整个依赖这个节点的项目都会连接不顺畅,因此要做一个备份的东西,挂掉之后,能快速切换,这也就是master-slave 。

 

三、配置介绍

       1.master-slave 模式现在5.11 版本是提供了3种,参考:http://activemq.apache.org/masterslave.html

       

       方式一:Shared File System Master Slave

       原文:http://activemq.apache.org/shared-file-system-master-slave.html

       

If you have a SAN or shared file system it can be used to provide high availability such that if a broker is killed, another broker can take over immediatel

如果你有SAN 或者 共享的的文件系统,当broker 挂掉后它能提供很高的可用性,能直接让另一个broker 直接代替工作。

大概原理是,你设置N个broker,并且你们都用同一个文件目录保存信息,那么就有第一次获得文件的broker 作为master 提供服务,并对文件持有lock,其他broker 只能监听等待,等master 挂掉了,另外的broker 能立马补充上去。

     

 

On startup one master grabs an exclusive lock on the broker file directory - all other brokers are slaves and pause waiting for the exclusive lock.

在启动时一个master 独占锁代理文件目录,所有其他代理的奴隶和暂停等待互斥型锁。

 

 

 

   因此这种方式就很简单了,主要是让他们的文件目录一致:

       

我假设在本地启动两个broker,在activemq.xml 里面 
windows 环境,两个xml 文件目录设置一致,就行了
这里默认使用的kahaDB ,你也可以用levelDB,但不推荐AMQDB
<persistenceAdapter>
		<kahaDB directory="F:/amq_share_data" />
</persistenceAdapter>

同时因为都在本地,因此监听端口得改改:
分别是61616 和61617
<transportConnector name="openwire" uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

同时为了启动jetty ,在jetty 里面的端口也得改一下就OK了

    

    然后客户端连接的时候地址改成这种就OK了

failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)

 

   方式二:JDBC Master Slave

   这种方式就是把共享文件目录 改成了数据库,再多台部署的时候,可能共享目录不是很方便,这里我一直没用数据库的方式,就不贴代码了。

 

   方式三:Replicated LevelDB Store

   这种broker 挂了筛选master 的方式用了zookeeper 的帮助,如果你ZK不了解的,先看看百科。

   

  它是利用ZK 做协调,先进入的作为master,其他都是slave

  client 只会连接到master 进行工作,并让slave 同步持久化的信息

  当master 挂了,ZK 就会利用选举 从新选出master,并且挂掉的master 从启 加进来就成slave 了

  因为利用zk 进行配置管理,我们方便监控,同时配置也相对简单

 

  1.Zookeeper 的配置 见前面了, 这个不介绍

  2.我建立3个AMQ,并且broker 配置都一样,下面说下不一样的部分

   

# 下面是持久化的部分改成这样
<persistenceAdapter>
    <replicatedLevelDB
      directory="activemq-data"
      replicas="3"
      bind="tcp://0.0.0.0:0"
      zkAddress="zoo1.example.org:2181,zoo2.example.org:2181,zoo3.example.org:2181"
      zkPassword="password"
      zkPath="/activemq/leveldb-stores"
      hostname="broker1.example.org"
      />
  </persistenceAdapter>
#replicas 表示你集群节点数
# bind 当该节点成为master 后,会自动绑定设定的地址,动态的就是是默认的(作用不是很明白- -)
# zkAddress ZK 的地址
# zkPaht ZK 创建的时候的节点名称
# hostname AMQ 所在机器的地址,可以默认
# 更多参考:http://activemq.apache.org/replicated-leveldb-store.html

 

   

    这种方式要备份几个,同时要几个节点,性能和资源都有一定损耗,如果跨机房就不推荐了,当然我这边主要是为了可用性,没有那么高的性能要求。

 

四、小结

      1.上面的东西可能不是很详细,主要是从官网看的基本配置,复杂的东西害的靠自己的多实践啦

      2.如果有疑问的地方请指出~。~非常感谢~。~

 

顺便说个小问题,由于个人使用了512M 的阿里云服务器,加上别人在用,在启动AMQ 的时候按默认配置,会申请的空间不够,这个在env 配置里面改一下 空间大小才行。注意zk的节点配置 也别写错了

 

 

 

 

猜你喜欢

转载自greemranqq.iteye.com/blog/2197444