activemq集群搭建

activemq集群搭建

一、ZooKeeper 配置

本文采用伪集群方式,即在一台主机上部署3个activemq服务(端口不同)+3个zookeeper服务(端口不同)

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

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

 

 

--服务端口集群通信端口节点目录/usr/local下
zk1 2181 2881:3881 /zookeeper/zk1
zk2 2182 2882:3882 /zookeeper/zk2
zk3 2183 2883:3883 /zookeeper/zk3

集群通信端口:第一个端口是master和slave之间的通信端口,默认是2881;第二个端口是leader选举的端口,集群刚启动的时候选举或者leader挂掉之后进行新的选举的端口默认是3881。

#把zookeeper-3.4.14下所有内容复制3份
cd /usr/local/src
tar xf zookeeper-3.4.14.tar.gz -C /usr/local/
cd .. mkdir zookeeper cd zookeeper mkdir zk1 zk2 zk3 cd /usr/local/zookeeper-3.4.14.tar.gz /bin/cp -r * /usr/local/zookeeper/zk1
/bin/cp -r * /usr/local/zookeeper/zk2 /bin/cp -r * /usr/local/zookeeper/zk3

 

 

我们进入Zookeeper的zk1、zk2、zk3目录下,里面的conf目录下有一个zoo_sample.cfg文件,这个是Zookeeper配置文件的样板,我们将它复制一份并重命名为zoo.cfg

cd /usr/local/zookeeper/zk1/conf
cp zoo_sample.cfg zoo.cfg
#### zk2、zk3也要复制

 

 

配置zoo.cfg文件,创建myid (zk1 zk2 zk3都要配置)

zk1/conf/zoo.cfg:

# zookeeper的数据存储和日志存储目录(如果目录不存在就新建)
dataDir=/usr/local/zookeeper/zk1/data
dataLogDir=/usr/local/zookeeper/zk1/log

#服务端口
clientPort=2181

# zk集群之间的通信地址
server.1=0.0.0.0:2881:3881
server.2=39.96.206.145:2882:3882                 #本文使用的服务器IP为39.96.206.145
server.3=39.96.206.145:2883:3883                 #注意server.1的IP为0.0.0.0, 配置zk2、zk3的zoo.cfg时,也要将自己的IP改为0.0.0.0

 

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

cd zk1
mkdir data
# 由于该zk1是server.1,所以在myid中设置数字1 vim /usr/local/zookeeper/zk1/data/myid
cat /usr/local/zookeeper/zk1/data/myid
1

 

zk2/conf/zoo.cfg:

# zookeeper的数据存储和日志存储目录(如果目录不存在就新建)
dataDir=/usr/local/zookeeper/zk2/data
dataLogDir=/usr/local/zookeeper/zk2/log

#服务端口
clientPort=2182                  #将端口改为2182

# zk集群之间的通信地址
server.1=39.96.206.145:2881:3881
server.2=0.0.0.0:2882:3882             #server.2的IP为0.0.0.0
server.3=39.96.206.145:2883:3883

 

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

cd zk2
mkdir data
# 由于该zk2是server.2,所以在myid中设置数字2 vim /usr/local/zookeeper/zk2/data/myid
cat /usr/local/zookeeper/zk2/data/myid
2

 

zk3/conf/zoo.cfg:

# zookeeper的数据存储和日志存储目录(如果目录不存在就新建)
dataDir=/usr/local/zookeeper/zk3/data
dataLogDir=/usr/local/zookeeper/zk3/log

#服务端口
clientPort=2183                 #将端口修改为2183

# zk集群之间的通信地址
server.1=39.96.206.145:2881:3881
server.2=39.96.206.145:2882:3882
server.3=0.0.0.0:2883:3883            #server.3的IP改为0.0.0.0

 

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

cd zk3
mkdir data
# 由于该zk3是server.3,所以在myid中设置数字3 vim /usr/local/zookeeper/zk3/data/myid
cat /usr/local/zookeeper/zk3/data/myid
3

 

启动Zookeeper

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

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

 若显示如下,代表zookeeper已经设置好:

