天天看點

解決單點故障:JDBC Master Slave解決單點故障:JDBC Master Slave

解決單點故障:JDBC Master Slave

3.1     概述

1.         配置上,不存在Master和Slave,所有Broder的配置基本是一樣的

2.         多個共享資料源的Broker構成JDBC Master Slave

3.         給每個Broker取個名字

4.         首先搶到資源(資料庫鎖)的Broker成為Masetr

5.         其他Broker保持預備狀态,定期嘗試搶占資源,運作其的Shell中清楚的顯示了這一點

6.         一旦Master崩潰,其他Broker嘗試搶占資源,最終隻有一台搶到,它立刻成為Master

7.         之前的Master即使重新開機成功,也隻能作為Slave等待

3.2     MQ配置(這裡是一台機器配置)

1.         将 $activemq_dir$/conf/activemq.xml 複制3份,分别改名為:jdbc_broker01.xml、jdbc_broker02.xml、jdbc_broker03.xml

2.         首先修改jdbc_broker01.xml

1)         <broker brokerName=" jdbc_broker01" …

2)         <!--配置持久擴充卡-->

<persistenceAdapter>

<jdbcPersistenceAdapter dataDirectory="${activemq.base}/data"

dataSource="#mysql-ds"/>

</persistenceAdapter>

3)         <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>

4)         <!--配置資料源:注意是在broker标記之外-->

</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/test?relaxAutoCommit=true"/>

<property name="username" value="root"/>

<property name="password" value="root"/>

<property name="maxActive" value="200"/>

<property name="poolPreparedStatements" value="true"/>

</bean>

3.         同樣修改 jdbc_broker02.xml ,與 jdbc_broker01.xml 不同之處

1)         <broker brokerName=" jdbc_broker02" …

2)         <transportConnector name="openwire" uri="tcp://0.0.0.0:61617"/>

4.         同樣修改 jdbc_broker03.xml ,與 jdbc_broker01.xml 不同之處

1)         <broker brokerName=" jdbc_broker03" …

2)         <transportConnector name="openwire" uri="tcp://0.0.0.0:61618"/>

3.3     JAVA測試:隊列

1.         代碼基本和前面一緻,隻是因為這裡有3個broker,是以建立連接配接工廠的代碼稍有差别:

ConnectionFactory cf = new ActiveMQConnectionFactory("failover:(tcp://0.0.0.0:61616,tcp://0.0.0.0:61617,tcp://0.0.0.0:61618)");

3.4     測試步驟

1.         先啟動生産者,發送幾條消息

2.         啟動消費者,可看到接收到的消息

3.         關閉消費者

4.         生産者繼續發送幾條消息-消息A

5.         停止broker01(可看到生産者端顯示連接配接到broker02(tcp://0.0.0.0:61617)了,同時運作broker02的Shell也顯示其成為了Master)

6.         生産者繼續發送幾條消息-消息B

7.         啟動消費者

8.         消費者接收了消息A和消息B,可見broker02接替了broker01的工作,而且儲存了之前生産者經過broker01發送的消息

9.         關閉消費者

10.     生産者繼續發送幾條消息-消息C

11.     停止broker02(可看到生産者端顯示連接配接到broker03(tcp://0.0.0.0:61618)了,同時運作broker03的Shell也顯示其成為了Master)

12.     生産者繼續發送幾條消息-消息D

13.     啟動消費者

14.     消費者接收了消息C和消息D,可見broker03接替了broker02的工作,而且儲存了之前生産者經過broker02發送的消息

15.     再次啟動broker01,生産者或消費者均未顯示連接配接到broker01(tcp://0.0.0.0:61616),表明broker01此時隻是個Slave

3.5     結論

JDBC Master Slave模式實作方式稍微複雜一點,可以實作消息的多點熱備功能,Master、Slave的交替完全是即時的,自動的,無需重新開機任何broker;隊列可以實作消息的異步和點對點發送