轉載自http://blog.csdn.net/lifetragedy/article/details/51869032
ActiveMQ的集羣
內嵌代理所引發的問題:
- 消息過載
- 管理混亂
如何解決這些問題——集羣的兩種方式:
- Master slave
- Broker clusters
ActiveMQ的集羣有兩種方式:
- MASTER/SLAVE模式
- Cluster模式
Pure Master Slave
Pure master slave的工作方式:
當master broker失效的時候。Slave broker 做出了兩種不同的相應方式
- 啓動network connectors和transport connectors
- slave broker停止,slave broker只是複製了master broker的狀態
在任何情況下我們都應該先嚐試連接master,故在客戶端我們這樣配置:
- failover://(tcp://masterhost:61616,tcp://slavehost:61616)?randomize=false
Pure Master Slave具有以下限制:
- 只能有一個slave broker連接到master broker。
- 在因master broker失效後slave才接管(保證消息完全拷貝)
- 要想恢復master,停止slave,拷貝slave中的數據文件到master中,然後重啓;
- Master broker不需要特殊的配置。Slave broker需要進行以下配置:
- <broker masterConnectorURI="tcp://masterhost:62001" shutdownOnMasterFailure="false">
- ...
- <transportConnectors>
- <transportConnector uri="tcp://slavehost:61616"/>
- </transportConnectors>
- </broker>
Shared File System Master Slave
如果你使用共享文件系統,那麼你可以使用Shared File System Master Slave。如下圖所示:
客戶端使用failover Transport 去連接 broker,例如:
- failover:(tcp://broker1:61616,tcp://broker2:6161 7,broker3:61618)
- <broker useJmx="false" xmlns="http://activemq.org/config/1.0">
- <persistenceAdapter>
- <journaledJDBC dataDirectory="/sharedFileSystem/broker"/>
- </persistenceAdapter>
- …
- </broker>
其中/sharedFileSystem是文件共享的系統文件目錄
JDBC Master Slave
JDBC Master Slave的工作原理跟Shared File System Master Slave類似,只是採用了數據庫作爲持久化存儲
客戶端調用:
- failover:(tcp://broker1:61616,tcp://broker2:616167,broker3:61618)
- <beans>
- <broker xmlns="http://activemq.org/config/1.0" brokerName="JdbcMasterBroker">
- <persistenceAdapter>
- <jdbcPersistenceAdapter dataSource="#mysql-ds"/>
- </persistenceAdapter>
- </broker>
- <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/test?relaxAutoCommit=true"/>
- <property name="username" value="username"/>
- <property name="password" value="passward"/>
- <property name="poolPreparedStatements" value="true"/>
- </bean>
- </beans>
Broker clusters-靜態
Broker clusters ,網絡型中介(network of brokers)
連接到網絡代理的兩種方式:
- 靜態的方法配置訪問特定的網絡代理
- 發現中介(agents)動態的探測代理
靜態網絡代理
Static:(uri1,uri2,uri3,…)?key=value 或是Failover:(uri1, … , uriN)?key=value
下面給出一個配置實例:
- <networkConnectors>
- <networkConnector name=”local network”
- uri=”static://(tcp://remotehost1:61616,tcp://remotehost2:61616)”/>
- </networkConnectors>
幾種集羣對比
- broker的集羣在多個broker之前fail-over和 load-balance,master-slave能fail-over,但是不能load- balance
- 消息在多個broker之間轉發,但是消息只存儲在一個broker上,一旦失效必須重啓,而主從方式master失效,slave實時備份消息。
- jdbc方式成本高,效率低
- master-slave方式中pure方式管理起來麻煩
因此,我們把MASTER/SLAVE和BROKER CLUSTER兩者相結合,可以得到一個完全解決方案:即又可以做到集羣又可以做到任何一個BROKER如果發生宕機節點消息也不丟失。
Master/Slave集羣搭建-傳統式
一般activemq的Master Slave是基於KAHADB的阻塞來做的,先看一下原理
注意紅色加粗的地方,這是傳統的Master Slave的一個缺陷。這樣做太不安全了!
下面給出核心配置:
master配置(不要忘了改conf目錄下的jetty.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"/>
- <span class="tag" style="margin: 0px; padding: 0px;