-
环境
-
zookeeper-3.4.10
-
jdk1.8.0_201
-
apache-activemq-5.15.8
-
linux centos7
-
架构实现:3台zookeeper 分别布置在3台linux服务器上,每台服务器安装2台 Activemq服务
-
-
Zookeeper、jdk、activemq 环境变量配置
- 添加如下内容:(安装目录根据实际情况改变)
[root@localhost ~]# vi /etc/profile export JAVA_HOME=/opt/jdk1.8.0_201 export ZOOKEEPER_HOME=/opt/zookeeper-3.4.10 export ACTIVEMQ_HOME=/opt/apache-activemq-5.15.8 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.{JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:${ZOOKEEPER_HOME}/bin:${ACTIVEMQ_HOME}/bin export PATH=$PATH:${JAVA_PATH}
- 添加如下内容:(安装目录根据实际情况改变)
-
配置第一台zookeeper,编辑ZK安装目录中conf目录下的zoo.cfg文件(复制一份zoo.simple.cfg改名为zoo.cfg)
- 重点关注标红处配置
[root@localhost zookeeper]# vi conf/zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 clientPort=2181 dataDir=/opt/zookeeper-3.4.10/data(此目录不能写错!!!!) dataLogDir=/opt/zookeeper-3.4.10/logs server.1=192.168.182.2:2888:3888(对应服务器文件myid内容写入1) server.2=192.168.182.3:2888:3888(对应服务器文件myid内容写入2) server.3=192.168.182.4:2888:3888(对应服务器文件myid内容写入3)
- 重点关注标红处配置
-
然后在data目录下创建myid文件然后内容写入1保存退出。(第一台服务器写入1,第二台写入2,第三台写入3,与步骤3处server.X X对应)
-
分别启动bin目录下 zkServer.sh 服务,(防火墙端口设置 2181 2888 3888 zookeeper集群端口开放)
- 启动
sh zkServer.sh start
- 查看当前zookeeper状态
sh zkServer.sh status
- 启动
-
正常启动,三台zookeeper服务,应该1 master 2 follwer
-
开始部署activemq服务
集群1
192.168.182.2 activemq1
192.168.182.3 activemq1
192.168.182.4 activemq1
集群2
192.168.182.2 activemq2
192.168.182.3 activemq2
192.168.182.4 activemq2以服务器192.168.182.2上两台active为例:
进入conf目录,修改activemq.xml-
主要修改broker节点
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="activemq1" dataDirectory="${activemq.data}">
同一集群的三台activemq brokerName必须统一,不同集群的brokerName需要修改
-
添加节点:networkConnectors,加入activemq内部通信配置 uri 配置集群2三台acticemq的服务地址+端口
<networkConnectors> <networkConnector uri="static:(tcp://192.168.182.2:51516,tcp://192.168.182.3:51516,tcp://192.168.182.4:51516)" duplex="true"/> </networkConnectors>
-
修改节点:persistenceAdapter
<persistenceAdapter> <!--<kahaDB directory="${activemq.data}/kahadb"/> -->(注释掉默认的持久化方法) <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:51515" zkAddress="192.168.182.2:2181,192.168.182.3:2181,192.168.182.4:2181" hostname="192.168.182.2" zkPath="/activemq/leveldb-stores"/> </persistenceAdapter>
directory: 存储数据的路径(集群1与集群2的directory必须不同) replicas:集群中的节点数【(replicas/2)+1公式表示集群中至少要正常运行的服务数量】,3台集群那么允许1台宕机, 另外两台要正常运行 bind:当该节点成为master后,它将绑定已配置的地址和端口来为复制协议提供服务。还支持使用动态端口。只需使用tcp://0.0.0.0:0进行配置即可,默认端口为61616。 zkAddress:ZK的ip和port, 如果是集群,则用逗号隔开(这里作为简单示例ZooKeeper配置为单点, 这样已经适用于大多数环境了, 集群也就多几个配置) zkPah:ZK选举信息交换的存贮路径,启动服务后actimvemq会到zookeeper上注册生成此路径 (集群1与集群2的zkPah必须不同) hostname: ActiveMQ所在主机的IP
-
修改节点:transportConnectors
<transportConnectors> <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --> <transportConnector name="openwire" uri="tcp://192.168.182.2:51515?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>
只需修改name为openwire 的tcp 请求uri值,改为本机ip 这里设置本台activemq的服务端口号为51515,其余的请求方式可以注释掉
-
在apache-activemq-5.15.8目录下复制一份conf,命名为conf2
-
进入conf2目录,修改/conf2/jetty.xml文件里jettyPort端口为8162,默认为8161(activemq1已经占用,这里需要修改)
<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>
-
修改 /conf2/activemq.xml 文件
- 修改broker 节点属性brokerName, 与集群1brokerName区别,例如 activemq2
- 修改networkConnector 节点里 uri属性,配置为集群1的三台activemq服务地址+端口
- 修改节点:persistenceAdapter,修改bind端口号为51516;directory 目录 和zkPath 目录 与集群1 区别
<persistenceAdapter> <!--<kahaDB directory="${activemq.data}/kahadb"/> -->(注释掉默认的持久化方法) <replicatedLevelDB directory="${activemq.data}/leveldb2" replicas="3" bind="tcp://0.0.0.0:51516" zkAddress="192.168.182.2:2181,192.168.182.3:2181,192.168.182.4:2181" hostname="192.168.182.2" zkPath="/activemq/leveldb-stores2"/> </persistenceAdapter>
- 修改节点:transportConnectors
修改tcp 请求uri值,改为本机ip +端口号。这里设置本台activemq的服务端口号为51516与另一台activemq服务区别
-
进入/bin目录,复制copy 文件activemq env 命名 activemq2 env2
-
修改env2文件,端口号改为51516,与/conf2/activemq.xml 文件下端口一致
if [ -z "$ACTIVEMQ_QUEUEMANAGERURL" ]; then ACTIVEMQ_QUEUEMANAGERURL="--amqurl tcp://localhost:51516" Fi
-
修改activemq2文件
if [ -z "$ACTIVEMQ_CONFIG_DIR" ] ; then ACTIVEMQ_CONF="$ACTIVEMQ_BASE/conf2" else ACTIVEMQ_CONF="$ACTIVEMQ_CONFIG_DIR" Fi
修改ACTIVEMQ_CONF="$ACTIVEMQ_BASE/conf2" 这里目录改为conf2
if [ -z "$ACTIVEMQ_PIDFILE" ]; then ACTIVEMQ_PIDFILE="$ACTIVEMQ_DATA/activemq2.pid" Fi
修改这里ACTIVEMQ_PIDFILE的值,默认为activemq.pid ,改为activemq2.pid
ACTIVEMQ_CONFIGS="/etc/default/activemq $HOME/.activemqrc $ACTIVEMQ_HOME/bin/env2"
修改这里ACTIVEMQ_CONFIGS的值,默认为bin/env 这里改为bin/env2
-
设置防火墙端口号 51515 51516 8161 8162
-
按照相同方式配置另外两台服务器
-
bin目录下分别启动3台服务器的6台activemq目录
- 启动集群1MQ
sh activemq start
- 启动集群2MQ
sh activemq2 start
- 启动集群1MQ
-
登录activemq控制台
集群1:http://192.168.182.2:8161;http://192.168.182.3:8161;http://192.168.182.4:8161
集群2:http://192.168.182.2:8162;http://192.168.182.3:8162;http://192.168.182.4:8162
两个集群中应该只有1台master服务能进入控制台,其余都是slave服务待机
-
- 客服端配置链接池:
<property name="brokerURL" value="failover:(tcp://192.168.182.2:51515,tcp://192.168.182.3:51515,tcp://192.168.182.4:51515,tcp://192.168.182.2:51516,tcp://192.168.182.3:51516,tcp://192.168.182.4:51516)?randomize=true"/>