ActiveMQ 主備

Replicated LevelDB Store 主備的方式是用Apache Zookeeper從一組broker中選舉一個Master。然後所有的Slave 與Master同步,與Master保持一致。

Replicated LevelDB Store使用Zookeeper來調度集羣中的節點變成master。被選舉的master broker啓動並接受客戶端請求連接。其他broker進入到slave模式,並且連接到master上同步他的持久化狀態。slave節點不接受客戶端的連接。所有的持久化操作被複制到slave節點上。如果master掛掉,最後被更新的節點立刻成爲master。掛掉的節點可以重新連接到集羣中,成爲slave節點。

 

所有被同步到磁盤上的發送消息的操作等待被法定的節點更新。如果你配的集羣replicas="3",法定結點的大小爲(3/2+1)=2。master將會等待別1個slave來複制,複製結束後master纔會返回成功信息。

 

如果新的master被選舉出來,你仍要保持至少有法定個節點在線,這樣能才保證可以找到法定節點複製數據。比如replicas="3",法定節點數爲(3/2+1)=2,也就是說至少保證集羣中有2節點是有效的才能複製數據。所以推薦集羣至少有3個節點,掛掉一個還有2個,仍然符合法定節點的數量。

 

客戶端應使用 failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616) 來連接broker。

 

下面的主備例子是在同一臺機器上、windows操作系統上進行,具體步驟如下:

1)安裝MQ

安裝很簡單,在這不寫了。

2)配置activemq.xml

 

打開[activemq_installdir]/conf/activemq.xml,找到

<persistenceAdapter>...</persistenceAdapter>

節點,修改如下:

<persistenceAdapter>
            <replicatedLevelDB 
				directory="activemq-data"
				replicas="3"
				bind="tcp://0.0.0.0:0"
				zkAddress="localhost:2181"
				zkPath="/activemq/leveldb-stores"
				sync="quorum_disk"
			/>
        </persistenceAdapter

然後保存!

3)複製activemq

將配置好的mq複製兩份,如圖所示,現在有3個mq

4)配置其他兩個mq

因爲是在同一臺機器上,所以mq端口會衝突,下面把其他兩個mq的端口改一下

打開第2個mq的activemq.xml,找到如下配置:

<transportConnectors>
            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
        </transportConnectors>


將transportConnector的端口號都改一下,我是把每個端口號減10,修改過的端口如下:

<transportConnectors>
            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61606?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5662?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61603?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1873?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="ws" uri="ws://0.0.0.0:61604?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
        </transportConnectors>


修改完activemq.xml,在conf目錄下還有一個jetty.xml,將jettyPort的端口8161也減去10,改爲8151。

這樣第2個mq配置完成。

 

5)配置第3個mq

第3個mq的配置步驟跟第2個mq一樣,改端口號,在第2個mq端口號的基礎上再減10,保存3個mq的端口不衝突。

 

到這一步3個mq配置完成。

注意一點,在activemq.xml中有一個brokerName,如圖所示

3個mq的brokerName必須相同,這樣集羣才能識別出這個broker是屬於我這個集羣的。

 

6)啓動zookeeper

啓動zookeeper,本次試驗是在同一臺機器上進行,所以在配置activemq.xml中的zkAddress時都是zkAddress="localhost:2181",如果不在同一臺機器上,可以修改爲相應的IP。

注意,要先啓動zookeeper。

 

7)啓動mq

進入3個mq的[activemq_installdir]/bin/win32,雙擊activemq.bat啓動mq

啓動第1個mq的時候,控制檯會顯示如下圖所示

提示集羣中沒有足夠的成員來選舉master。

因爲設置repicas="3",也就是說集羣中至少有2個mq才能選舉出master。

啓動第2個mq,集羣可以正常啓動,再啓動第3個mq,所有步驟完成。

這時可以訪問http://localhost:8161/admin,出現mq的管理界面,如果不行,可以訪問http://localhost:8151/admin、http://localhost:8141/admin,只要有一個顯示說明一切正常。

 

到這裏全部完成。

 

測試

客戶端的生產者和消息者連接mq的url值爲failover:(tcp://localhost:61616,tcp://localhost:61606,tcp://localhost:61596),這樣,在一個mq掛掉之後,會自動連接到另一個master上。

測試例子請查看 http://blog.csdn.net/u010764427/article/details/50589700

 

 



 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章