一、安裝環境
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集群搭建(下載地址 //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 //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