ActiveMQ集群搭建以及zookeeper的安装


使用ZooKeeper+ActiveMQ实现主从和集群.

1 Master-Slave

主从模式是一种高可用解决方案。 在 ZooKeeper中注册若干 ActiveMQ Broker, 其中只有一个 Broker提供对外服务(Master), 其他 Broker 处于待机状态(Slave)。 当Master出现故障导致宕机时, 通过ZooKeeper 内部的选举机制, 选举出一台 Slave 替代Master继续对外提供服务。官方文档:http://activemq.apache.org/replicated-leveldb-store.html

1.1 安装 ZooKeeper

zookeeper一般建议为奇数个,方便快速投票和选举,半数以上的才可以选出主机
搭建伪集群, 在同一个Linux中安装三个 ZooKeeper实例。 使用不同的端口实现同时启动。 端口分配如下:

主机 服务端口 投票端口 选举端口
192.168.159.130 2181 2881 3881
192.168.159.130 2182 2882 3882
192.168.159.130 2182 2882 3882

1.1.1 解压缩

tar -zxvf zookeeper

1.1.2 复制配置文件

zookeeper解压后的conf目录中,把zoo_sample.cfg给复制一份并且名字为zoo.cfg,这是因为zoo_sample.cfg只是配置模板,需要我们以这个模板为基础创建zoo.cfg,并且zookeeper真正读取的是zoo.cfg文件
cp zoo_sample.cfg zoo.cfg

1.1.3 创建 data 数据目录

因为在 zookeeper 中需要临时的数据目录,因为在解压后的文件夹中创建文件夹 data目录
mkdir data
另外,需要在每个Zookeeper 应用内的 data目录中增加文件myid,内部定义每个服务的编号. 编号要求为数字,是正整数可以使用回声命名快速定义 myid 文件,这个文件的名字必须是myid,其他的话回启动失败
echo 1 > myid

1.1.4 编写Zookeeper配置文件

vi /usr/local/solrcloude/zookeeper1/conf/zoo.cfg

  • 修改data数据目录的路径
  • clientPort=2181 客户端访问端口,因此三个 zookeeper 实例不能端口相同.
    还需要如下配置:server.服务的编号=IP:投票端口:选举端口
    投票端口:用于决定正在运行的主机是否宕机
    选举端口: 用于决定哪一个 Zookeeper服务作为主机
    三个Zookeeper 应用配置一致.
server.1=192.168.120.132:2881:3881
server.2=192.168.120.132:2882:3882
server.3=192.168.120.132:2883:3883

1.1.5 复制两份同样的Zookeeper

cp zookeeper1 zookeeper2 -r
cp zookeeper1 zookeeper3 -r

复制后,要修改zoo.cfg

1.1.6 启动 Zookeeper 测试

要至少启动两个 Zookeeper 启动. 启动单一 Zookeeper,无法正常提供服务.

# 启动
zookeeper1/bin/zkServer.sh start
# 查看状态
zookeeper1/bin/zkServer.sh status

2.2安装 ActiveMQ

在同一个Linux中安装三个 ActiveMQ 实例, 使用不同端口实现同时启动。 端口分配如下:

主机 M-S 通讯端口 服务端口 jetty 端口
192.168.159.130 62626 61616 8161
192.168.159.130 62627 61617 8162
192.168.159.130 62628 61618 8163

2.2.1 解压ActiveMQ

tar -zxvf apache-activemq-5.9.0-bin.tar.gz
解压后,直接复制3份,cp -r apache-activemq

2.2.2 修改配置信息

2.2.2.1 修改 jetty 端口

修改conf/jetty.xml 中的端口配置。 分别是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="port" value="8161"/>
</bean>

2.2.2.2 统一所有主从节点 Broker 命名

修改conf/activemq.xml 文件。 修改broker标签属性信息, 统一所有节点的broker 命名。

<broker xmlns="http://activemq.apache.org/schema/core" 
    brokerName="mq-cluster" dataDirectory="${activemq.data}">

2.2.2.3 修改持久化配置

