1        ActiveMQ集群的由来

单点的ActiveMQ作为企业应用无法满足业务的需求,因为单点的ActiveMQ存在单点故障问题,当该节点宕机以后,就会直接影响我们业务的正常运转,所以我们需要搭建高可用的ActiveMQ集群来支撑我们的业务系统

2        ActiveMQ集群的主要部署方式 2.1  默认的单机部署(kahadb)

activeMQ的默认存储的单机方式,以本地kahadb文件的方式存储,所以性能指标完全依赖本地磁盘IO,不能提供高可用。
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>

2.2  基于共享数据库的主从(Shared JDBC Master/Slave)

可以基于postgres、mysql、oracle等常用数据库。每个节点启动都会争抢数据库锁,从而保证master的唯一性,其他节点作为备份,一直等待数据库锁的释放。因为所有消息读写,其实都是数据库操作,activeMQ节点本身压力很小,性能完全取决于数据库性能。优点:实现高可用和数据安全,简单灵活,2台节点就可以实现高可用. 缺点:稳定性依赖数据库,性能依赖数据库.
<beanid="mysql-ds"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
<property name="driverClassName"value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/amq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="maxActive" value="20"/>
<property name="poolPreparedStatements"value="true"/>
</bean>
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.data}"dataSource="#mysql-ds"
createTablesOnStartup="false"/>
</persistenceAdapter>

2.3  基于zookeeper以及可复制的 LevelDB实现

5.9.0新推出的主从实现,基于zookeeper来选举出一个master,其他节点自动作为slave实时同步消息。因为有实时同步数据的slave的存在,master不用担心数据丢失,所以leveldb会优先采用内存存储消息,异步同步到磁盘。所以该方式的activeMQ读写性能都最好,特别是写性能能够媲美非持久化消息。优点:实现高可用和数据安全性能较好.缺点:因为选举机制要超过半数,所以最少需要3台节点,才能实现高可用。
LevelDB 是 Google 开发的一套用于持久化数据的高性能类库。 LevelDB 并不是一种服务,用户需要自行实现 Server。 是单进程的服务,能够处理十亿级别规模 Key-Value 型数据,占用内存小。
<persistenceAdapter>
<replicatedLevelDB
    directory="${activemq.data}/leveldb"
    replicas="3"
    bind="tcp://0.0.0.0:62621"
    zkAddress="localhost:2181,localhost:2182,localhost:2183"
    hostname="localhost"
    zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
了解完毕ActiveMQ集群的三种部署方式以后,我们本教程将采用第三种方式来建ActiveMQ集群,因为第三种的读写性能都最好的.

3        ActiveMQ高可用原理

使用ZooKeeper(集群)注册所有的ActiveMQ Broker。只有其中的一个Broker可以提供服务,被视为 Master,其他的 Broker 处于待机状态,被视为Slave。如果Master因故障而不能提供服务,Zookeeper会从Slave中选举出一个Broker充当Master。Slave连接Master并同步他们的存储状态,Slave不接受客户端连接。所有的存储操作都将被复制到 连接至 Master的Slaves。如果Master宕了,得到了最新更新的Slave会成为 Master。故障节点在恢复后会重新加入到集群中并连接Master进入Slave模式。

1        基于zookeeper以及leveldb实现高可用ActiveMQ集群

了解完毕ActiveMQ集群的三种部署方式以后,我们本教程将采用第三种方式来建ActiveMQ集群,因为第三种的读写性能都最好的.

1.1  ActiveMQ集群部署规划

环境: CentOS 6.6 x64 、 JDK7
版本: ActiveMQ 5.11.1
zookeeper集群说明: 192.168.221.141:2181 , 192.168.221.141:2182, 192.168.221.141:2183
集群节点规划说明:
主机
集群间通信端口
消息端口
管控台端口
其他端口
安装目录
192.168.221.136
62621
11616
8161
以1开始即可
/usr/local/src/activemq-cluster
192.168.221.136
62622
21616
8162
以2开始即可
192.168.221.136
62623
31616
8163
以3开始即可

