概述
基於ZooKeeper + ActiveMQ + replicatedLevelDB,在Windows平台的主從部署方案。
主從部署可以提供數據備份、容錯
[1]的功能,但是不能提供負載均衡的功能。
注:
- 容錯:主服務器宕掉,再選出一台作為作為主服務器,來提供服務。
部署圖

簡單說明
ActiveMQ提供了隊列、本地持久化的功能,ZooKeeper提供了主從選舉的功能。Producers將消息發送給主從隊列體系
[1],Consumers從主從隊列體系中獲取消息。
注:
[1] 主從隊列體系 - 除
Producers、Consumers之外的,由ZooKeeper + ActiveMQ + replicatedLevelDB組成的體系。
模擬環境
1.軟件環境
- 操作系統 - Windows7
- JDK - 1.7
- activemq - 5.13.2
下載包:apache-activemq-5.13.2-bin.zip - zookeeper - 3.4.8
下載包:zookeeper-3.4.8.tar.gz
2.網絡環境
- 機器1
ip:192.168.74.55
zookeeper port:2181
activemq port:61616 - 機器2
ip:192.168.74.26
zookeeper port:2181
activemq port:61616 - 機器3
ip:192.168.74.25
zookeeper port:2181
activemq port:61616
實施
1.安裝、配置、啟動ZooKeeper
- 將zookeeper-3.4.8.tar.gz解壓縮到合適的路徑。
- 復制conf/zoo_sample.cfg為conf/zoo.cfg
- 在conf/zoo.cfg中指定dataDir、dataLogDir、各服務器及端口信息
1 # The number of milliseconds of each tick 2 tickTime=2000 3 # The number of ticks that the initial 4 # synchronization phase can take 5 initLimit=10 6 # The number of ticks that can pass between 7 # sending a request and getting an acknowledgement 8 syncLimit=5 9 # the directory where the snapshot is stored. 10 # do not use /tmp for storage, /tmp here is just 11 # example sakes. 12 # dataDir=/tmp/zookeeper 13 dataDir=F:/temp/zookeeper-3.4.8/data 14 dataLogDir=F:/temp/zookeeper-3.4.8/log 15 server.1=192.168.74.55:2888:3888 16 server.2=192.168.74.26:2888:3888 17 server.3=192.168.74.25:2888:3888 18 # the port at which the clients will connect 19 clientPort=2181 20 # the maximum number of client connections. 21 # increase this if you need to handle more clients 22 #maxClientCnxns=60 23 # 24 # Be sure to read the maintenance section of the 25 # administrator guide before turning on autopurge. 26 # 27 # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance 28 # 29 # The number of snapshots to retain in dataDir 30 #autopurge.snapRetainCount=3 31 # Purge task interval in hours 32 # Set to "0" to disable auto purge feature 33 #autopurge.purgeInterval=1
修改內容:
1) 注釋掉第12行2) 第13行,添加dataDir3) 第14行,添加dataLogDir4) 第15-17行,以server.A=B:C:D的形式指定三台服務器
A - 數字,表示服務器的編號
B - 服務器的ip
C - 服務器與集群中的Leader服務器交換信息的端口
D - 用來執行選舉時服務器相互通信的端口(萬一集群中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader) - 新建myid文件
在dataDir指定的路徑下,新建myid文件,文件內容是當前服務器的編號(和conf/zoo.cfg中的server編號對應)。
e.g. 192.168.74.55機器的內容為:1 - 啟動
先切換到zookeeper目錄,再啟動(可以嘗試設置PATH)1 D:\tools\PowerCmd>E: 2 E:\>cd E:\418備份區\工作任務\20160318_消息隊列\zookeeper-3.4.8 3 E:\418備份區\工作任務\20160318_消息隊列\zookeeper-3.4.8>bin\zkServer.cmd
2.安裝、配置、啟動ActiveMQ
- 將apache-activemq-5.13.2-bin.zip加壓縮到合適的目錄。
- 修改conf/activemq.xml文件內容
將默認的<persistenceAdapter>配置的內容注釋掉,添加基於replicatedLevelDB的持久化配置:1 <!-- 2 <persistenceAdapter> 3 <kahaDB directory="${activemq.data}/kahadb"/> 4 </persistenceAdapter> 5 --> 6 <persistenceAdapter> 7 <replicatedLevelDB 8 directory="${activemq.data}/leveldb" 9 replicas="3" 10 bind="tcp://0.0.0.0:0" 11 zkAddress="192.168.74.55:2181,192.168.74.26:2181,192.168.74.25:2181" 12 hostname="192.168.74.55" 13 sync="local_disk" 14 zkPath="/activemq/leveldb-stores" 15 /> 16 </persistenceAdapter>
注意:1) zkAddress依次指定三台服務器的ip和ZooKeeper的監聽端口2) hostname為每一台服務器的ip地址,三台服務器根據實際情況修改 - 啟動ActiveMQ
先切換到安裝目錄,再啟動(可以嘗試設置PATH)
1 cd E:\418備份區\工作任務\20160318_消息隊列\apache-activemq-5.13.2 2 bin\activemq start
3.在客戶端程序中指定brokerURL
1 # use the following property to configure the default connector 2 java.naming.provider.url=failover:(tcp://192.168.74.55:61616,tcp://192.168.74.26:61616,tcp://192.168.74.25:61616)?initialReconnectDelay=1000
說明:
brokerURL以"failover:(tcp://ip-1:amq-port-1,tcp://ip-2:amq-port-2,tcp://ip-3:amq-port-3)"的形式配置,則客戶端會嘗試依次進行連接;失敗則繼續嘗試連接下一個。引入ZooKeeper之后,只有被選定為主服務器那一台可以被連接。
相關補充
1.已知情況
- 超過一半的故障,則體系失效
如果有2台ActiveMQ故障,則體系不再工作,且會阻塞客戶端(同步的客戶端會被阻塞)
2.未確定內容
- 對上文的部署方案是否有改進建議。
- 將Producers、Consumers直接集成到應用系統,還是再抽出一層?
- 對於一半以上的故障,如何預防?
-- 如何獲得宕機提醒?如何實現自動重啟? - 面向日志的采集,應該選擇哪種消息傳送模式(隊列、發布/訂閱)?
- 計划對上述的體系進行壓力測試,以獲取吞吐量的上限值;對測試的方案有何建議?
3.新問題
- Consumer異常阻塞是否會導致其他Consumer阻塞?
參考文章
- 基於zookeeper+leveldb搭建activemq集群
主從部署的實施方案。 - 分布式服務框架 Zookeeper -- 管理分布式環境中的數據
簡單了解ZooKeeper - ActiveMQ實現負載均衡+高可用部署方案
主從部署和集群部署的區別、實現 - Replicated LevelDB Store
官網有對配置的參數進行詳細的解說