ActiveMQ高可用+負載均衡叢集
一,高可用叢集
從ActiveMQ5.9開始,ActiveMQ的叢集實現方式取消了傳統的Master-Slave方式,增加了基於ZooKeeper+LevelDB的Master-Slave實現方式,其他兩種方式目錄共享和資料庫共享方式依然存在
(1)檔案共享(KahaDB)<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
( 2 )資料庫共享<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/smq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="maxActive" value="20"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.data}"
dataSource="#mysql-ds" createTablesOnStartup="false"/>
</persistenceAdapter>
LevelDB是Google開發的用於持久化資料的高效能類庫,LevelDB並不是一種服務,需要使用者自己實現,能處理十億級別規模的Key-Value型資料,佔用記憶體小.
<persistenceAdapter>
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:62621"
zkAddress="192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"
hostname="edu-zk-01"
zkPath="/activemq1/leveldb-stores"
/>
</persistenceAdapter>
--SSDB(基於LevelDB)
高可用的原理:使用ZooKeeper(叢集)註冊所有的ActiveMQ Broker.只有其中的一個Broker可以提供服務,被視為Master,其他的Broker處於待機狀態,被視為Slave.如果Master因故障不能提供服務,ZooKeeper會從Slave中選舉出一個Broker充當Master
ActiveMQ叢集部署規劃
ZooKeeper叢集環境:192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183
ActiveMQ需要劃分的埠:
mq叢集通訊埠(bind="tcp://0.0.0.0:62621" ActiveMQ相互之間通許,資料同步...)
mq叢集訊息埠(conf/activeMq.xml 客戶端監聽埠)
mq管理控制檯監聽埠(conf/jetty.xml)
一個高可用叢集中每個ActiveMQ的BrokerName必須相同,否則不能加入叢集
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="DobboEdu" dataDirectory="${activemq.data}">
客戶端broker採用失敗重連機制
mq.brokerURL=failover\:(tcp\://192.168.1.81\:51611,tcp\://192.168.1.82\:51611,tcp\://192.168.1.83\:51611)?randomize\=false&initialReconnectDelay\=1000&maxReconnectDelay\=30000
當一個ActiveMQ節點掛掉,ActiveMQ服務一樣正常使用,如果僅剩一個ActiveMQ節點,因為不能選舉Master,ActiveMQ不能正常運轉;如貴ZooKeeper叢集出了問題,需要對ActiveMQ重新啟動一次.
replicatedLevelDB不支援延遲或者計劃任務訊息.這些訊息儲存在另外的LevelDB檔案中,如果使用延遲或者計劃任務訊息,將不會複製到slave Broker上,不能實現訊息的高可用.
二,負載均衡叢集
1.叢集一連結叢集二
叢集一中所有ActiveMQ配置如下:加在persistenceAdapter介面卡節點前,networkConnector uri 為叢集二的訊息埠,這裡採用失敗重連機制
<networkConnectors>
<networkConnector uri="static:{tcp://192.168.1.101:53531,tcp://192.168.1.101:53532,tcp://192.168.1.101:t3533}" duplex="false"/>
</networkConnectors>
2.叢集二連結叢集一
叢集二中所有ActiveMQ配置如下:加在persistenceAdapter介面卡節點前,networkConnector uri 為叢集一的訊息埠,這裡採用失敗重連機制
<networkConnectors>
<networkConnector uri="static:{tcp://192.168.1.101:53511,tcp://192.168.1.101:53512,tcp://192.168.1.101:t3513}" duplex="false"/>
</networkConnectors>