解决单点故障:JDBC Master Slave

来源:互联网 发布:驾照模拟考试 软件 编辑:程序博客网 时间:2024/06/03 04:23

解决单点故障: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;队列可以实现消息的异步和点对点发送


原创粉丝点击