分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试

从 ActiveMQ 5.9 开始,ActiveMQ 的集群实现方式取消了传统的Master-Slave 方式,增加了基于ZooKeeper
+ LevelDB的 Master-Slave实现方式,其他两种方式目录共享和数据库共享依然存在。

三种集群方式的对比:

(1)基于共享文件系统(KahaDB,默认):

<persistenceAdapter>

<kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter>

(2)基于 JDBC:

<bean id="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>

(3)基于可复制的 LevelDB(本文采用这种集群方式):

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>

本文主要讲解基于 ZooKeeper 和LevelDB 搭建ActiveMQ 集群。集群仅提供主备方式的高可用集
群功能,避免单点故障,没有负载均衡功能。

官方文档:http://activemq.apache.org/replicated-leveldb-store.html

集群原理图:

高可用的原理:使用ZooKeeper(集群)注册所有的ActiveMQ
Broker。只有其中的一个Broker 可以提供 服务,被视为Master,其他的Broker 处于待机状态,被视为Slave。如果Master 因故障而不能提供服务,

ZooKeeper 会从 Slave中选举出一个 Broker充当 Master。

Slave 连接 Master并同步他们的存储状态,Slave不接受客户端连接。所有的存储操作都将被复制到

连接至 Master 的Slaves。如果 Master 宕了,得到了最新更新的 Slave 会成为 Master。故障节点在恢复后

会重新加入到集群中并连接 Master 进入Slave 模式。

所有需要同步的 disk 的消息操作都将等待存储状态被复制到其他法定节点的操作完成才能完成。所以,如果你配置了replicas=3,那么法定大小是(3/2)+1=2。Master 将会存储并更新然后等待 (2-1)=1 个Slave存储和更新完成,才汇报 success。至于为什么是 2-1,熟悉 Zookeeper 的应该知道,有一个 node要作为观擦者存在。当一个新的Master 被选中,你需要至少保障一个法定node 在线以能够找到拥有最新
状态的node。这个node 可以成为新的Master。因此,推荐运行至少3 个replica
nodes,以防止一个node失败了,服务中断。(原理与 ZooKeeper 集群的高可用实现方式类似)

1、ActiveMQ集群部署规划:

环境:CentOS 6.6 x64 、JDK7

版本:ActiveMQ 5.11.1

ZooKeeper 集群环境:192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183

2、防火墙打开对应的端口

edu-zk-01:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8161 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 51511 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 62621 -j ACCEPT

edu-zk-02:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8162 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 51512 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 62622 -j ACCEPT

edu-zk-03:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8163 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 51513 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 62623 -j ACCEPT

3、分别在三台主机中创建/home/yxq/activemq目录

# mkdir /home/yxq/activemq

上传 apache-activemq-5.11.1-bin.tar.gz 到/home/yxq/activemq 目录\

4、解压并按节点命名

# tar -xvf apache-activemq-5.11.1-bin.tar.gz

# cd /home/yxq/activemq

# tar -xvf apache-activemq-5.11.1-bin.tar.gz

# mv apache-activemq-5.11.1 node-0X#(X代表节点号 1、2、3,下同)

5、修改管理控制台端口(默认为 8161)可在 conf/jetty.xml 中修改,如下:

node-01 管控台端口:

<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">

<!-- the default port number for the web console -->

<property name="host" value="0.0.0.0"/>

<property name="port" value="8161"/>

</bean>

node-02管控台端口:

<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">

<!-- the default port number for the web console -->

<property name="host" value="0.0.0.0"/>

<property name="port" value="8162"/>

</bean>

node-03管控台端口:

<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">

<!-- the default port number for the web console -->

<property name="host" value="0.0.0.0"/>

<property name="port" value="8163"/>

</bean>

6、集群配置:

在 3 个ActiveMQ 节点中配置conf/activemq.xml 中的持久化适配器。修改其中bind、zkAddress、hostname
和 zkPath。注意:每个 ActiveMQ 的 BrokerName 必须相同,否则不能加入集群。

所有节点中activemq.xml配置

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu" dataDirectory="${activemq.data}">

node-01 中的持久化配置:

<persistenceAdapter>

<!-- kahaDB directory="${activemq.data}/kahadb"/ -->

<replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62621"
zkAddress="192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"

hostname="edu-zk-01" zkPath="/activemq/leveldb-stores"/>

</persistenceAdapter>

node-02 中的持久化配置:

<persistenceAdapter>

<!-- kahaDB directory="${activemq.data}/kahadb"/ -->

<replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62622"
zkAddress="192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"

hostname="edu-zk-02" zkPath="/activemq/leveldb-stores"/>

</persistenceAdapter>

node-03 中的持久化配置:

<persistenceAdapter>

<!-- kahaDB directory="${activemq.data}/kahadb"/ -->

<replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62623"
zkAddress="192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"

hostname="edu-zk-03" zkPath="/activemq/leveldb-stores"/>

