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&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"/>--> #注意,后面还有两个-
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:端口”访问哪个。