文档章节

ActiveMQ+ZooKeeper 伪集群整合

watermelon11
 watermelon11
发布于 02/18 11:26
字数 1671
阅读 34
收藏 1

原理简介:
一般在部署ActiveMQ集群的时候,更倾向于使用基于ZooKeeper的Replicated LevelDB Store方式,该方式是Master Slave部署方案的其中一种策略,也是在多台主机实现ActiveMQ集群的主流部署方式。 此教程只保证了高可用性。要想保证负载均衡得再结合Broker Clusters 部署方案,配置网络连接器。

工作流程:
在ZooKeeper中管理多个Broker节点,根据 Master选举策略让其中一个 Broker选举为Master(只有Master才具备对外提供服务的能力),剩下Broker为slave。
编码时,client端(消费者)通过failover协议来连接ActiveMQ集群。

一、服务端配置

1. ZooKeeper伪集群配置

-- 服务端口 集群通信端口 节点目录/opt/下
zk1 2181 2887:3887 /zookeeper/zk1
zk2 2182 2888:3888 /zookeeper/zk2
zk3 2183 2889:3889 /zookeeper/zk3
集群通信端口:第一个端口是master和slave之间的通信端口,默认是2888;第二个端口是leader选举的端口,集群刚启动的时候选举或者leader挂掉之后进行新的选举的端口默认是3888。

在/opt/zookeeper下复制3个zookeeper服务,并分别配置它们的文件conf/zoo.cfg:

  • zk1
    zk1/conf/zoo.cfg:

    # zookeeper的数据存储和日志存储目录(如果目录不存在就新建)
    dataDir=/opt/zookeeper/zk1/data
    dataLogDir=/opt/zookeeper/zk1/log
    
    #服务端口
    clientPort=2181
    
    # zk集群之间的通信地址
    server.1=localhost:2887:3887
    server.2=localhost:2888:3888
    server.3=localhost:2889:3889

    创建zk1/data/myid文件,填入数字1:

    # 由于该zk1是server.1,所以在myid中设置数字1
    $ vim /opt/zookeeper/zk1/data/myid
  • zk2
    zk2/conf/zoo.cfg:

    # zookeeper的数据存储和日志存储目录(如果目录不存在就新建)
    dataDir=/opt/zookeeper/zk2/data
    dataLogDir=/opt/zookeeper/zk2/log
    
    #服务端口
    clientPort=2182
    
    # zk集群之间的通信地址
    server.1=localhost:2887:3887
    server.2=localhost:2888:3888
    server.3=localhost:2889:3889

    创建zk2/data/myid文件,填入数字1:

    # 由于该zk2是server.2,所以在myid中设置数字2
    $ vim /opt/zookeeper/zk2/data/myid
  • zk3
    zk3/conf/zoo.cfg:

    # zookeeper的数据存储和日志存储目录(如果目录不存在就新建)
    dataDir=/opt/zookeeper/zk3/data
    dataLogDir=/opt/zookeeper/zk3/log
    
    #服务端口
    clientPort=2183
    
    # zk集群之间的通信地址
    server.1=localhost:2887:3887
    server.2=localhost:2888:3888
    server.3=localhost:2889:3889

    创建zk3/data/myid文件,填入数字3:

    # 由于该zk3是server.3,所以在myid中设置数字3
    $ vim /opt/zookeeper/zk3/data/myid

1.2 分别启动zookeeper服务

$ /opt/zookeeper/zk1/bin/zkServer.sh start # 启动zk1服务
$ /opt/zookeeper/zk2/bin/zkServer.sh start # 启动zk2服务
$ /opt/zookeeper/zk3/bin/zkServer.sh start # 启动zk3服务

$ /opt/zookeeper/zk1/bin/zkServer.sh status # 查看zk1服务状态
$ /opt/zookeeper/zk2/bin/zkServer.sh status # 查看zk2服务状态
$ /opt/zookeeper/zk3/bin/zkServer.sh status # 查看zk3服务状态

2. ActiveMQ伪集群配置

2.1 修改ActiveMQ配置文件conf/activemq.xmlconf/jetty.xml