</persistenceAdapter>

修改各节点的消息端口(注意,避免端口冲突):

node-01 中的消息端口配置:

<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&amp;wireFormat.maxFrameSize=104857600"/>

<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

node-02 中的消息端口配置:

<transportConnectors>

<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->

<transportConnector name="openwire" uri="tcp://0.0.0.0:51512?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

node-03 中的消息端口配置:

<transportConnectors>

<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->

<transportConnector name="openwire" uri="tcp://0.0.0.0:51513?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

7、按顺序启动 3个 ActiveMQ节点:(zookeeper集群已经启动)

# /home/yxq/activemq/node-01/bin/activemq start

# /home/yxq/activemq/node-02/bin/activemq start

# /home/yxq/activemq/node-03/bin/activemq start

监听日志:

#  tail
-f /home/yxq/activemq/node-01/data/activemq.log

#  tail
-f /home/yxq/activemq/node-02/data/activemq.log

#  tail
-f /home/yxq/activemq/node-03/data/activemq.log

8、集群的节点状态分析:

集群启动后对 ZooKeeper 数据的抓图

,可以看到ActiveMQ 的有3 个节点,分别是00000000000,00000000001,00000000002。

我这里是 00000000005,00000000006,00000000007。

以下第一张图展现了 000000000005的值,可以看到elected 的值是不为空,说明这个节点是Master,

其他两个节点是 Slave。

时间: 2024-12-22 19:41:18

分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试的相关文章

高可用集群之heartbeat安装配置

高可用集群之heartbeat安装配置 说明: 系统为rhel 5.8 64bit heartbeat版本为v2 配置web高可用服务 节点为两个:node1和node2 创建高可用集群需要注意的地方: 各节点需要传递集群事务信息,传递时需要识别各节点,每个节点对对方的识别必须靠节点名称来实现,节点名称能够解析IP地址,配置DNS的话,如果DNS挂了,节点也找不到了,所以对于名称的解析不要依赖DNS,这就需要使用本地hosts文件,需要为每一个节点配置好hosts文件解析,每一个节点的hosts

Linux集群系列之十——高可用集群之heartbeat安装配置

rhel 5.8 32bit heartbeat v2 ha web node1 node2 节点名称, /etc/hosts 节点名称必须跟uname -n命令的直行结果一致 ssh 互信通信, 时间同步 1先配置两个主机的ip 列如 192.168.1.11   192.168.1.12 VIP192.168.1.8  网关 192.168.1.1 配置两个主机的主机名#hostname node1.mylinux.com #hostname node2.mylinux.com 为了让主机名

高可用消息队列集群zookeeper+leveldb+activemq

正在上传中---- 预计8月底完成

15套java互联网架构师、高并发、集群、负载均衡、高可用、数据库设计、缓存、性能优化、大型分布式 项目实战视频教程

* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat

java架构师、高性能、高并发、高可用、高可扩展、性能优化、集群、电商网站架构

15套java架构师.集群.高可用.高可扩展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布式项目实战视频教程 视频课程内容包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.ZeroMQ.Git.Nosql.Jvm.Mecached.Netty.Nio.Mina.性能调优.高并发.to

java架构师负载均衡、高并发、nginx优化、tomcat集群、异步性能优化、Dubbo分布式、Redis持久化、ActiveMQ中间件、Netty互联网、spring大型分布式项目实战视频教程百度网盘

15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; color: #FF0 } 15套java架构师.集群.高可用.高可扩展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  clo

搭建高可用mongodb集群(一)——配置mongodb

搭建高可用mongodb集群(一)--配置mongodb 在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. NOSQL有这些优势: 大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制. 高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向扩展的诟病. 高性能,Nosql通过简单的key-value方式获取数据,非常快速.还有N

HA集群之DRBD实现MySQL高可用

一.前言 本篇博文只是实现Corosync + Pacemaker + DRBD + MySQL,实现MySQL的高可用.更多的基础知识在前几篇博文中已有涉猎,故更多的理论细节将不再此篇中详述. 若想了解高可用基础知识,请参考:http://hoolee.blog.51cto.com/7934938/1406951 若想了解Corosync + Pacemaker,请参考:http://hoolee.blog.51cto.com/7934938/1409395 若想了解DRBD,请参考:http

CentOS Linux 负载均衡高可用WEB集群之LVS+Keepalived配置

CentOS Linux 负载均衡高可用WEB集群之LVS+Keepalived配置 LB集群是locd balance集群的简称.翻译成中文是:负载均衡集群的意思:集群是一组相互独立的.通过高速网络互联的计算机相互之间构成一个组合,并以单一的系统的模式加以管理.LVS是Linux Virtual Server的简写,翻译中文是Linux虚拟服务器,是一个虚拟的服务器集群系统. 负载均衡集群:是为了企业提供更为实用,性价比更高的系统机构解决方案.负载均衡集群把用户的请求尽可能的平均分发到集群的各