1. 程式人生 > >activemq+Zookeper高可用集群方案配置

activemq+Zookeper高可用集群方案配置

odi avt 存儲路徑 bind 們的 replicat local 接受 內存

在高並發、對穩定性要求極高的系統中,高可用的是必不可少的,當然ActiveMQ也有自己的集群方案。從ActiveMQ 5.9開始,ActiveMQ的集群實現方式取消了傳統的Master-Slave方式,增加了基於ZooKeeper + LevelDB 的 Master-Slave 實現方式。

相關文章:
範例項目: http://wosyingjun.iteye.com/blog/2312553
ActiveMQ的簡單實用:http://wosyingjun.iteye.com/blog/2314681

一. 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作用差不多。

另外,附上官方文檔的一則警告,請使用者註意。replicated LevelDB 不支持延遲或者計劃任務消息。這 些消息存儲在另外的LevelDB文件中,如果使用延遲或者計劃任務消息,將不會復制到Slave Broker上,不能實現消息的高可用。

二. ActiveMQ的持久化方式

ActiveMQ有三種持久化方式(在activemq.xml可配):
(1) 基於共享文件系統(KahaDB,默認)

<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>

(2) 基於JDBC

<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(常用於集群)

<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型數據,占用內存小。
這裏我們采用第三種方式,也是官網推薦的方式。

三. 高可用的部署

1、ActiveMQ的高可用集群基於Zookeeper的高可用集群,所以要先部署Zookeeper集群

見:ZooKeeper高可用集群的安裝及配置

2、在3個ActiveMQ節點中配置conf/activemq.xml中的監控端口
節點1:
<property name="port" value="8161"/>
節點2:
<property name="port" value="8162"/>
節點3:
<property name="port" value="8163"/>
3、在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 必須相同,否則不能加入集群。

4、修改各節點的消息端口:
節點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"/>
5、按順序啟動 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

activemq+Zookeper高可用集群方案配置