1.2  搭建ActiveMQ步骤 1.2.1           准备环境

Ø  在/usr/local/src/在创建activemq-cluster目录: mkdir –p /usr/local/src/activemq-cluster
Ø  上传activemq安装包到linux服务器下
Ø  解压activemq的安装包: tar –zxvf –C /usr/local/src/activemq-cluster
Ø  重命名: mv apache-activemq-5.12.0/ activemq-cluster-node01
Ø  以1节点为基础复制两个节点出来
²  cp –r activemq-cluster-node01 activemq-cluster-node02
²  cp –r activemq-cluster-node01 activemq-cluster-node03

1.2.2           修改管理控制台端口可在 conf/jetty.xml 中修改

node01管控台端口
<bean  id="jettyPort"  class="org.apache.activemq.web.WebConsolePort"  init-method="start">
        <property name="host"  value="0.0.0.0"/>
        <property name="port"  value="8161"/>
</bean>
node02管控台端口
<bean  id="jettyPort" class="org.apache.activemq.web.WebConsolePort"  init-method="start">
        <property name="host"  value="0.0.0.0"/>
        <property name="port"  value="8162"/>
</bean>
node03管控台端口
<bean  id="jettyPort"  class="org.apache.activemq.web.WebConsolePort" init-method="start">
        <property name="host"  value="0.0.0.0"/>
        <property name="port"  value="8163"/>
</bean>

1.2.3           配置持久化适配器

在 3 个 ActiveMQ 节点中配置 conf/activemq.xml 中的持久化适配器。修改其中 bind、zkAddress、hostname 和 zkPath.注意:每个 ActiveMQ 的 BrokerName 必须相同,否则不能加入集群。
node01-持久化适配器:
<broker  xmlns="http://activemq.apache.org/schema/core" brokerName="activemq-cluster"  dataDirectory="${activemq.data}">
         <persistenceAdapter>
                   <replicatedLevelDB
                            directory="${activemq.data}/leveldb"
                            replicas="3"
                            bind="tcp://192.168.221.136:62621"
                            zkAddress="192.168.80.129:2182,192.168.80.129:2183,192.168.80.129:2184"
                            hostname="192.168.80.129"
                            zkPath="/activemq/leveldb-stores"
                   />
         </persistenceAdapter>
</broker>
node02-持久化适配器:
<broker xmlns="http://activemq.apache.org/schema/core"  brokerName="activemq-cluster"  dataDirectory="${activemq.data}">
         <persistenceAdapter>
                   <replicatedLevelDB
                            directory="${activemq.data}/leveldb"
                            replicas="3"
                            bind="tcp://192.168.221.136:62622"
                            zkAddress="192.168.221.145:2181,192.168.221.145:2182,192.168.221.145:2183"
                            hostname="192.168.221.136"
                            zkPath="/activemq/leveldb-stores"
                   />
         </persistenceAdapter>
</broker>
node03-持久化适配器:
<broker  xmlns="http://activemq.apache.org/schema/core" brokerName="activemq-cluster"  dataDirectory="${activemq.data}">
         <persistenceAdapter>
                   <replicatedLevelDB
                            directory="${activemq.data}/leveldb"
                            replicas="3"
                            bind="tcp://192.168.221.136:62623"
                            zkAddress="192.168.221.145:2181,192.168.221.145:2182,192.168.221.145:2183"
                            hostname="192.168.221.136"
                            zkPath="/activemq/leveldb-stores"
                   />
         </persistenceAdapter>
</broker>

1.2.4           修改消息服务端口

node-01消息服务端口:
<transportConnectors>
            <transportConnector  name="openwire" uri="tcp://0.0.0.0:11616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector  name="amqp" uri="amqp://0.0.0.0:1672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector  name="stomp" uri="stomp://0.0.0.0:11613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector  name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector  name="ws" uri="ws://0.0.0.0:11614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
