Replicated LevelDB Store 主备的方式是用Apache Zookeeper从一组broker中选举一个Master。然后所有的Slave 与Master同步,与Master保持一致。
Replicated LevelDB Store使用Zookeeper来调度集群中的节点变成master。被选举的master broker启动并接受客户端请求连接。其他broker进入到slave模式,并且连接到master上同步他的持久化状态。slave节点不接受客户端的连接。所有的持久化操作被复制到slave节点上。如果master挂掉,最后被更新的节点立刻成为master。挂掉的节点可以重新连接到集群中,成为slave节点。
所有被同步到磁盘上的发送消息的操作等待被法定的节点更新。如果你配的集群replicas="3",法定结点的大小为(3/2+1)=2。master将会等待别1个slave来复制,复制结束后master才会返回成功信息。
如果新的master被选举出来,你仍要保持至少有法定个节点在线,这样能才保证可以找到法定节点复制数据。比如replicas="3",法定节点数为(3/2+1)=2,也就是说至少保证集群中有2节点是有效的才能复制数据。所以推荐集群至少有3个节点,挂掉一个还有2个,仍然符合法定节点的数量。
客户端应使用 failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616) 来连接broker。
下面的主备例子是在同一台机器上、windows操作系统上进行,具体步骤如下:
1)安装MQ
安装很简单,在这不写了。
2)配置activemq.xml
打开[activemq_installdir]/conf/activemq.xml,找到
<persistenceAdapter>...</persistenceAdapter>
节点,修改如下:
<persistenceAdapter>
<replicatedLevelDB
directory="activemq-data"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="localhost:2181"
zkPath="/activemq/leveldb-stores"
sync="quorum_disk"
/>
</persistenceAdapter
然后保存!
3)复制activemq
将配置好的mq复制两份,如图所示,现在有3个mq
4)配置其他两个mq
因为是在同一台机器上,所以mq端口会冲突,下面把其他两个mq的端口改一下
打开第2个mq的activemq.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"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
将transportConnector的端口号都改一下,我是把每个端口号减10,修改过的端口如下:
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61606?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5662?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61603?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1873?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61604?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
修改完activemq.xml,在conf目录下还有一个jetty.xml,将jettyPort的端口8161也减去10,改为8151。
这样第2个mq配置完成。
5)配置第3个mq
第3个mq的配置步骤跟第2个mq一样,改端口号,在第2个mq端口号的基础上再减10,保存3个mq的端口不冲突。
到这一步3个mq配置完成。
注意一点,在activemq.xml中有一个brokerName,如图所示
3个mq的brokerName必须相同,这样集群才能识别出这个broker是属于我这个集群的。
6)启动zookeeper
启动zookeeper,本次试验是在同一台机器上进行,所以在配置activemq.xml中的zkAddress时都是zkAddress="localhost:2181",如果不在同一台机器上,可以修改为相应的IP。
注意,要先启动zookeeper。
7)启动mq
进入3个mq的[activemq_installdir]/bin/win32,双击activemq.bat启动mq
启动第1个mq的时候,控制台会显示如下图所示
提示集群中没有足够的成员来选举master。
因为设置repicas="3",也就是说集群中至少有2个mq才能选举出master。
启动第2个mq,集群可以正常启动,再启动第3个mq,所有步骤完成。
这时可以访问http://localhost:8161/admin,出现mq的管理界面,如果不行,可以访问http://localhost:8151/admin、http://localhost:8141/admin,只要有一个显示说明一切正常。
到这里全部完成。
测试
客户端的生产者和消息者连接mq的url值为failover:(tcp://localhost:61616,tcp://localhost:61606,tcp://localhost:61596),这样,在一个mq挂掉之后,会自动连接到另一个master上。
测试例子请查看 http://blog.youkuaiyun.com/u010764427/article/details/50589700