前言:

本文介绍的AMQ集群是Master-Slave模式的,官网介绍三种方案:

(1)基于共享文件系统的,(2)基于JDBC,(3)基于可复制的LevelDB。

关于三种方式的对比网上已经有很多,本文不再介绍,本文采用第三种,基于可复制的LevelDB。

原理图如上,很简单:

(1)使用Zookeeper从配置的AMQ集群中,选举一个Master,其余自动为Slave。

(2)只有Master和Client之间建立Connections,然后Master将持久化的操作复制到Slave上。

(3)All messaging operations which require a sync to disk will wait for the update to be replicated to a quorum of the nodes before completing. So if you configure the store with replicas="3" then the quorum size is (3/2+1)=2. The master will store the update locally and wait for 1 other slave to store the update before reporting success. Another way to think about it is that store will do synchronous replication to a quorum of the replication nodes and asynchronous replication replication to any additional nodes.

大概意思是,Master接收到客户端的消息后,先更新本地的LevelDB,之后再等待这个更新被复制到“法定”数目的AMQ节点,才能够返回成功标志。所谓“法定”数目节点,下文会讲到一个配置 replicas=3,表示有3个Node,则"法定"数目=3/2+1=2,也就有3个Node中有两个Node(包括Master)更新收到的消息,就可以返回成功了。

(4)When a new master is elected, you also need at least a quorum of nodes online to be able to find a node with the lastest updates. The node with the lastest updates will become the new master. Therefore, it's recommend that you run with at least 3 replica nodes so that you can take one down without suffering a service outage.

官网推荐的时最少3个的节点。Master挂掉后,剩下两个Slave中拥有最新副本的成为Master。如果节点数据不足3个,Master挂掉后,会报错:不够节点以选出新的Master。

一、配置方法

参考:ActiveMQ高可用集群方案

我用的windows操作系统。

1、配置Zookeeper集群

修改每个zk节点的zoo.cfg:

clientPort=2182  #客户端的端口,我配置的分别为2181,2182,2183

server.1=127.0.0.1:2886:3886 #第一个端口用来集群成员的信息交换,表示这个服务器与集群中的 Leader 服务器交换信息的端口;第二端口是在leader挂掉时专门用来进行选举 leader 所用的端口。
server.2=127.0.0.1:2887:3887
server.3=127.0.0.1:2888:3888

然后,在每个文件节点的data目录下创建myid文件,里边写上该节点编号:1,2,3

2、配置ActiveMQ集群:

同样也是三个节点,首先配置每个AMQ的通信端口以及控制台端口,分别位于Activemq.xml:

以及Jetty.xml:

第二,在activemq.xml中配置持久化策略:

         <persistenceAdapter>
<replicatedLevelDB directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"
hostname="127.0.0.1"
sync="local_disk"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>

使用可复制的leveldb,官方推荐的策略,主要用于分布式集群。zkAddress配置zk集群的三个客户端端口。

3、启动所有的zk以及AMQ节点。

二、测试

我写的active-demo上传在github:https://github.com/zackzhuzi/activemq-demo

比较简单,producer和consumer都在一个工程里,使用SPRING的JMSTemplate,集群部分使用failover协议连接集群:

<!-- 配置JMS连接工厂 -->
<bean id="defaultConnectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<property name="brokerURL"
value="failover:(tcp://localhost:61616,tcp://localhost:61617,tcp://localhost:61618)?initialReconnectDelay=1000" />
<!-- <property name="brokerURL" value="tcp://localhost:61616" /> -->
<property name="redeliveryPolicy" ref="activeMQRedeliveryPolicy" />
</bean>

详细代码看我的demo。

(1)比如我的master是M1(端口分别为61616,8161),则M2,M3不与客户端相连,所以只有localhost:8161可以访问。localhost:8162/8163都不可访问。

Producer通过Junit启动后,发送消息,Consumer能正常打印出消息。

(2)将M1关闭后,这时候M2自动成为Master,集群仍然可以提供服务。localhost:8162可以访问。

(3)将M2关闭,这时只有M3开启。但是集群不再提供服务,localhost:8163也不可访问。M3的日志如下:

(4)开启M1,这时集群有两台AMQ服务,超过半数,M3选为Master。集群正常提供服务。localhost:8163可以访问。

(5)最后再开启M2,也自动加入集群中。

三、其他

1、注意:三个AMQ的brokerName必须一样,才能加入一个集群。

