ActiveMQ三臺訊息伺服器實現完美叢集實戰
叢集實踐: 三臺伺服器完美叢集實踐 將節點A和節點B組成訊息同步,節點A和節點C組成訊息同步,節點B和節點C組成Master/Slave
節點 | 服務埠 | 管理埠 | 儲存 | 網路聯結器 | 用途 |
---|---|---|---|---|---|
Node-A | 61618 | 8161 | - | Node-B,Node-c | 消費者 |
Node-B | 61617 | 8162 | /share_file/kahadb | Node-A | 生產者,消費者 |
Node-C | 61618 | 8163 | /share_file/kahadb | Node-A | 生產者,消費者 |
節點A因為是Broker叢集,不需要配置儲存,預設的也可以,因為它不去負責生產者的訊息傳送,它只負責消費,B和C因為是Master/Slave叢集,配置了共享資料夾(暫時在同一臺伺服器所以只需指定共享資料夾),如果在不同伺服器上進行叢集,我們需要共享一個檔案出來供大家使用,推薦使用支援SAN的分佈檔案系統,網路連線用來做Broker叢集的。節點A不用來做生產者是因為,假如A作為生產者,因為現在網路連線是雙向連線,A上面的訊息也能被B和C消費掉,但是當A上有訊息並且還未被消費的時候節點A掛掉,那麼B和C就收不到訊息了。
開始操作: 1.首先進入ActiveMQ的安裝地址,建立一個資料夾用來存放三個節點的檔案,複製安裝包到該目錄,並重命名為ActiveMQA,ActiveMQB,ActiveMQC。 2.建立一個共享目錄用來做Master/Slave叢集的共享儲存資料夾。 3.開始配置三個節點,進入節點A的conf,配置activemq.xml檔案,找到網路連線的配置,61616和8161是預設埠,不需要改變,其他協議埠暫時也不需要,直接註釋掉,具體如下:
<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>
給A節點新增網路聯結器的配置項:因為是三臺比較明確的伺服器,直接使用靜態發現
<networkConnectors>
<networkConnector name="local_network" uri="static:(tcp://127.0.0.1:61617,tcp://127.0.0.1:61618)"/>
</networkConnectors>
配置管理介面伺服器的jetty埠,配置jetty.xml檔案即可。A節點使用預設埠,不需要修改,只需修改BC節點。
因為B節點和C節點配置的時Master/Slave叢集,所以需要配置持久化的方案。
<persistenceAdapter>
<kahaDB directory="D:\Program Files\apache-activemq-5.15.5\ServerCluster\kahadb"
</persistenceAdapter>
C節點和B節點配置差不多類似。
至此配置完成,按照順序啟動各個服務(A,B,C)
啟動情況如下圖: 圖片: 發現61616和61617已經啟動,並且都有一個本地連線,但是61618沒有對外提供服務,但是程序已經啟動了,這是因為B和C配置的時Master/Slave,所以B節點獲取到了共享資料夾的所有權,所以C節點正在等待獲得資源和對外提供服務,也即是在C未獲得資源之前不對外提供服務。 測試將B殺掉,C能提供服務。成連線等待狀態,恢復B之後變成Slave,不對外提供服務,如下圖:
程式碼測試:
生產者:
客戶端配置失效轉移(url = “failover:(tcp://127.0.0.1:61617,tcp://127.0.0.1:61618)?randomize=true”) 分析:failover作為狀態轉移的配置,B和C中當B連接出錯時會自動轉移到C節點,這樣當我們的伺服器B出現問題時不用修改程式會自動連線到C節點,繼續向伺服器傳送訊息,後面的引數表示隨機選擇一臺,當出現問題選擇另一臺。A節點作為Broker叢集只是一個消費者,所以在客戶端生產者中不需要配置61616的A節點連線。
消費者: url = “failover:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61617,tcp://127.0.0.1:61618)?randomize=true” 分析:ABC三個節點都可以作為消費者進行消費
使用Spring的JMSTemplate進行測試,配置兩個連線工廠,一個是生產者的,一個是消費者的,因為這兩者的失效轉移配置不一樣,分別配置兩個JMSTemplate,配置如下: “`xml