基于docker搭建activemq的高可用集群

author author     2022-09-09     605

关键词:

    最近刚开始玩Docker和ActiveMQ刚好学习到ActiveMQ集群的搭建,就将其记录了下来给有需要的人,也可以跟大家交流交流。

    这里先感谢慕课网和http://blog.csdn.net/lifetragedy/article/details/51869032,在学习ActiveMQ有很大的帮助。

    一、docker坏境的搭建。

    这里重点不是docker,而是基于docker搭建的ActiveMQ集群,docker了解的也可以参考http://www.docker.org.cn/
    
  •     Ubuntu安装docker

Docker 要求 Ubuntu 系统的内核版本高于 3.10,可以通过uname -r来查看。

wget -qO- https://get.docker.com/ | sh

当要以非root用户可以直接运行docker时,需要执行 sudo usermod -aG docker runoob 命令,然后重新登陆,否则会报错,安装完成之后可以通过docker version来查看状态。

也可以通过curl来进行安装,which curl 命令是否安装curl,没有安装则通过 sudo apt-get update 和 sudo apt-get install curl 进行安装。

curl -sSL https://get.docker.com/ | sh 

这种安装方式的好处是安装的版本是最新的,或者也可以使用sudo apt-get install docker这种安装方式比较方便,但版本不是最新的,基于你的软件源。

  • Linux系统
yum -y install docker

经典的安装方式,方便快捷。

  • Mac系统

没什么好说的,https://www.oschina.net/translate/installing-docker-on-mac-os-x

  • Windows系统

Docker 引擎是基于Linux 内核,所以我们需要在 Windows 上安装Boot2Docker 来安装虚拟机和运行 Docker。

最新版 Boot2Docker 下载地址: https://github.com/boot2docker/windows-installer/releases/latest

目前最新版为v1.8.0, 下载地址为: https://github.com/boot2docker/windows-installer/releases/download/v1.8.0/docker-install.exe

    二、在docker中搭建activemq

首先我先从dockerhub上拉取ActiveMQ镜像,不过我网络比较慢,所以我从阿里拉取的镜像。

#这是阿里云镜像仓库的地址
docker pull registry.cn-hangzhou.aliyuncs.com/daydayup/activemq

#这是dockerhub
docker pull webcenter/activemq

 

 拉取完镜像之后我们可以通过docker images来查看镜像,然后使用docker run 命令来运行(可以结合自身给出不同的命令),这里出于演示目的使用了自动分配端口映射。

 技术分享

这样我们的容器就运行起来了,下一步我们要做什么呢?该实例来源慕课网的 jovezhao 老师

到这里我们要来开始分析我们的工作了,我们要建立的集群是一个三个节点的集群,分别是一个master节点和一个slave以及一个中间cluster节点。

技术分享

 

 图中所表示的Node A即 cluster 节点,不进行消息的持久化,即将生产者的消息同步过来,然后发送给消费者消费。

而Node B即表示 master 节点,进行消息的生产并持久化到文件系统中,并将消息同步到 Node A(Cluster)节点。

而Node C即表示 slave 节点,属于备用节点,等待 master 释放锁,当 master 释放锁后取代Node B 称为 master节点。

 

技术分享

 

这里需要注意的是master节点跟slave节点都共用一个文件系统,并且跟cluster节点可以相互通信。

 而我们的集群是基于docker来搭建的,so?问题出来了,我们知道每个ActiveMQ在docker眼里就是一个运行着的容器,那么容器的文件系统跟节点访问都需要修改其配置文件,

可是配置文件在容器内部,这个问题有几个解决方案(我所知的):

1.docker commit 该命令相当于在容器上追加一层(docker每个容器都是以层来区分的)

2.dockerfile 定制镜像,就是在原有基础镜像上添加一条条指令,相当于给每一层进行配置

3.docker cp 命令修改(覆盖)容器中的配置文件(不推荐)

4.启动时进行文件映射,这也是我使用的方法,比较简单,更好的方法是使用定制镜像,不过出于测试目的也可以更加了解其内容。

我们先使用 docker cp 从容器内部复制配置文件到本地文件系统(官方给出的配置文件地址是在/opt/activemq/conf/activemq.xml)。

技术分享

 我们可以通过 docker exec -it 容器id /bin/bash 进入运行着的容器中(每个容器可以抽象的理解成一台虚拟机)。