[root@iZ2zeftv2pqb7exm458ppiZ src]# /usr/local/zookeeper/zk1/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/zk1/bin/../conf/zoo.cfg
Mode: follower
[root@iZ2zeftv2pqb7exm458ppiZ src]# /usr/local/zookeeper/zk2/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/zk2/bin/../conf/zoo.cfg
Mode: leader                                                                  ####若成功,则会有一个zookeeper成为master
[root@iZ2zeftv2pqb7exm458ppiZ src]# /usr/local/zookeeper/zk3/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/zk3/bin/../conf/zoo.cfg
Mode: follower

 

 

 

二、ActiveMQ配置

  ActiveMQ的主从模型,是一种高可用的解决方案,在zookeeper中注册若干的ActiveMQ Broker,其中只有一台作为主机master对外提供服务,其他作为备份slave保持待机。当master出现问题导致宕机不能正常提供服务的时候,zookeeper通过内部选举,在众多slave中推举出一台作为master继续对外提供服务。

2.1、安装Activemq

因为ActiveMQ是java编写,因此需要java的运行环境,这个不做介绍,网上有一堆的教程。

  其次,下载ActiveMQ包,官网下载地址:https://archive.apache.org/dist/activemq/ ,读者可以选择一个版本下载使用,比如,当前最新版是5.16.1,下载地址:https://archive.apache.org/dist/activemq/5.16.1/

  

  官网下载速度比较慢,可能需要一两个小时,有百度网盘会员的可以移步百度网盘:https://pan.baidu.com/s/1-ToyzCqo_ypk7FXcjgI3yg (提取码: jcd7 )

    

  单机安装与配置

  首先将tar包传到linux上去(我这里使用的是Ubuntu16.04),然后在tar包所在目录进行解压:  

   # -C 表示解压出来的文件保存目录,默认是tar包所在目录,这里我选择的是/opt目录,注意修改权限,如果你是root用户,则不需要修改
  tar xf apache-activemq-5.16.1-bin.tar.gz -C /usr/local/

   其实我们下载好的tar包是编译打包好的,只需解压就可以启动了:  

   # 使用后台线程启动
  sudo ./bin/activemq start
  # 使用控制台方式启动,这种方式会造成当前shell阻塞,如果想使用服务单元或者supervisor这样的工具做守护进程,那么应该采用这种启动方式
  sudo ./bin/activemq console
  # 停止应用
  sudo ./bin/activemq stop
  # 重启应用
  sudo ./bin/activemq restart

  但是还需要做一些修改

2.1.1、修改Connector

  打开conf/activemq.xml,找到 transportConnectors 节点配置,注释掉多余的连接协议,只留自己需要的就行了,比如我一般用openwire,那我就将其它的注释掉

  说明一下,为什么要这么做,主要是没必要,也可以避免端口冲突,比如,rabbitmq默认采用ampq监听5672端口,这时你会发现activemq启动不了,因为端口冲突。  

  <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="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"/>-->     #注意,后面还有两个-

2.1.2、启用延时投递

schedulerSupport="true" 

 

 

 2.1.3、消息的传递

对 activemq 目录下的 bin/env 配置文件进行配置,可以将下列系统属性添加到 ACTIVEMQ_OPTS 变量中,保存退出即可。

-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=*

 

 

 

 

  

2.1.4、管理后台启动配置

   默认情况下启动时,ActiveMQ管理后台绑定到127.0.0.1:8161,这表示我们只能在本地访问,这肯定是不能接受的,我们需要修改这个地址。

  打开conf/jetty.xml,找到id="jettyPort"的bean,

   

   修改这里的host成0.0.0.0,端口随意,也可以使用默认的8161:  

    <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>

 

 

2.1.5、启动

第一次建议采用控制台console的形式启动,有时候会报错,报错则会打印异常信息,方便我们排查,我们使用 /bin/activemq console命令启动

 
 /bin/activemq console

 