ActiveMQ使用Zookeeper+LevelDb配置Master/Slave集群的更多相关文章

  1. zookeeper安装和配置(单机+伪集群+集群)

    #单机模式 解压到合适目录. 进入zookeeper目录下的conf子目录, 复制zoo_sample.cfg-->zoo.cfg(如果没有data和logs就新建):tickTime=2000 ...

  2. zookeeper、solrcloud、rediscluster集群解决方案

        集群解决方案 课程目标 目标1:说出什么是集群以及与分布式的区别 目标2:能够搭建Zookeeper集群 目标3:能够搭建SolrCloud集群 目标4:能够搭建RedisCluster集群 ...

  3. 基于zookeeper+mesos+marathon的docker集群管理平台

    参考文档: mesos:http://mesos.apache.org/ mesosphere社区版:https://github.com/mesosphere/open-docs mesospher ...

  4. 扩展Redis的Jedis客户端,哨兵模式读请求走Slave集群

    原 扩展Redis的Jedis客户端,哨兵模式读请求走Slave集群 2018年12月06日 14:26:45 温故而知新666 阅读数 897   版权声明:本文为博主原创文章,遵循CC 4.0 b ...

  5. 28.zookeeper单机(Standalones模式)和集群搭建笔记

    zookeeper单机(Standalones模式)和集群搭建: 前奏: (1).zookeeper也可以在windows下使用,和linux一样可以单机也可以集群,具体就是解压zookeeper-3 ...

  6. CentOS和Ubuntu下安装配置Greenplum数据库集群(包括安装包和源码编译安装)

    首先说一下,无论是CentOS/RedHat还是Ubuntu都可以按源码方式.安装包方式编译安装. 1.   规划 192.168.4.93(h93)       1个主master  2个主segm ...

  7. ZooKeeper之(五)集群管理

    在一台机器上运营一个ZooKeeper实例,称之为单机(Standalone)模式.单机模式有个致命的缺陷,一旦唯一的实例挂了,依赖ZooKeeper的应用全得完蛋. 实际应用当中,一般都是采用集群模 ...

  8. zookeeper源码 — 二、集群启动—leader选举

    上一篇介绍了zookeeper的单机启动,集群模式下启动和单机启动有相似的地方,但是也有各自的特点.集群模式的配置方式和单机模式也是不一样的,这一篇主要包含以下内容: 概念介绍:角色,服务器状态 服务 ...

  9. Dubbo+zookeeper构建高可用分布式集群(二)-集群部署

    在Dubbo+zookeeper构建高可用分布式集群(一)-单机部署中我们讲了如何单机部署.但没有将如何配置微服务.下面分别介绍单机与集群微服务如何配置注册中心. Zookeeper单机配置:方式一. ...

随机推荐

  1. python3类和实例

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可 ...

  2. [PHP] 广度优先搜索匹配网站所有链接

    <?php define('PRE_DOMAIN','www'); define('DOMAIN','sina.com.cn'); define('PROTOCOL','https'); def ...

  3. win10企业版LTSC批量激活

    slmgr -ipk M7XTQ-FN8P6-TTKYV-9D4CC-J462D   slmgr -skms kms.03k.org slmgr -ato slmgr -dlv

  4. DNS解析过程--笔试答题版

    在运维笔试的时候,回答DNS解析的过程,不能写一大堆,一是不美观,二是浪费时间,应该怎么写呢?我觉得这样写比较好. 1.客户端:chche----hosts 2.DNS服务器:cache---递归-- ...

  5. 防止ARP欺骗

    前言: 曾经因为宿舍里面的同学经常熬夜打游戏,好言相劝不管用,无奈之下使用arp欺骗他们的主机,使之晚上11点之后游戏延迟,掉线,最后,一到11点同学们就都上床睡觉了. 防止arp欺骗的三种思路: 在 ...

  6. 唐敬博-201871010118 《面向对象程序设计(java)》第六、七周学习总结

    在博客园撰写博客(随笔),总结6-7周学习内容(包括实验内容),作业格式要求如下: 博文名称:学号-姓名<面向对象程序设计(java)>第四周学习总结(1分) 博文正文开头格式:(2分) ...

  7. selenium 2定位方式实例

    #########百度输入框的定位方式########## #通过id方式定位 browser.find_element_by_id("kw").send_keys("s ...

  8. Vue.js如何获得兄弟元素,子元素,父元素(DOM操作)

    我不是代码的生产者,我只是知识的搬运工. 戳这

  9. 页面元素定位及操作--xpath

    简介: 在 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档(根)节点.XML 文档是被作为节点树来对待的.树的根被称为文档节点或者根节点. /xxx 页面输出 / ...

  10. LG5201 「USACO2019JAN」Shortcut 最短路树

    \(\mathrm{Shortcut}\) 问题描述 LG5201 题解 最短路树. 显然奶牛的路径就是从\(1\)走到各个草地,于是从\(1\)跑最短路,构建最短路树. 为了保证字典序,从\(1\) ...