JMS之——ActiveMQ高可用+負載均衡叢集
阿新 • • 發佈:2019-02-07
一、高可用叢集
從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>
3、複製的LevelDB
LevelDB是Google開發的用於持久化資料的高效能類庫,LevelDB並不是一種服務,需要使用者自己實現,能處理十億級別規模的Key-Value型資料,佔用記憶體小.
高可用的原理:使用ZooKeeper(叢集)註冊所有的ActiveMQ Broker.只有其中的一個Broker可以提供服務,被視為Master,其他的Broker處於待機狀態,被視為Slave.如果Master因故障不能提供服務,ZooKeeper會從Slave中選舉出一個Broker充當Master<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)
二、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>