-- 服务端口 jetty控制台端口 节点目录/opt/下
node1 61616 8161 /activemq/node1
node2 61617 8162 /activemq/node2
node3 61618 8163 /activemq/node3

在/opt/activemq/复制3个activemq服务,并分别配置它们的文件conf/activemq.xml和conf/jetty.xml:
conf/jetty.xml:

  • node1
    /opt/activemq/node1/conf/activemq.xml:

    <!-- activemq支持5种协议:openwire、amqp、 stomp、mqtt、ws,这里我们只使用openwire协议,注释其它协议 -->
    <transportConnectors>
        <!-- node1服务端口使用默认端口61616 -->
        <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>
    
    <!-- 持久化的部分为ZooKeeper集群连接地址-->  
    <persistenceAdapter>  
        <replicatedLevelDB  
          directory="${activemq.data}/leveldb"  
          replicas="3"  
          bind="tcp://0.0.0.0:0"  
          zkAddress="localhost:2181,localhost:2182,localhost:2183"   
          zkPath="/opt/activemq/leveldb-stores"  
          hostname="localhost"  
          />  
    </persistenceAdapter>
    <!-- 
    # directory: 存储数据的路径
    # replicas:集群中的节点数【(replicas/2)+1公式表示集群中至少要正常运行的服务数量】,3台集群那么允许1台宕机, 另外两台要正常运行  
    # bind:当该节点成为master后,它将绑定已配置的地址和端口来为复制协议提供服务。还支持使用动态端口。只需使用tcp://0.0.0.0:0进行配置即可,默认端口为61616。 
    # zkAddress:ZK的ip和port, 如果是集群,则用逗号隔开(这里作为简单示例ZooKeeper配置为单点, 这样已经适用于大多数环境了, 集群也就多几个配置) 
    # zkPassword:当连接到ZooKeeper服务器时用的密码,没有密码则不配置。 
    # zkPah:ZK选举信息交换的存贮路径,启动服务后actimvemq会到zookeeper上注册生成此路径   
    # hostname: ActiveMQ所在主机的IP
    # 更多参考:http://activemq.apache.org/replicated-leveldb-store.html
    -->

    /opt/activemq/conf/jetty.xml:

    <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"/> <!-- 在这里修改端口为8161,默认就是8161 -->
    </bean>
  • node2
    /opt/activemq/node2/conf/activemq.xml:

    <transportConnectors>
        <!-- 服务端口改为61617 -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>
    
    <!-- 持久化的部分为ZooKeeper集群连接地址-->  
    <persistenceAdapter>  
        <replicatedLevelDB  
          directory="${activemq.data}/leveldb"  
          replicas="3"  
          bind="tcp://0.0.0.0:0"  
          zkAddress="localhost:2181,localhost:2182,localhost:2183"   
          zkPath="/opt/activemq/leveldb-stores"  
          hostname="localhost"  
          />  
    </persistenceAdapter>

    /opt/activemq/conf/jetty.xml:

    <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"/> <!-- 在这里修改端口为8162,默认是8161 -->
    </bean>
  • node3
    /opt/activemq/node3/conf/activemq.xml:

    <transportConnectors>
        <!-- 服务端口改为61618 -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>
    
    <!-- 持久化的部分为ZooKeeper集群连接地址-->  
    <persistenceAdapter>  
        <replicatedLevelDB  
          directory="${activemq.data}/leveldb"  
          replicas="3"  
          bind="tcp://0.0.0.0:0"  
          zkAddress="localhost:2181,localhost:2182,localhost:2183"   
          zkPath="/opt/activemq/leveldb-stores"  
          hostname="localhost"  
          />  
    </persistenceAdapter>

    /opt/activemq/node3/conf/jetty.xml:

    <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"/> <!-- 在这里修改端口为8163,默认是8161 -->
    </bean>

2.2 依次启动activemq服务

$ /opt/activemq/node1/bin/activemq start # 启动节点node1服务
$ /opt/activemq/node2/bin/activemq start # 启动节点node2服务
$ /opt/activemq/node3/bin/activemq start # 启动节点node3服务