node-02消息服务端口:
<transportConnectors>
            <transportConnector  name="openwire" uri="tcp://0.0.0.0:21616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector  name="amqp" uri="amqp://0.0.0.0:2672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector  name="stomp" uri="stomp://0.0.0.0:21613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector  name="mqtt" uri="mqtt://0.0.0.0:2883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector  name="ws" uri="ws://0.0.0.0:21614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
node-03消息服务端口:
<transportConnectors>
            <transportConnector  name="openwire" uri="tcp://0.0.0.0:31616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector  name="amqp" uri="amqp://0.0.0.0:3672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector  name="stomp" uri="stomp://0.0.0.0:31613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector  name="mqtt" uri="mqtt://0.0.0.0:3883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector  name="ws" uri="ws://0.0.0.0:31614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

1.2.5           启动3个ActiveMQ集群节点

/usr/local/src/activemq-cluster/apache-activemq-01/bin/activemq  start
/usr/local/src/activemq-cluster/apache-activemq-02/bin/activemq  start
/usr/local/src/activemq-cluster/apache-activemq-03/bin/activemq  start
监听日志
tail -f  /usr/local/src/activemq-cluster/apache-activemq-01/data/activemq.log
tail -f  /usr/local/src/activemq-cluster/apache-activemq-02/data/activemq.log
tail -f  /usr/local/src/activemq-cluster/apache-activemq-03/data/activemq.log

1.2.6           集群的节点状态分析

使用集群启动后对 ZooKeeper 数据的抓图,可以看到 ActiveMQ 的有 3 个节点,分别是 00000000019,000000000020, 00000000021。以下第一张图展现了 00000000019 的值,可以看到 elected 的值是不为空,说明这个节点是 Master,其他两个节点是 Slave。

1.1.1           集群测试

