ActiveMQ高可用集羣方案

一. 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&amp;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&amp;wireFormat.maxFrameSize=104857600"/>

節點2:

<transportConnector name="openwire" uri="tcp://0.0.0.0:61612maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

節點3:

<transportConnector name="openwire" uri="tcp://0.0.0.0:61613maximumConnections=1000&amp;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

相關文章
相關標籤/搜索