$ ps -ef|grep activemq # 检查进程是否运行,即activemq是否启动成功
$ netstat -anp|grep 61616 # 查看服务端口61616,监听情况
$ netstat -anp|grep 61617 # 查看服务端口61617,监听情况
$ netstat -anp|grep 61618 # 查看服务端口61618,监听情况

三、Client使用

该zookeeper+activemq的集群Master Slave部署方案,能够提供(3-1)/2的容错率,即3台服务器允许宕机一台,而不影响整个集群的对外提供服务。

编写代码连接时使用failover策略:

String url = failover:(tcp://192.168.100.142:61616,tcp://192.168.100.142:61617,tcp://192.168.100.142:61618)?initialReconnectDelay=1000

本文转载自:https://segmentfault.com/a/1190000014636822

watermelon11
粉丝 8
博文 87
码字总数 101654
作品 0
深圳
私信 提问
ActiveMQ+ZooKeeper 集群整合

原理简介: 一般在部署ActiveMQ集群的时候,更倾向于使用基于ZooKeeper的,该方式是的其中一种策略,也是在多台主机实现ActiveMQ集群的主流部署方式。 此教程。要想保证负载均衡得再结合Bro...

watermelon11
02/18
44
0
ActiveMQ+Zookeeper 集群配置实现高可用

1.安装配置zookeeper集群,详见博客Zookeeper集群模式安装http://blog.csdn.net/u012343297/article/details/78792990。 2.下载apache-activemq-5.15.2-bin.tar.gz,链接:https://mirrors.t......

u012343297
2017/12/13
0
0
(5)Centos6.X安装FastDFS(伪分布)

1.什么是 是用c语言编写的一款开源的分布式文件系统。为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用很容易搭建一套高性能的文件服务器...

LoveCarpenter
2017/08/17
0
0
ZooKeeper伪分布式集群安装及使用

ZooKeeper伪分布式集群安装及使用 让Hadoop跑在云端系列文章,介绍了如何整合虚拟化和Hadoop,让Hadoop集群跑在VPS虚拟主机上,通过云向用户提供存储和计算的服务。 现在硬件越来越便宜,一台...

张升强
2013/10/31
375
1
整合 Tachyon 运行 Hadoop MapReduce(译)

整合 Tachyon 运行 Hadoop MapReduce 本指南描述如何使Tachyon 与 Hadoop MapReduce 结合运行,这样你可以很容易运行 hadoop MapReduce 程序文件存储在 Tachyon上。 前提 这部分额外的首要条...

Ryan-瑞恩
2015/10/20
299
0

没有更多内容

加载失败,请刷新页面

加载更多

JAVA CAS单点登录之三:CAS代理模式演练

前言 JAVA CAS单点登录之一:搭建CAS服务器 JAVA CAS单点登录之二:CAS普通模式1演练 代理模式相相对上一节的普通模式,更加复杂了。但配置起来也会稍微有些差别。所谓难者不会,会者不难。如...

彬彬公子
41分钟前
5
0
Webfont 的兼容性问题[持续更新]

本文转载于:专业的前端网站➺Webfont 的兼容性问题[持续更新] 低版安卓手机的 webview 显示不了,另外黑莓手机显示出来是这样: 生成工具: 离线字体生成工具:webfont 在线字体生成平台:ico...

前端老手
45分钟前
4
0
调用链与日志关联的探索式查询

摘要:本文将就Observability中的日志聚合、分布式跟踪及具体应用中结合使用进行展开说明。 一、Observability Observability是一个最近几年开始在监控社区流行的术语。本文将Observability...

宜信技术学院
45分钟前
4
0
Java常见异常处理

异常是Java程序中经常遇到的问题,一个异常就是一个Bug,就要花很多时间来定位异常。 Java异常 (1)Throwable是Java异常的顶级类,所有的异常都继承于这个类。 (2)Error,Exception是异常...

daxiongdi
今天
4
0
Validator 常用注解

说明 Validator主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数字的,等等。那么在spring boot怎么使用这么强大的校验框架呢。 常用 [@null](https:...

五彩的颜色
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部