Leveldb是一個google實現的很是高效的kv數據庫,是單進程的服務,可以處理十億級別規模Key-Value型數據,佔用內存小。數據庫
基於可複製LevelDB的集羣方案,須要引入ZooKeeper。根據ZooKeeper的使用方式能夠分爲單節點的ZooKeeper和Zookeeper集羣。這裏咱們只講述ZooKeeper集羣,單節點不是一個可靠的選擇。apache
ZooKeeper能夠在網站http://zookeeper.apache.org/ 下載。咱們使用的是zookeeper-3.4.6,假設ZooKeeper分部署在下面三個目錄中。dom
D:\MQ\apache-activemq\cluster\zookeeper1 D:\MQ\apache-activemq\cluster\zookeeper2 D:\MQ\apache-activemq\cluster\zookeeper3
把3個節點中config目錄下的zoo_sample.cfg複製一份,改爲zoo.cfg。tcp
由於是在一臺主機上部署,因此每一個zoo.cfg中的clientPort不能重複;若是有三臺主機,那麼採用默認的clientPort就行,同理server.一、server.二、server.3能夠寫做<各自ip>:2888:3888。網站
其中zookeeper1中的配置以下 ui
#默認配置 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中的配置以下google
#默認配置 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中的配置以下 url
#默認配置 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
建立三個目錄spa
D:\MQ\apache-activemq\cluster\zkdata\z1 D:\MQ\apache-activemq\cluster\zkdata\z2 D:\MQ\apache-activemq\cluster\zkdata\z3
每一個目錄中都建立一個名爲myid的文件(文本文件,刪掉txt後綴),3個文件的內容分別寫一、二、3。.net
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
在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>
先依次啓動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> -->
每一個ActiveMQ的BrokerName必須相同,不然不能加入集羣。
通過驗證,當一個ActiveMQ節點掛掉,或者一個ZooKeeper節點掛掉,ActiveMQ服務依然正常運轉。若是僅剩一個ActiveMQ節點,由於不能選舉Master,ActiveMQ不能正常運轉;一樣的,若是ZooKeeper僅剩一個節點活動,無論ActiveMQ各節點是否存活,ActiveMQ也不能正常提供服務。
failover:(tcp://localhost:61616,tcp://localhost:61626)?randomize=false
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
參考: