返回目录:金融新闻
一、安装环境
OS:Cent OS 6.8
Java:JDK 1.8
Zookeeper:3.4.9
ActiveMQ:5.15.0
二、MQ集群介绍以及搭建方式对比
从 ActiveMQ 5.9 开始,ActiveMQ 的集群实现方式取消了传统的 Master-Slave 方式,增加了基于ZooKeeper + LevelDB 的 Master-Slave 实现方式,其他两种方式目录共享和数据库共享依然存在。
三种集群方式的对比:
1.基于共享文件系统(KahaDB,默认):
<persistenceAdapter>
<kahaDBdirectory="${activemq.data}/kahadb"/>
</persistenceAdapter>
2.基于 JDBC:
#数据源配置
<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="maxActive" value="20"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds"
createTablesOnStartup="false"/>
</persistenceAdapter>
3.基于可复制的 LevelDB(本文中采用这种集群方式):
LevelDB 是 Google 开发的一套用于持久化数据的高性能类库。LevelDB 并不是一种服务,用户需要自行实现 Server。是单进程的服务,能够处理十亿级别规模 Key-Value 型数据,占用内存小。
<persistenceAdapter><replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62621" zkAddress="localhost:2181,localhost:2182,localhost:2183" hostname="localhost" zkPath="/activemq/leveldb-stores"/> </persistenceAdapter>
三、基于ZooKeeper + LevelDB的MQ集群原理
高可用的原理:使用 ZooKeeper(集群)注册所有的 ActiveMQ Broker。只有其中的一个 Broker 可以提供服务,被视为 Master,其他的 Broker 处于待机状态,被视为 Slave。如果 Master 因故障而不能提供服务,ZooKeeper 会从 Slave 中选举出一个 Broker 充当 Master。
Slave 连接 Master 并同步他们的存储状态,Slave 不接受客户端连接。所有的存储操作都将被复制到连接至 Master 的 Slaves。如果 Master 宕了,得到了最新更新的 Slave 会成为 Master。故障节点在恢复后会重新加入到集群中并连接 Master 进入 Slave 模式。
所有需要同步的 disk 的消息操作都将等待存储状态被复制到其他法定节点的操作完成才能完成。所以,如果你配置了 replicas=3,那么法定大小是(3/2)+1=2。Master 将会存储并更新然后等待 (2-1)=1 个Slave 存储和更新完成,才汇报 success。至于为什么是 2-1,熟悉 Zookeeper 的应该知道,有一个 node 要作为观擦者存在。当一个新的 Master 被选中,你需要至少保障一个法定 node 在线以能够找到拥有最新状态的 node。这个 node 可以成为新的 Master。因此,推荐运行至少 3 个 replica nodes,以防止一个 node 失败了,服务中断。(原理与 ZooKeeper 集群的高可用实现方式类似)
客户应该使用故障转移运输连接到代理节点的集群复制。如使用URL类似如下:
failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)
四、集群搭建
4.1ActiveMQ集群环境规划(所有服务器关闭防火墙,关闭sellinux。生产环境自行添加对应端口到iptables)
ZooKeeper 集群环境:
主机 | 集群端口 | 节点安装目录 |
---|---|---|
192.168.1.214 | 2181 | /data/zk-node-01 |
192.168.1.215 | 2181 | /data/zk-node-02 |
192.168.1.216 | 2181 | /data/zk-node-03 |
ActiveMQ集群环境:
主机 | 集群端口 | 消息端口 | 管控台端口 | 节点安装目录 |
---|---|---|---|---|
192.168.1.214 | 63631 | 61616 | 8161 | /data/mq-node-01 |
192.168.1.215 | 63632 | 61617 | 8162 | /data/mq-node-02 |
192.168.1.216 | 63633 | 61618 | 8163 | /data/mq-node-03 |
4.2 zookeeper集群搭建(下载地址 http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz)
在三台服务器下载好zookeeper(本文中用三台服务器搭建集群,版本为zookeeper3.4.9)
4.2.1修改三台服务器的/etc/hosts 文件, 添加 IP 与主机名映射
vi /etc/hosts
192.168.1.214 zk-node-01
192.168.1.215 zk-node-02
192.168.1.216 zk-node-03
4.2.2下载 zookeeper-3.4.9.tar.gz 解压到/data目录,并按节点号对 zookeeper 目录重命名(分别更改名称zk-node-01 zk-node-02 zk-node-03)
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
tar -zvxf zookeeper-3.4.9.tar.gz
mv zookeeper-3.4.9 zk-node-01
4.2.3在各 zookeeper 节点目录下创建以下目录
mkdir -p /data/zookeeper/data/
mkdir -p /data/zookeeper/log/
4.2.4修改 zoo.cfg 配置文件
cd /data/zk-node-01/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
#node-01
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2181
server.1=zk-node-01:2888:3888
server.2=zk-node-02:2888:3888
server.3=zk-node-03:2888:3888
#node-02
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2182
server.1=zk-node-01:2888:3888
server.2=zk-node-02:2888:3888
server.3=zk-node-03:2888:3888
#node-03
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2183
server.1=zk-node-01:2888:3888
server.2=zk-node-02:2888:3888
server.3=zk-node-03:2888:3888
4.2.5 在 dataDir=/data/zookeeper/data 下创建 myid 文件
zk-node-01
vi /data/zookeeper/data/myid ## 值为 1
zk-node-02
vi /data/zookeeper/data/myid ## 值为 2
zk-node-03
vi /data/zookeeper/data/myid ## 值为 3
4.2.6 启动并测试 zookeeper
/data/zk-node-01/bin/zkServer.sh start
/data/zk-node-01/bin/zkServer.sh start
/data/zk-node-01/bin/zkServer.sh start
#查看leader-follower状态
/data/zk-node-01/bin/zkServer.sh status
4.3 ActiveMQ集群环境搭建(ActiveMQ下载 https://archive.apache.org/dist/activemq/5.15.0/apache-activemq-5.15.0-bin.tar.gz)
本文中所用版本为当前最新版5.15.0
4.3.1 下载安装文件并创建相应文件夹
cd /data
wget https://archive.apache.org/dist/activemq/5.15.0/apache-activemq-5.15.0-bin.tar.gz
tar -zvxf apache-activemq-5.15.0-bin.tar.gz
#三台服务器分别更名
mv apache-activemq-5.15.0 mq-node-01/mq-node-02/mq-node-03
4.3.2修改MQ管理控制台端口
node-01节点(保持默认8161)
vim /data/mq-node-01/conf/jetty.xml
node-02节点(修改port为8162)
node-03节点(修改port为8163)
4.3.3 添加集群配置(activemq.xml文件)
修改activemq.xml中 bind、zkAddress、hostname 和 zkPath(每个ActiveMQ的BrokerName必须相同,否则不能加入集群)
node-01节点配置
修改brokerName(同集群所有服务器必须一致)
删除原有的persistenceAdapter节点修改成如下配置(
directory:数据目录;replicas:复制节点数;bind:集群通讯的端口;zkAddres:zookeeper配置;hostname:主机名,在/etc/hosts中做的映射;zkPath:zookeeper数据路径;)
node-02节点配置
node-03节点配置
4.3.4 修改activemq.xml中各节点的消息端口(注意端口冲突):
node-01节点(保持默认61616)
node-02节点
node-03节点
4.3.5 按顺序启动 3 个 ActiveMQ 节点,并使用zooInspector查看mq状态
/data/mq-node-01/bin/activemq start
/data/mq-node-02/bin/activemq start
/data/mq-node-03/bin/activemq start