一. ActiveMQ的高可用原理
使用ZooKeeper(集羣)註冊全部的ActiveMQ Broker。只有其中的一個Broker能夠提供服務,被視爲 Master,其餘的 Broker 處於待機狀態,被視爲Slave。若是Master因故障而不能提供服務,Zookeeper會從Slave中選舉出一個Broker充當Master。
Slave鏈接Master並同步他們的存儲狀態,Slave不接受客戶端鏈接。全部的存儲操做都將被複制到 鏈接至 Master的Slaves。若是Master宕了,獲得了最新更新的Slave會成爲 Master。故障節點在恢復後會從新加入到集羣中並鏈接Master進入Slave模式。
是否是以爲和Redis Sentinel主從高可用的方式很像,這裏的zookeeper起到的做用和reids裏的sentinel做用差很少。java
另外,附上官方文檔的一則警告,請使用者注意。replicated LevelDB 不支持延遲或者計劃任務消息。這 些消息存儲在另外的LevelDB文件中,若是使用延遲或者計劃任務消息,將不會複製到Slave Broker上,不能實現消息的高可用。mysql
二. ActiveMQ的持久化方式
ActiveMQ有三種持久化方式(在activemq.xml可配):
(1) 基於共享文件系統(KahaDB,默認)sql
<persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter>
(2) 基於JDBCapache
<persistenceAdapter> <jdbcPersistenceAdapter dataSource="#MySQL-DS"/> </persistenceAdapter> <!--注意:須要添加mysql-connector-java相關的jar包到avtivemq的lib包下--> <bean id="MySQL-DS" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/beautyssm_mq?useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="xxxx"/> </bean>
(3) 基於可複製的LevelDB(經常使用於集羣)swift
<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"/>#在zookeeper中集羣相關數據存放路徑 </persistenceAdapter>
LevelDB是Google開發的一套用於持久化數據的高性能類庫。LevelDB並非一種服務,用戶須要自行實現Server。是單進程的服務,可以處理十億級別規模Key-Value型數據,佔用內存小。
這裏咱們採用第三種方式,也是官網推薦的方式。負載均衡
三. 高可用的部署
一、ActiveMQ的高可用集羣基於Zookeeper的高可用集羣,因此要先部署Zookeeper集羣
見:ZooKeeper高可用集羣的安裝及配置dom
二、在3個ActiveMQ節點中配置conf/activemq.xml中的監控端口
節點1:tcp
<property name="port" value="8161"/>
節點2:性能
<property name="port" value="8162"/>
節點3:url
<property name="port" value="8163"/>
三、在3個ActiveMQ節點中配置conf/activemq.xml中的持久化適配器
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}"> <persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:6262?" zkAddress="localhost:2181,localhost:2182,localhost:2183" hostname="localhost" zkPath="/activemq/leveldb-stores"/> </persistenceAdapter> </broker>
注:每一個 ActiveMQ 的 BrokerName 必須相同,不然不能加入集羣。
四、修改各節點的消息端口:
節點1:
<transportConnector name="openwire" uri="tcp://0.0.0.0:61611maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
節點2:
<transportConnector name="openwire" uri="tcp://0.0.0.0:61612maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
節點3:
<transportConnector name="openwire" uri="tcp://0.0.0.0:61613maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
五、按順序啓動 3 個 ActiveMQ 節點:
$ /usr/local/activemq/activemq-01/bin/activemq start $ /usr/local/activemq/activemq-02/bin/activemq start $ /usr/local/activemq/activemq-03/bin/activemq start
監聽日誌:
$ tail -f /usr/local/activemq/activemq-01/data/activemq.log $ tail -f /usr/local/activemq/activemq-02/data/activemq.log $ tail -f /usr/local/activemq/activemq-03/data/activemq.log
四. 集羣部署
以前已經實現了ActiveMQ的高可用部署,單僅僅是高可用集羣,沒法達到負載均衡的做用,接下來只需簡單配置就能完成能夠實現負載均衡的集羣功能:
在集羣1的activemq.xml中連接集羣2(在persistenceAdapter標籤前配置):
<networkConnectors> <networkConnector uri="static:(tcp://192.168.2.100:61611,tcp://192.168.2.101:61612,tcp://192.168.2.102:61613)" duplex="false"/> </networkConnectors>
在集羣2的activemq.xml中連接集羣1(在persistenceAdapter標籤前配置):
<networkConnectors> <networkConnector uri="static:(tcp://192.168.1.100:61611,tcp://192.168.1.101:61612,tcp://192.168.1.102:61613)" duplex="false"/> </networkConnectors>
這樣就實現了ActiveMQ的集羣高可用負載均衡功能。
三. 客戶端鏈接:
ActiveMQ 的客戶端只能訪問Master的Broker,其餘處於Slave的Broker不能訪問。因此客戶端鏈接Broker應該使用 failover 協議。
配置文件地址應爲:
failover:(tcp://192.168.1.100:61611,tcp://192.168.1.100:61612,tcp://192.168.1.100:61613)?randomize=false
或:
failover:(tcp://192.168.2.100:61611,tcp://192.168.2.100:61612,tcp://192.168.2.100:61613)?randomize=false