AMQ學習筆記 - 14. 實踐方案:基於ZooKeeper + ActiveMQ + replicatedLevelDB的主從部署


概述


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

部署圖


 

簡單說明

ActiveMQ提供了隊列、本地持久化的功能,ZooKeeper提供了主從選舉的功能。Producers將消息發送給主從隊列體系 [1],Consumers從主從隊列體系中獲取消息。
注:
[1] 主從隊列體系 - 除 Producers、Consumers之外的,由ZooKeeper + ActiveMQ + replicatedLevelDB組成的體系。

模擬環境


1.軟件環境

  1. 操作系統 -  Windows7
  2. JDK - 1.7
  3. activemq - 5.13.2
    下載包:apache-activemq-5.13.2-bin.zip
  4. zookeeper - 3.4.8
    下載包:zookeeper-3.4.8.tar.gz

2.網絡環境

  1. 機器1
    ip:192.168.74.55
    zookeeper port:2181
    activemq port:61616
  2. 機器2
    ip:192.168.74.26
    zookeeper port:2181
    activemq port:61616
  3. 機器3
    ip:192.168.74.25
    zookeeper port:2181
    activemq port:61616

實施


1.安裝、配置、啟動ZooKeeper

  1. 將zookeeper-3.4.8.tar.gz解壓縮到合適的路徑。
  2. 復制conf/zoo_sample.cfg為conf/zoo.cfg
  3. 在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行,添加dataDir
    3) 第14行,添加dataLogDir
    4) 第15-17行,以server.A=B:C:D的形式指定三台服務器
       A - 數字,表示服務器的編號
       B - 服務器的ip
       C - 服務器與集群中的Leader服務器交換信息的端口
       D - 用來執行選舉時服務器相互通信的端口(萬一集群中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader)
  4. 新建myid文件
    在dataDir指定的路徑下,新建myid文件,文件內容是當前服務器的編號(和conf/zoo.cfg中的server編號對應)。
    e.g. 192.168.74.55機器的內容為:1
  5. 啟動
    先切換到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

  1. 將apache-activemq-5.13.2-bin.zip加壓縮到合適的目錄。
  2. 修改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地址,三台服務器根據實際情況修改
  3. 啟動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.已知情況

  1. 超過一半的故障,則體系失效
    如果有2台ActiveMQ故障,則體系不再工作,且會阻塞客戶端(同步的客戶端會被阻塞)

2.未確定內容

  1. 對上文的部署方案是否有改進建議。
  2. 將Producers、Consumers直接集成到應用系統,還是再抽出一層?
  3. 對於一半以上的故障,如何預防?
    -- 如何獲得宕機提醒?如何實現自動重啟?
  4. 面向日志的采集,應該選擇哪種消息傳送模式(隊列、發布/訂閱)?
  5. 計划對上述的體系進行壓力測試,以獲取吞吐量的上限值;對測試的方案有何建議?

3.新問題

  1. Consumer異常阻塞是否會導致其他Consumer阻塞?

參考文章


  1. 基於zookeeper+leveldb搭建activemq集群
    主從部署的實施方案。
  2. 分布式服務框架 Zookeeper -- 管理分布式環境中的數據
    簡單了解ZooKeeper
  3. ActiveMQ實現負載均衡+高可用部署方案
    主從部署和集群部署的區別、實現
  4. Replicated LevelDB Store
    官網有對配置的參數進行詳細的解說






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM