基於 ZooKeeper 和 LevelDB 搭建 ActiveMQ 集羣
官方文檔:http://activemq.apache.org/replicated-leveldb-store.html
集羣原理圖:
高可用的原理:
使用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集羣的高可用實現方式類似)
1、ActiveMQ 集羣部署規劃:
環境:CentOS 6.6 x64 、 JDK8
版本:ActiveMQ 5.13.4
ZooKeeper 集羣環境:192.168.1.11:2181,192.168.1.12:2181,192.168.1.13:2181
(ZooKeeper 集羣部署請參考http://bobbie.blog.51cto.com/8986511/1912740)
主機 | 集羣端口 | 管理端口 | 節點安裝目錄 |
192.168.1.14 | 61616 | 8161 | /usr/local/activemq/ |
192.168.1.15 | /usr/local/activemq/ | ||
192.168.1.16 | /usr/local/activemq/ |
注意:端口在master上啓動,其它2個slave沒有這2個端口
2、防火牆打開對應的端口
vim /etc/sysconfig/iptables # mq cluster -A INPUT -m state --state NEW -m tcp -p tcp --dport 8161 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 61616 -j ACCEPT
3、下載解壓參照:http://bobbie.blog.51cto.com/8986511/1913006
4、集羣配置:
在 3 個 ActiveMQ 節點中配置 conf/activemq.xml 中的持久化適配器。修改其中 bind、zkAddress、
hostname 和 zkPath。注意:每個 ActiveMQ 的 BrokerName 必須相同,否則不能加入集羣。
Node1中的持久化配置:
vim /usr/local/activemq/conf/activemq.xml 18 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="cluster" dataDirectory="${activemq.data}"> 37 <persistenceAdapter> 38 <replicatedLevelDB 39 directory="${activemq.data}/leveldb" 40 replicas="3" 41 bind="tcp://0.0.0.0:0" 42 zkAddress="192.168.1.11:2181,192.168.1.12:2181,192.168.1.13:2181" 43 hostname="192.168.1.14" 44 sync="local_disk" 45 zkPath="/activemq/leveldb-stores" 46 /> 47 </persistenceAdapter>
Node2中的持久化配置:
vim /usr/local/activemq/conf/activemq.xml 18 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="cluster" dataDirectory="${activemq.data}"> 37 <persistenceAdapter> 38 <replicatedLevelDB 39 directory="${activemq.data}/leveldb" 40 replicas="3" 41 bind="tcp://0.0.0.0:0" 42 zkAddress="192.168.1.11:2181,192.168.1.12:2181,192.168.1.13:2181" 43 hostname="192.168.1.15" 44 sync="local_disk" 45 zkPath="/activemq/leveldb-stores" 46 /> 47 </persistenceAdapter>
Node3中的持久化配置:
vim /usr/local/activemq/conf/activemq.xml 18 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="cluster" dataDirectory="${activemq.data}"> 37 <persistenceAdapter> 38 <replicatedLevelDB 39 directory="${activemq.data}/leveldb" 40 replicas="3" 41 bind="tcp://0.0.0.0:0" 42 zkAddress="192.168.1.11:2181,192.168.1.12:2181,192.168.1.13:2181" 43 hostname="192.168.1.16" 44 sync="local_disk" 45 zkPath="/activemq/leveldb-stores" 46 /> 47 </persistenceAdapter>
5、按順序啓動3個ActiveMQ節點:
/etc/init.d/activemq start
6、集羣的節點狀態分析:
集羣啓動後可以看到ActiveMQ的有3個節點,分別是00000000000,00000000001,00000000002。第一個00000000000的值,可以看到elected的值是不爲空,說明這個節點是Master,其他兩個節點是 Slave。
7、集羣可用性測試:
ActiveMQ 的客戶端只能訪問 Master 的 Broker,其他處於 Slave 的 Broker 不能訪問。所以客戶端連
接 Broker 應該使用 failover 協議。
failover:(tcp://192.168.1.14:61616,tcp://192.168.1.15:61616,tcp://192.168.1.16:61616)?randomize=false
當一個ActiveMQ節點掛掉,或者一個ZooKeeper節點掛掉,ActiveMQ 服務依然正常運轉。如果僅剩
一個 ActiveMQ 節點,因爲不能選舉Master,ActiveMQ 不能正常運轉;同樣的,如果ZooKeeper僅剩一個節點活動,不管 ActiveMQ各節點是否存活,ActiveMQ也不能正常提供服務。
單節配置點請單擊:http://bobbie.blog.51cto.com/8986511/1913006