一、序言
作为一种中间件,很多系统都会依赖它,因此几乎所有的中间件都会考虑挂掉怎么办?压力过大怎么办?因此都得考虑容错以及水平伸缩的问题。 所谓的分布式 集群 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
同时因为都在本地,因此监听端口得改改:
分别是61616 和61617
同时为了启动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 配置都一样,下面说下不一样的部分
# 下面是持久化的部分改成这样
#replicas 表示你集群节点数
# bind 当该节点成为master 后,会自动绑定设定的地址,动态的就是是默认的(作用不是很明白- -)
# zkAddress ZK 的地址
# zkPaht ZK 创建的时候的节点名称
# hostname AMQ 所在机器的地址,可以默认
# 更多参考:http://activemq.apache.org/replicated-leveldb-store.html
这种方式要备份几个,同时要几个节点,性能和资源都有一定损耗,如果跨机房就不推荐了,当然我这边主要是为了可用性,没有那么高的性能要求。
四、小结
1.上面的东西可能不是很详细,主要是从官网看的基本配置,复杂的东西害的靠自己的多实践啦
2.如果有疑问的地方请指出~。~非常感谢~。~
顺便说个小问题,由于个人使用了512M 的阿里云服务器,加上别人在用,在启动AMQ 的时候按默认配置,会申请的空间不够,这个在env 配置里面改一下 空间大小才行。注意zk的节点配置 也别写错了