JDBC 主從
JDBC 主從
首次在 ActiveMQ Classic 4.1 版中支援
如果您僅使用純 JDBC 而不使用高效能日誌,那麼您通常會將資料庫作為您的單一故障點和持久性引擎。 如果您沒有非常高的效能需求,這種方法可能很有意義,因為您有一個單一的持久性引擎可以備份和管理等等。
啟動
當僅使用 JDBC 作為資料來源時,您可以使用主從方法,根據此圖表所示運行任意數量的代理程式。 啟動時,一個主節點會在代理程式資料庫中取得獨佔鎖定 - 所有其他代理程式都是從節點,並暫停等待獨佔鎖定。
客戶端應使用 容錯轉移傳輸 來連線到可用的代理程式。 例如,使用類似以下的 URL
failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)
只有主節點代理程式會啟動其傳輸連接器,因此客戶端只能連線到主節點。
主節點故障
如果主節點失去與資料庫的連線或失去獨佔鎖定,它會立即關閉。 如果主節點關閉或發生故障,其他從節點之一會取得鎖定,因此拓撲會切換到下圖所示
其他從節點之一會立即取得資料庫上的獨佔鎖定,然後開始成為主節點,啟動其所有傳輸連接器。
客戶端會失去與已停止主節點的連線,然後容錯轉移傳輸會嘗試連線到可用的代理程式 - 其中唯一可用的代理程式是新的主節點。
主節點重新啟動
您可以隨時重新啟動加入叢集的其他代理程式,並在主節點關閉或發生故障時,以從節點身分開始等待成為主節點。 因此,在重新啟動舊主節點後,會建立下列拓撲…
設定 JDBC 主從
預設情況下,如果您使用
以下範例示範如何在 JDBC 主從模式下設定 ActiveMQ Classic 代理程式
<beans>
<!-- Allows us to use system properties as variables in this configuration file -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<broker xmlns="https://activemq.dev.org.tw/schema/core">
<destinationPolicy>
<policyMap><policyEntries>
<policyEntry topic="FOO.>">
<dispatchPolicy>
<strictOrderDispatchPolicy />
</dispatchPolicy>
<subscriptionRecoveryPolicy>
<lastImageSubscriptionRecoveryPolicy />
</subscriptionRecoveryPolicy>
</policyEntry>
</policyEntries></policyMap>
</destinationPolicy>
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.base}/activemq-data"/>
<!--
<jdbcPersistenceAdapter dataDirectory="activemq-data" dataSource="#oracle-ds"/>
-->
</persistenceAdapter>
<transportConnectors>
<transportConnector name="default" uri="tcp://127.0.0.1:61616"/>
</transportConnectors>
</broker>
<!-- This xbean configuration file supports all the standard spring xml configuration options -->
<!-- Postgres DataSource Sample Setup -->
<!--
<bean id="postgres-ds" class="org.postgresql.ds.PGPoolingDataSource">
<property name="serverName" value="localhost"/>
<property name="databaseName" value="activemq"/>
<property name="portNumber" value="0"/>
<property name="user" value="activemq"/>
<property name="password" value="activemq"/>
<property name="dataSourceName" value="postgres"/>
<property name="initialConnections" value="1"/>
<property name="maxConnections" value="10"/>
</bean>
-->
<!-- MySql DataSource Sample Setup -->
<!--
<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://127.0.0.1/activemq?relaxAutoCommit=true"/>
<property name="username" value="activemq"/>
<property name="password" value="activemq"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
-->
<!-- Oracle DataSource Sample Setup -->
<!--
<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:AMQDB"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
-->
<!-- Embedded Derby DataSource Sample Setup -->
<!--
<bean id="derby-ds" class="org.apache.derby.jdbc.EmbeddedDataSource">
<property name="databaseName" value="derbydb"/>
<property name="createDatabase" value="create"/>
</bean>
-->
</beans>