修改 conf/activemq.xml 文件
修改 broker标签中子标签 persistenceAdapter相关内容:

  • replicas属性代表当前主从模型中的节点数量。 按需配置。
  • bind 属性中的端口为主从实例之间的通讯端口。 代表当前实例对外开放端口是什么, 三个实例分别使用 62626、 62627、 62628端口。
  • zkAddress 属性代表ZooKeeper安装位置, 安装具体情况设置。
  • zkPathActiveMQ 主从信息保存到 ZooKeeper中的什么目录内。
  • hostnameActiveMQ实例安装 Linux的主机名, 可以在/etc/hosts 配置文件中设置。 设置格式为: IP 主机名。 如:127.0.0.1 mq-server
<persistenceAdapter>
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
<replicatedLevelDB
directory="${activemq.data}/levelDB"
replicas="3"
bind="tcp://0.0.0.0:62626"
zkAddress="192.168.159.130:2181,192.168.159.130:2182,192.168.159.130:2183"
zkPath="/activemq/leveldb-stores"
hostname="mq-server"
/>
</persistenceAdapter>

2.2.2.4 修改服务端口

修改 ActiveMQ对外提供的服务端口。 原默认端口为 61616
当前环境使用的端口为:61616、 61617、 61618
修改conf/activemq.xml配置文件。 修改broker 标签中子标签transportConnectors的相关配置

<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616maximumConnections=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>

2.2.3启动主从

将三个 ActiveMQ 实例分别启动。${activemq-home}/bin/active start
启动后, 可以查看日志文件, 检查启动状态, 日志文件为${activemq-home}/data/activemq.log

2.2.4查看主从状态

2.2.4.1 使用客户端连接 ZooKeeper

${zkHome}/bin/zkCli.sh

2.2.4.2查看状态信息

连接成功后, 可以使用命令ls查看ZooKeeper中的目录结构如:

ls /
ls /activemq/leveldb-stores

找到对应的内容后, 可以使用命令get 查看 ZooKeeper 中的数据内容
在这里插入图片描述
get /activemq/leveldb-stores/00000000005其中主节点的 electedaddress 属性一定有数据。 从节点则数据为null

2.2.5 java中的代码

//普通模式连接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory("guest","guest","tcp://192.168.126.133:61616");
//集群模式连接工厂
// failover -失败转移,当任意节点宕机,自动转移
ConnectionFactory factory = new ActiveMQConnectionFactory("guest","guest",
"failover:(tcp://192.168.126.133:61616,tcp://192.168.126.133:61617,tcp://192.168.126.133:61618)?Randomize=false");

2.2.6 activeMq主从集群

准备多份主从模型。 在所有的 ActiveMQ节点中的 conf/activemq.xml中增加下述配置:
(每个主从模型中的 networkConnector都指向另外一个主从模型)

<networkConnectors>
<networkConnector uri="static://(tcp://ip:port,tcp://ip:port)" duplex="false">
</networkConnector>
</networkConnectors>

duplex="false"的意思是不做复制,假入有两个模型,设置为fasle的话,其中得到消息的模型就不会复制到没有得到消息的模型里,如果设置为true,那么得到消息的模型会把消息复制到没有得到消息的模型中去
注意配置顺序Networks相关配置必须在持久化相关配置之前。 如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://activemq.apache.org/schema/core">
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="mq-cluster"
dataDirectory="${activemq.data}" >
<networkConnectors>
<networkConnector uri=" static://(tcp://ip:port,tcp://ip:port)"/>
</networkConnectors>
<persistenceAdapter>
<replicatedLevelDB directory = "xxx"/>
</persistenceAdapter>
</broker>
</beans>

如: 主从模型1 -192.168.159.129主从模型 2 - 192.168.159.130
在主从模型 1 的所有节点activemq.xml 配置文件中增加标签:

<networkConnectors>
<networkConnector uri="static://(tcp://192.168.159.130:61616,tcp://192.168.159.130:61617)"/>
</networkConnectors>

在模型 2 中所有节点增加配置:

<networkConnectors>
<networkConnector uri="static://(tcp://192.168.159.129:61616,tcp://192.168.159.129:61617)"/>
</networkConnectors>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章