而后找到我们所需要的配置文件,退出容器,通过 docker cp 命令将容器文件拷贝到本地系统中。、

docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径

[email protected]:/home/yang# docker cp 2263:/opt/apache-activemq-5.13.3/conf/activemq.xml /myConfig/activemq/activemq-master-a.xml
[email protected]:/myConfig/activemq# cd /myConfig/activemq/
[email protected]:/myConfig/activemq# ls
activemq-clusters-a.xml  activemq-master-c.xml  activemq-slave-c.xml
activemq-master-a.xml    activemq-slave-a.xml
activemq-master-b.xml    activemq-slave-b.xml

 

 这里我复制了比较多份用于我以后的测试开发。

首先我们先来修改 Cluster 节点的配置文件,相对比较简单。

      <!-- 这里是默认的端口配置,我们都需要,只留下一个61616端口即可,由于是测试所以节点机只要端口不一致即可 -->
     <transportConnectors>
            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
           <!-- <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?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>

      <!-- 配置网络代理,cluster 节点需要与 master 跟 slave 进行穿透 -->
        <networkConnectors>
                <networkConnector uri="static:(tcp://192.168.1.106:61617,tcp://192.168.1.106:61618)" duplex="true" />
        </networkConnectors>

 

 

连接到网络代理的两种方式:

  • 静态的方法配置访问特定的网络代理 Static:(uri1,uri2,uri3,…)?key=value 或是Failover:(uri1, … , uriN)?key=value
  • 发现中介(agents)动态的探测代理
duplex参数用来消息同步,即 master 节点生产出消息,会变成一个 sender 把消息 cluster,同理,cluster 接收到消息也会发送给 master,称为互相穿透。

下面是 master 节点的配置文件
        <transportConnectors>
            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
           <transportConnector name="openwire" uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600" />
           <!-- <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?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>

        <networkConnectors>
                <networkConnector uri="static:(tcp:192.168.1.106:61616)" duplex="true" />
        </networkConnectors>

 

下面是 slave 节点的配置文件

            <transportConnector name="openwire" uri="tcp://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <!-- <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?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>

        <networkConnectors>
                <networkConnector uri="static:(tcp://192.168.1.106:61616)" duplex="true" />
        </networkConnectors>

 

 

这样我们的节点连接就配置好了,其实这里还有一个重要的步骤被我们忽略掉了,或者说是略过。

这个步骤就是公用文件系统,在配置文件中有这样一项配置

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

 

 用来指定持久化文件地址,而由于我们这里使用的是docker来运行容器,并使用文件映射的方式来指定,所以这一步骤我们可以忽略,不过cluster中需要将这项配置进行注释,

因为cluster是不作为生产者来使用的,当然如果我们生产消息时不调用该节点,这项配置也是可以省略的(理论上来说可行)。

然后我们需要要在本地文件中创建一个目录用来进行持久化(正确的做法是使用网络文件系统,我正在学习),这一步我就省略了。

接着就是启动我们的容器,slave节点是要晚于master节点的,其次两个顺序无关紧要。

[email protected]:~# docker run -it -d -p 61617:61616 -p 8171:8161 -v /myConfig/activemq/activemq-master-a.xml:/opt/apache-activemq-5.13.3/conf/activemq.xml -v /usr/share/activemq/kahadb:/opt/apache-activemq-5.13.3/data/kahadb registry.aliyuncs.com/daydayup/activemq
054cf0a41e5dbd08fbb268e5023f705d618f95cb679c6c665e7e8bea3b195559
[email protected]:~# docker run -it -d -p 61616:61616 -p 8161:8161 -v /myConfig/activemq/activemq-clusters-a.xml:/opt/apache-activemq-5.13.3/conf/activemq.xml registry.aliyuncs.com/daydayup/activemqca9534226020534e258f4ffb34c0eb0f9a97740a5ee72e390d350d2ceb0eee0d
[email protected]:~# docker run -it -d -p 61618:61616 -p 8181:8161 -v /myConfig/activemq/activemq-slave-a.xml:/opt/apache-activemq-5.13.3/conf/activemq.xml -v /usr/share/activemq/kahadb:/opt/apache-activemq-5.13.3/data/kahadb registry.aliyuncs.com/daydayup/activemq
327f1daba83fd56c40abac31b41f7f4435f3ee7b40e4b1719a69000248a39f0f
[email protected]:~# docker ps
CONTAINER ID        IMAGE                                     COMMAND                  CREATED              STATUS              PORTS                                              NAMES
327f1daba83f        registry.aliyuncs.com/daydayup/activemq   "/bin/sh -c ‘/opt/apa"   8 seconds ago        Up 4 seconds        0.0.0.0:8181->8161/tcp, 0.0.0.0:61618->61616/tcp   nostalgic_ride
ca9534226020        registry.aliyuncs.com/daydayup/activemq   "/bin/sh -c ‘/opt/apa"   About a minute ago   Up 58 seconds       0.0.0.0:8161->8161/tcp, 0.0.0.0:61616->61616/tcp   reverent_euler
054cf0a41e5d        registry.aliyuncs.com/daydayup/activemq   "/bin/sh -c ‘/opt/apa"   About a minute ago   Up About a minute   0.0.0.0:8171->8161/tcp, 0.0.0.0:61617->61616/tcp   tender_yalow

 

 此时我们可以先通过查看端口来验证容器是否启动成功