启动后大概是这样的:

  

  注意输出的信息,可以看到:  

  1、ActiveMQ版本是5.16.1,使用KahaDB做持久化,版本7
  2、openwire方式连接启动,监听:tcp://test1:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600,还有ampq、stomp、mqtt、ws等分别在不同端口启动监听(注,这里的test1是在hosts中添加的,看我上面提供的三个虚拟机)
  3、Jetty服务启动,其实就是启动ActiveMQ的管理后台
  4、ActiveMQ管理后台地址:http://127.0.0.1:8161/,ActiveMQ的Jolokia API地址:http://127.0.0.1:8161/api/jolokia/,Jolokia API主要是通过API接口获取ActiveMQ的状态信息,方便第三方程序进行监控

  

 

 

然后就可以在浏览器上访问管理后台了,比如我部署的服务器IP是39.96.206.145,那么就访问http://39.96.206.145:8161,接着会要求输入账号和密码,默认都是admin,登录后进入欢迎也,然后在点击Manage ActiveMQ broker进入管理后台:

  

  

 

 

 2.2、修改activemq配置文件,搭建集群

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

把activemq下内容复制3份,分别为:node1 node2 node3

cd /usr/local/
mkdir activemq
cd activemq
mkdir node1 node2 node3
cd apache-activemq-5.16.1
/bin/cp -r */usr/local/activemq/node1
/bin/cp -r */usr/local/activemq/node2
/bin/cp -r */usr/local/activemq/node3

 对3个activemq服务,node1 node2 node3 ,分别配置它们的文件conf/activemq.xml和conf/jetty.xml:

 

2.2.1、修改服务端口(activemq.xml)

  node1 node2 node3分别修改对外提供的openwire服务端口为61616、61617、61618。待修改的地方如下:

<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&wireFormat.maxFrameSize=104857600"/>
            <!--transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?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:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/-->
        </transportConnectors>

 

2.2.2、修改持久化策略(activemq.xml

  修改 persistenceAdapter 标签中的内容,其中相关属性说明如下:

      replicas - 当前主从模型中的节点数,根据实际配置

      bind - 主从实例间的通讯端口。分别配置为62626、62627、62628

      zkAddress - zookeeper应用的安装位置

      zkPath - ActiveMQ的主从信息保存在zookeeper中的什么目录

      hostname - ActiveMQ实例安装的实际linux主机名。可在 /etc/hosts 中进行配置,设置格式:ip 主机名,例如127.0.0.1 mq-server

<persistenceAdapter>
      <replicatedLevelDB
      directory="${activemq.data}/levelDB"
      replicas="3"
      bind="tcp://0.0.0.0:62626"
      zkAddress="0.0.0.0:2181,39.96.206.145:2182,39.96.206.145:2183"           ###注意:这里要与zookeeeper的通信地址相对应,例如:node2为 zkAddress="39.96.206.145:2181,0.0.0.0:2182,39.96.206.145:2183
 zkPath="/activemq/leveldb-stores" hostname="hostname" /> </persistenceAdapter>

 

    

2.2.3、修改控制台访问端口(jetty.xml)

      分别修改jetty的访问端口为:8161、8162、8163

 <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>

 

2.3、启动ActiveMQ应用

 配置完成后,分别启动3个ActiveMQ应用,启动命令:/usr/local/activemq/node1/bin/activemq start。启动后,查看日志文件,日志目录:/usr/local/activemq/node1/data/activemq.log

 

 

最后,ActiveMQ的主从模型,是一种高可用的解决方案,在zookeeper中注册若干的ActiveMQ Broker,其中只有一台作为主机master对外提供服务,其他作为备份slave保持待机。当master出现问题导致宕机不能正常提供服务的时候,zookeeper通过内部选举,在众多slave中推举出一台作为master继续对外提供服务。

activemq集群最多支持损坏一个节点,若损坏2台,集群所有节点将停止运行

集群中只有master对外提供服务,其他两个slave不对外提供服务,当访问activemq管理后台时,可以用“nerstat -antup | grep 端口” 命令分别查看8161、8162、8163哪一个在运行,运行哪个,我们就使用“http://IP:端口”访问哪个。

 

 

posted @ 2021-07-09 16:05  Augen  阅读(1252)  评论(0编辑  收藏  举报