个人专题目录
八、ActiveMQ集群
使用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
搭建伪集群,在同一个Linux中安装三个ZooKeeper实例。使用不同的端口实现同时启动。端口分配如下:
主机 | 服务端口 | 投票端口 | 选举端口 |
---|---|---|---|
192.168.159.130 | 2181 | 2881 | 3881 |
192.168.159.130 | 2182 | 2882 | 3882 |
192.168.159.130 | 2183 | 2883 | 3883 |
1.1.1 解压缩
tar -zxf zookeeper
1.1.2 复制
cp -r zookeeper /usr/local/zookeeper1
1.1.3 创建data数据目录
在zookeeper1目录中创建子目录data目录
mkdir data
1.1.4 编写Zookeeper配置文件
vi /usr/local/solrcloude/zookeeper1/conf/zoo.cfg
修改数据目录
1.1.5 复制两份同样的Zookeeper
cp zookeeper1 zookeeper2 -r
cp zookeeper1 zookeeper3 -r
1.1.6 为Zookeeper服务增加服务命名
在每个Zookeeper应用内的data目录中增加文件myid
内部定义每个服务的编号. 编号要求为数字,是正整数
可以使用回声命名快速定义myid文件
echo 1 >> myid
1.1.7 修改Zookeeper配置文件 zoo.cfg
修改端口号.
提供多节点服务命名
port=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.8 启动Zookeeper测试
要至少启动两个Zookeeper启动. 启动单一Zookeeper,无法正常提供服务.
1.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 |
1.2.1 安装ActiveMQ实例
1.2.2 修改配置信息
1.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>
1.2.2.2 统一所有主从节点Broker命名
修改conf/activemq.xml文件。修改broker标签属性信息,统一所有节点的broker命名。
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="mq-cluster" dataDirectory="${activemq.data}">
1.2.2.3 修改持久化配置
修改conf/activemq.xml文件。修改broker标签中子标签persistenceAdapter相关内容。
replicas属性代表当前主从模型中的节点数量。按需配置。
bind属性中的端口为主从实例之间的通讯端口。代表当前实例对外开放端口是什么,三个实例分别使用62626、62627、62628端口。
zkAddress属性代表ZooKeeper安装位置,安装具体情况设置。
zkPath是ActiveMQ主从信息保存到ZooKeeper中的什么目录内。
hostname为ActiveMQ实例安装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>
1.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: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>
1.3 启动主从
将三个ActiveMQ实例分别启动。{activemq-home}/data/activemq.log。
1.4 查看主从状态
1.4.1 使用客户端连接ZooKeeper
${zkHome}/bin/zkCli.sh
1.4.2 查看状态信息
连接成功后,可以使用命令‘ls’查看ZooKeeper中的目录结构
如:
ls /
ls /activemq/leveldb-stores
找到对应的内容后,可以使用命令‘get’查看ZooKeeper中的数据内容
get /activemq/leveldb-stores/00000000005
其中主节点的elected及address属性一定有数据。从节点则数据为‘null’。
2 集群
准备多份主从模型。在所有的ActiveMQ节点中的conf/activemq.xml中增加下述配置:(每个主从模型中的networkConnector都指向另外一个主从模型)
<networkConnectors>
<networkConnector uri="static://(tcp://ip:port,tcp://ip:port)" duplex="false">
</networkConnector>
</networkConnectors>
注意配置顺序,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>