ActiveMQ高可用集群安装、配置(zookeeper + LevelDB)

2024-04-12 12:38

本文主要是介绍ActiveMQ高可用集群安装、配置(zookeeper + LevelDB),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从ActiveMQ5.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是谷歌开发的一套用于持久化数据的功性能类库。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集群。

集群仅提供主备方式的高可用集群功能,避免单点故障,没有负载均衡功能。

原理如图:

高可用的原理:使用zookeeper集群注册所有的ActiveMQ Broker。至于其中的一个Broker可以提供服务,被视为Master,其他的Broker处于待机状态,被视为Slave。如果Master因故障不能提供服务,Zookeeper会从Slave中选举出一个Broker充当Master。

Slave连接Master并同步它们的存储状态,Slave不接受客户端连接。所有的存储操作都将被复制到连接至Master的Slave中。如果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 node,以防止一个node失败了,服务中断。(原理与zookeeper集群的高可用实现方式类似)

1.ActiveMQ集群部署规划

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

主机集群端口消息端口管控台端口节点安装目录
192.168.1.8162621515118161/home/wusc/activemq/node-01
192.168.1.8262622515128162/home/wusc/activemq/node-02
192.168.1.8362623515138163/home/wusc/activemq/node-03

2.防火墙中打开以上所有端口

3.分别在3台主机中创建/root/tengjs/activemq目录

$ mkdir /root/tengjs/activemq

上传apache-activemq-5.11.1-bin.tar.gz到/root/tengjs/activemq目录

4.解压并按节点命名

$ cd /root/tengjs/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必须相同,否则不能加入集群。

node-01中的持久化配置

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu" dataDirectory="${activemq.data}">
    <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>
</broker>

node-02中的持久化配置

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu" dataDirectory="${activemq.data}">
    <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>
</broker>

node-03中的持久化配置

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu" dataDirectory="${activemq.data}">
    <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>
</broker>

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

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

7.按顺序启动3个ActiveMQ节点

$ /home/wusc/activemq/node-01/bin/activemq start

$ /home/wusc/activemq/node-02/bin/activemq start

$ /home/wusc/activemq/node-03/bin/activemq start

监听日志

$ tail -f /home/wusc/activemq/node-01/data/activemq.log

$ tail -f /home/wusc/activemq/node-02/data/activemq.log

$ tail -f /home/wusc/activemq/node-03/data/activemq.log

8.集群的节点状态分析

集群启动后对zookeeper数据的抓图,可以看到ActiveMQ有3个节点,分别是00000000000,00000000001和00000000002。

以下第一张图展现了00000000000的值,可以看到elected的值是不为空,说明这个节点是Master,其他两个节点是Slave。

9.集群可用性测试ActiveMQ的客户端只能访问Master的Broker,其他处于Slave的Broker不能访问,所以客户端连接Broker应该使用failover协议

failover:(tcp://192.168.1.81:51511,tcp://192.168.1.82:51512,tcp://192.168.1.83:51513)?randomize=false

10.当一个ActiveMQ节点挂掉,或者一个zookeeper节点挂掉,ActiveMQ服务依然正常运转。如果仅剩一个ActiveMQ节点,因为不能选举Master,ActiveMQ不能正常运转;同样的,如果zookeeper仅剩一个节点活动,不管ActiveMQ是否存活,ActiveMQ也不能正常提供服务。

ActiveMQ集群的高可用,依赖于zookeeper集群的高可用。

11.设置开机启动

12.配置优化(可选)

updateURIsURL,通过URL(或者本地路径)获取重连的url,这样做具有良好的扩展性,因为客户端每次连接都是从RUL(或文件)中加载一次,所以可以随时从文件中更新url列表,做到动态添加MQ的备点。

failover:()?randomize=false&updateURIsURL=file:/home/wusc/activemq/urllist.txt

urllist.txt中的地址通过英文逗号分隔,示例:

tcp://192.168.1.81:51511,tcp://192.168.1.82:51512,tcp://192.168.1.83:51513

官方警告:

replicatedLevelDB不支持延迟或者计划任务消息。这些消息存储在另外的LevelDB文件中,如果使用延迟或者计划任务消息,将不会复制到slave Broker上,不能实现消息的高可用。

这篇关于ActiveMQ高可用集群安装、配置(zookeeper + LevelDB)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/897155

相关文章

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

Nginx 重写与重定向配置方法

《Nginx重写与重定向配置方法》Nginx重写与重定向区别:重写修改路径(客户端无感知),重定向跳转新URL(客户端感知),try_files检查文件/目录存在性,return301直接返回永久重... 目录一.try_files指令二.return指令三.rewrite指令区分重写与重定向重写: 请求

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指