[email protected]:/usr/share/activemq/kahadb# netstat -an | grep 61616
tcp6       0      0 :::61616                :::*                    LISTEN     
[email protected]:/usr/share/activemq/kahadb# netstat -an | grep 61617
tcp6       0      0 :::61617                :::*                    LISTEN     
[email protected]:/usr/share/activemq/kahadb# netstat -an | grep 61618
tcp6       0      0 :::61618                :::*                    LISTEN 

 

可以看到三个端口都对外开放了,我们在使用浏览器访问管理器试试效果

技术分享 

技术分享

技术分享

可以看到slave节点已经被阻塞了,而master节点跟cluster节点都可以正常使用。

我们的集群这就搭建完成了,不过进一步的验证需要代码进行验证,还有文件系统的验证我就不一一演示了。

当我们需要更加复杂的集群都可以通过这种方式进行搭建,并在此基础上进行升级。

好了,基于docker搭建的activemq到这里就结束了,大家有什么问题可以找我交流,我也是刚接触可能有些地方误解,请及时指出,谢谢你的耐心观看。

 

 

 

 







基于docker快速搭建postgresql高可用方案(代码片段)

基于Docker快速搭建PostgreSQL高可用方案什么是PostgreSQLHA?此PostgreSQL集群解决方案包括PostgreSQL复制管理器(replicationmanager),这是一种用于管理PostgreSQL集群上的复制(replication)和故障转移(failover)的开源工具。获取此镜像获取Bit... 查看详情

dockerswarm搭建docker高可用集群(代码片段)

目录项目名称:基于docker-swarm搭建docker高可用集群1、网络拓扑图网络数据流图2、项目环境3、项目描述4、项目步骤1.规划设计整个集群的架构、网络拓扑,安装7台CentOS7.6的系统,按照规划配置好每台linux的IP,准... 查看详情

高可用kubernetes集群搭建

...注释掉SWAP的自动挂载,使用free-m确认swap已经关闭。二、docker安装安装docker-ce,所有节点都要安装yum-utils提供yum-config-manager工具,devicemapper存储需要device-mapper-persistent-data和lvm2添加yum源仓库官方仓库安装docker配置docker中国镜像加... 查看详情

基于zookeeper的高可用集群

1.准备zookeeper服务器#node1,node2,node3#安装请参考http://suyanzhu.blog.51cto.com/8050189/19465802.准备NameNode节点#node1,node43.准备JournalNode节点#node2,node3,node44.准备DataNode节点#node2,node3,node4#启动DataNode节点命令hadoop 查看详情

基于docker搭建分布式消息队列kafka

本文基于Docker搭建一套单节点的Kafka消息队列,Kafka依赖Zookeeper为其管理集群信息,虽然本例不涉及集群,但是该有的组件都还是会有,典型的kafka分布式架构如下图所示。本例搭建的示例包含Zookeeper+Kafka+Kafka-manger  #获取... 查看详情

rhel6搭建keepalived(ha)任意单故障节点的高可用集群

搭建keepalived(HA)任意单故障节点的高可用集群实验拓扑图:实验要求:使用Keepalived实现web服务器的高可用Web服务器IP地址分别为192.168.4.53和192.168.4.54Web服务器53为主服务器,Web服务器54为备服务器Web服务器的VIP地址为192.168.4.251客... 查看详情

