一、高可用集群
從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型數據,占用內存小.
- <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>