使用 Zookeeper 实现的 Master-Slave(主从)的实现方式,是对 ActiveMQ 进行高可用的一种有效解决方案。
高可用的原理:使用 Zookeeper(集群) 注册所有的 ActiveMQ Broker,只有其中的一个 Broker 可以对外提供服务(也就是Master节点),其他的 Broker 处于待机状态,被视为 Slave。如果 Master 因为故障不能对外提供服务,则利用 Zookeeper 的内部选举机制从 Slave 中选举出一个 Broker 充当 Master 节点,继续对外提供服务。
因此通过 Zookeeper+ActiveMQ 实现的集群,可以有效的排除单点故障引起的服务中断。
1环境准备
第一步:准备三台服务机器,因为是本地模拟。所以依赖于 vmware 克隆了三个虚拟机,虚拟机的 IP 地址分别为:
192.168.32.129
192.168.32.131
192.168.32.130
第二步:分别从 zookeeper 和 activemq 的官网上下载其在 linux 环境下的安装包
apache-zookeeper-3.6.1-bin.tar
apache-activemq-5.15.13-bin.tar
第三步:将下载好的 apache-zookeeper-3.6.1-bin.tar、apache-activemq-5.15.13-bin.tar 分别上传至三台虚拟机中,注意不要直接从 Windows 桌面进行拖拽上传,一定要通过工具连接上 sftp在进行上传,直接拖拽上传,会造成压缩包文件内容的缺失。因此将压缩包上传完成,可以在 linux 下通过 ls -lht 查看下上传后的压缩包大小。
第四步:通过 tar -zxvf apache-zookeeper-3.6.1-bin.tar 命令来解压 zk。
第五步:通过 mv 命令将解压后的 zk 文件名称进行调整。
第六步:进入到 zk 的安装目录下,新建两个目录 data 和 logs ,分别存放数据和日志;
第七步:将 zookeeper/conf 目录下的 zoo_sample.cfg 文件名称修改为 zoo.cfg
第八步:在三台虚拟机上分别解压 ActiveMQ 的安装包,为了方便将其解压后的文件夹更名为 activemq。
2 集群配置
第一步:在服务器上(我们本地就是三台虚拟机)的 zk 的 data 目录下都创建 myid 文件,文件内容分别为 1、2、3
第二步:修改 zookeeper/conf/zoo.cfg 文件,加入以下内容:
dataDir=/home/bao/zookeeper/data/dataLogDir=/home/bao/zookeeper/logs/server.1=192.168.32.129:2888:3888server.2=192.168.32.130:2888:3888server.3=192.168.32.131:2888:3888
注意:
server.X:这个 X 就是分别写入的 data 文件夹下 myid 中的值,且这个值需要和ip一一对应
2888 为主端口,3888 为备用端口。
第三步:为了不影响各个服务器之间的通信,需要通过命令 service iptables stop 关闭防火墙;
第四步:进入 bin 目录下,将 3 台虚拟机上的 zookeeper 都启动起来。通过命令 ./zkServer.sh start 进行启动
第五步:修改 activmq 的 conf 目录下的 activemq.xml 文件。
修改 brokerName = "activemq-cluster"
将文件中的持久化适配器修改为:
<persistenceAdapter> <replicatedLevelDB> directory="${activemq.data}/leveldb" reclicas=3 bind="tcp://0.0.0.0" zkAddress="192.168.32.129:2181,192.168.32.130:2181,192.168.32.131:2181" hostname="192.168.32.129" zkPath="/activemq/leveldb-stores" replicatedLevelDB>persistenceAdapter>
注意:hostname 对应的应该是当前机器对应的 ip,例如我们此时将其配置在 192.168.32.129 服务器上,那么此时就是192.168.32.129。
第六步:在 activemq 的 bin 目录下 执行 ./activemq start 命令启动 ActiveMQ.
第七步:验证集群配置
综上即验证了集群访问。
先将虚拟机上的三个 activemq 都启动起来
此时访问发现只有一个可以用
将能用的这个停止,另外两个会选择出来一个可以用
此时在将能用的这个重新启动,发现还是无法访问