文章目录
使用
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
安装位置, 安装具体情况设置。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>
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&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.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
其中主节点的 elected
及 address
属性一定有数据。 从节点则数据为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>