Leveldb是一个google实现的非常高效的kv数据库,是单进程的服务,能够处理十亿级别规模Key-Value型数据,占用内存小。
基于可复制LevelDB的集群方案,需要引入ZooKeeper。根据ZooKeeper的使用方式可以分为单节点的ZooKeeper和Zookeeper集群。这里我们只讲述ZooKeeper集群,单节点不是一个可靠的选择。
4.1 Zookeeper集群配置
ZooKeeper可以在网站http://zookeeper.apache.org/ 下载。我们使用的是zookeeper-3.4.6,假设ZooKeeper分部署在下面三个目录中。
D:\MQ\apache-activemq\cluster\zookeeper1 D:\MQ\apache-activemq\cluster\zookeeper2 D:\MQ\apache-activemq\cluster\zookeeper3
4.1.1 zoo.cfg
把3个节点中config目录下的zoo_sample.cfg复制一份,改成zoo.cfg。
因为是在一台主机上部署,所以每个zoo.cfg中的clientPort不能重复;如果有三台主机,那么采用默认的clientPort就行,同理server.1、server.2、server.3可以写作<各自ip>:2888:3888。
其中zookeeper1中的配置如下
#默认配置 tickTime=2000 initLimit=10 syncLimit=5 #需要修改的配置 dataDir=D:/MQ/apache-activemq/cluster/zkdata/z1/ clientPort=2181 server.1=localhost:2888:3888 server.2=localhost:2889:3889 server.3=localhost:2890:3890
zookeeper2中的配置如下
#默认配置 tickTime=2000 initLimit=10 syncLimit=5 #需要修改的配置 dataDir=D:/MQ/apache-activemq/cluster/zkdata/z2/ clientPort=2182 server.1=localhost:2888:3888 server.2=localhost:2889:3889 server.3=localhost:2890:3890
zookeeper3中的配置如下
#默认配置 tickTime=2000 initLimit=10 syncLimit=5 #需要修改的配置 dataDir=D:/MQ/apache-activemq/cluster/zkdata/z3/ clientPort=2183 server.1=localhost:2888:3888 server.2=localhost:2889:3889 server.3=localhost:2890:3890
4.1.2 myid
创建三个目录
D:\MQ\apache-activemq\cluster\zkdata\z1 D:\MQ\apache-activemq\cluster\zkdata\z2 D:\MQ\apache-activemq\cluster\zkdata\z3
每个目录中都创建一个名为myid的文件(文本文件,删掉txt后缀),3个文件的内容分别写1、2、3。
D:\MQ\apache-activemq\cluster\zkdata\z1\myid 1 D:\MQ\apache-activemq\cluster\zkdata\z2\myid 2 D:\MQ\apache-activemq\cluster\zkdata\z3\myid 3
4.2 ActiveMQ配置
在3个amq节点中配置activemq.xml中的持久化适配器。根据以下配置示例,修改其中bind、zkAddress和hostname。如果你是在三台主机上部署,那么bind项可以写成bind="tcp://0.0.0.0:0",默认采用61619端口。我们这里在一台主机上演示,因此需要保证bind端口不冲突。
amq1的配置
<persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62618" zkAddress="localhost:2181,localhost:2182,localhost:2183" hostname="localhost" zkPath="/activemq/leveldb-stores" /> </persistenceAdapter>
amq2的配置
<persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62619" zkAddress="localhost:2181,localhost:2182,localhost:2183" hostname="localhost" zkPath="/activemq/leveldb-stores" /> </persistenceAdapter>
amq3的配置
<persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62620" zkAddress="localhost:2181,localhost:2182,localhost:2183" hostname="localhost" zkPath="/activemq/leveldb-stores" /> </persistenceAdapter>
4.3 集群启动和错误排除
先依次启动ZooKeeper,再依次启动ActiveMQ。启动第1个Zookeeper时,控制台会报连接错误,因为其它的ZooKeeper节点还没启动。
如果出现了"activemq LevelDB IOException handler"错误,针对于apache-activemq-5.10.1,需要删除各个ActiveMQ节点下的pax-url-aether-1.5.2.jar包,并注释掉activemq.xml中的下述日志配置。
<!-- Allows accessing the server log <bean id="logQuery" class="org.fusesource.insight.log.log4j.Log4jLogQuery" lazy-init="false" scope="singleton" init-method="start" destroy-method="stop"> </bean> -->
4.4 小结
每个ActiveMQ的BrokerName必须相同,否则不能加入集群。
经过验证,当一个ActiveMQ节点挂掉,或者一个ZooKeeper节点挂掉,ActiveMQ服务依然正常运转。如果仅剩一个ActiveMQ节点,因为不能选举Master,ActiveMQ不能正常运转;同样的,如果ZooKeeper仅剩一个节点活动,不管ActiveMQ各节点是否存活,ActiveMQ也不能正常提供服务。
5.客户端访问方式
5.1Failover使用格式
failover:(tcp://localhost:61616,tcp://localhost:61626)?randomize=false
5.2 updateURIsURL
updateURIsURL,通过URL(或者本地路径)获取重连的url,这样做具有良好的扩展性,因为客户端每次连接都是从URL(或文件)中加载一次,所以可以随时从文件中更新url列表,做到动态添加MQ的备点。
failover:()?randomize=false&updateURIsURL=file:/d:/urllist.txt
urllist.txt中的地址通过英文逗号分隔,示例:
tcp://localhost:61616,tcp://localhost:61617, tcp://localhost:61618
参考:
http://my.oschina.net/xiaoxishan/blog/382502
http://my.oschina.net/xiaohui249/blog/313028