docker——基于docker搭建mongodb分片集群(代码片段)

基于Docker搭建MongoDB分片集群基于Docker搭建MongoDB分片集群MongoDB分片简介MongoDB分片的优势MongoDB分片架构集群中数据分布Chunk分裂及迁移ChunksizeMongoDB分片集群搭建集群测试操作学习视频来源因为平台有相似的,发布为翻译-_-基... 查看详情

influxdb-v0.11集群搭建(docker+nginx+influxdb)

...本,所以测试环境为centos7,为方便测试,容器使用的是docker。网上并没有现成可使用的influxdb的docker镜像,因此我们需要自己来构建,Dockerfile为: 查看详情

activemq高可用集群方案

...稳定性要求极高的系统中,高可用的是必不可少的,当然ActiveMQ也有自己的集群方案。从ActiveMQ5.9开始,ActiveMQ的集群实现方式取消了传统的Master-Slave方式,增加了基于ZooKeeper+LevelDB的Master-Slave实现方式。相关文章:范例项目:&nbs... 查看详情

activemq集群配置高可用

自从activemq5.9.0开始,activemq的集群实现方式取消了传统的PureMasterSlave方式,增加了基于zookeeper+leveldb的实现方式,其他两种方式:目录共享和数据库共享依然存在。 1、Master-Slave部署方式 1)、SharedFilesystemMaster-Slave方式 ... 查看详情

centos7搭建lvs+keepalive负载均衡集群

...nuxVirtualServer)使用,解决单机宕机的问题。keepalived是一个基于VRRP协议来实现IPVS的高可用的解决方案。对于LVS负载均衡来说,如果前端的调度器direct发生故障,则后端的realserver是无法接受请求并响应的。因此,保证前端direct的高... 查看详情

(超详细)基于zookeeper的hadoopha集群的搭建(代码片段)

基于Zookeeper的HadoopHA集群的搭建JunLeon——gobigorgohome 前言:        高可用(highavailability,HA)指的是若当前工作中的机器宕机了,系统会自动处理异常,并将工作无缝地转移到其他备用机器上,以... 查看详情

activemq+zookeper高可用集群方案配置

...稳定性要求极高的系统中,高可用的是必不可少的,当然ActiveMQ也有自己的集群方案。从ActiveMQ5.9开始,ActiveMQ的集群实现方式取消了传统的Master-Slave方式,增加了基于ZooKeeper+LevelDB的Master-Slave实现方式。相关文章:范例项目:&nbs... 查看详情

从入门到精通的activemq

这是ActiveMQ系列的最后一篇文章,主要是关于ActiveMQ集群,这里采用的方式是:Zookeeper+LevelDB+ActiveMQ。前面2篇博客地址如下:《从入门到精通的ActiveMQ(一)》、《从入门到精通的ActiveMQ(二)》。利用Zookeeper实现ActiveMQ的高可用... 查看详情

基于keepalived实现多种模式的高可用集群网站架构

 一、实现主从服务器高可用技术。 大概网络拓扑图:  650)this.width=650;"src="https://s4.51cto.com/oss/201711/07/e3819115371e778e4aae13b66c4fa310.png"title="1.png"alt="e3819115371e778e4aae13b66c4fa310.png"/ 查看详情

jms之——activemq高可用+负载均衡集群

一、高可用集群从ActiveMQ5.9开始,ActiveMQ的集群实现方式取消了传统的Master-Slave方式,增加了基于ZooKeeper+LevelDB的Master-Slave实现方式,其他两种方式目录共享和数据库共享方式依然存在.1、文件共享(KahaDB) [html] viewplain&nbs... 查看详情

corosync+pacemaker的高可用集群

基于corosync+pacemaker的高可用集群    Pacemaker即ClusterResourceManager(简称CRM),用来管理整个HA的控制中心,客户端通过pacemaker来配置管理监控整个集群。它不能提供底层心跳信息传递的功能,它要想与对方节点通信需... 查看详情

redis集群搭建(代码片段)

...3主3从的方式,实际生产中的高可用至少3主6从(1)使用docker-compose启动6个redis容器version:\'3.7\'services:redis7001:image:\'redis:6.2.4\'container_name:redis7001command:["redis-serv 查看详情