ActiveMQ的客户端只能访问MasterBroker,其他处于Slave的Broker不能访问.所以客户端连接Broker应该使用failover(故障转移)协议
failover:(tcp://192.168.221.136:11616,tcp://192.168.221.136:21616,tcp:// 192.168.221.136:31616)?randomize=false

1.1.2           客户端连接url配置优化

updateURIsURL,通过 URL(或者本地路径)获取重连的 url,这样做具有良好的扩展性,因为客户端每次连接都是从 URL(或文件)中加载一次,所以可以随时从文件中更新 url 列表,做到动态添加 MQ 的备点。failover:()?randomize=false&updateURIsURL=file:/home/wusc/activemq/urllist.txt,urllist.txt 中的地址通过英文逗号分隔,示例:
tcp://192.168.221.136:11616,tcp://192.168.221.136:21616,tcp:// 192.168.221.136:31616

1.1.3           集群测试结果说明

当一个ActiveMQ节点挂掉,或者一个ZooKeeper节点挂掉,ActiveMQ服务依然正常运转.如果仅剩一个ActiveMQ节点,因为不能选举Master,ActiveMQ不能正常运转;同样的,如果ZooKeeper仅剩一个节点活动.不管ActiveMQ 各节点是否存活,ActiveMQ也不能正常提供服务。(ActiveMQ 集群的高可用,依赖于 ZooKeeper 集群的高可用)。

ActiveMQ高可用集群的搭建相关推荐

  1. Kubernetes1.24版本高可用集群环境搭建(二进制方式)

    背景: 虽然kubeadm方式安装集群更加简单些,配置相对比较少,但是生产环境还是建议二进制的方式安装,因为二进制的方式kubernetes的kube-apiserver.kube-controlle ...

  2. Hadoop的HA机制原理解析,与HA高可用集群环境搭建

    2019独角兽企业重金招聘Python工程师标准>>> Hadoop的HA工作机制示意图 下面我们开始搭建这一套高可用集群环境 hadoop2.0已经发布了稳定版本了,增加了很多特性 ...

  3. ElasticSearch高可用集群环境搭建和分片原理

    1.ES是如何实现分布式高并发全文检索 2.简单介绍ES分片Shards分片技术 3.为什么ES主分片对应的备分片不在同一台节点存放 4.索引的主分片定义好后为什么不能做修改 5.ES如何实现高可用容 ...

  4. k8s高可用集群_搭建高可用集群(初始化和部署keepalived)---K8S_Google工作笔记0055

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们来部署keepalived,搭建高可用集群. 然后我们这里需要master,155, ma ...

  5. k8s高可用集群_搭建高可用集群(实现方式介绍)---K8S_Google工作笔记0054

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们来说搭建高可用集群,为什么要搭建高可用集群. 因为,首先我们说master节点是用来管理其 ...

  6. conga下HA高可用集群的搭建(redhat6.5)

    实验环境 redhat6.5虚拟机三台,各1G内存,时间同步 server1  172.25.44.1 server2  172.25.44.2 server3  172.25.44.3 火墙和sel ...

  7. Kubernetes实战:高可用集群的搭建和部署

    摘要:官方只提到了一句"使用负载均衡器将 apiserver 暴露给工作节点",而这恰恰是部署过程中需要解决的重点问题. 本文分享自华为云社区<Kubernetes 高可用集 ...

  8. haproxy 基本搭建 + 高可用集群的搭建

    1.首先对haproxy的源码包进行编译,获得haproxy的方式有多种:直接下在rpm,官网的源码包在本次的实验中使用的是haproxy-1.6.11.tar.gz haproxy被内置到红帽中 在 ...

  9. consul注册中心高可用集群的搭建经验

    consul简介 Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键特性: 1.服务发现: Consul的客户端可用提供一个服务,比如 api 或者 ...

  10. 基于zookeeper(集群)+LevelDB的ActiveMq高可用集群安装、配置、测试

    Linux 环境 zookeeper集群安装.配置.测试https://blog.csdn.net/weixin_40816738/article/details/100576259 MQ集群部署规划 ...

最新文章

  1. 创建一个显示所有预定义WPF颜色的ListBox
  2. Javascript 实现TreeView
  3. 用友3.0谋局“新两化” 融合创新迸发新动能
  4. 一些Python情结
  5. 新建/克隆虚拟机(配置)
  6. 教你一个快速视频处理的神器:Python moviepy
  7. c语言 静态链表插入排序,数据结构 - 表插入排序 具体解释 及 代码(C++)
  8. MySQL - 行锁 表锁 乐观锁 悲观锁 读锁 写锁
  9. vba html 教程 pdf,Word VBA教程:CanvasShapes集合
  10. 利用imnoise2函数产生数据的直方图
  11. 【改进灰狼优化算法】贪婪的非分层灰狼优化算法(Matlab代码实现)
  12. 经典策略之Dual Trust策略
  13. sklearn:make_blobs聚类数据生成器
  14. Hi3512的IPCAM开发
  15. 本地事务与分布式事务
  16. Error: Corrupted zip: missing XXX bytes.
  17. 自定义Navigator切换fragment
  18. 【一】1D测量 Measuring——translate_measure()算子
  19. 逃离天坑之后——谈谈技术路线该怎么走
  20. java将map转json字符串

热门文章

  1. html5 模板 知乎,Discuz贴吧知乎超级v2ex UTF(x520_v2ex)_Discuz模板_Discuz应用中心
  2. 主板风扇转不开机是什么问题_cpu风扇转主板不启动怎么办
  3. html插入mkv,mkv导入到PR中该怎么做?
  4. 【转载】django-数据库[ 配置 ]
  5. 我看韩寒-话题2010读后
  6. 在pc计算机vga是什么意思,电脑上的VGA线是什么样的?图片
  7. HDLBits练习——Exams/ece241 2013 q7
  8. 线下化妆品零售店如何做私域获客?
  9. 淘宝app搜索排名优化技巧
  10. 后盾网-CI框架实例教程-马振宇 - 学习笔记(1~2)