一.什么是CouchbaseServer
大数据的NoSQL技能已发展成熟,这以MongoDB为代表,但我这里要先容的是另一种NoSQL技能,叫做CouchbaseServer,比年来在国外发展迅猛,大有高出MongoDB之势。CouchbaseServer是由早先的CouchDB发展而来,继承了Memcached的技能特性,是一个开源的、分布式的、面向文档(document-oriented)的NoSQL数据库,具有很多良好核心功能:
二.CouchbaseServer3.02与MongoDB3.0的对比
据新动力咨询公司做的一项
针对CouchbaseServer3.02与MongoDB3.0的性能测试陈诉,在雷同硬件的雷同集群设置(因两者拓扑架构差别,不能做到雷同)下,Couchbase在下列4个方面高出MongoDB:
1.并发Couchbase展示了较好的并发性,能比MongoDB处理惩罚三倍多的并发用户
2.吞吐量Couchbase展示了较高的吞吐量,乃至在雷同数量的并发用户下,CouchbaseServer比MongoDB能提供2.5倍的吞吐量
3.耽误Couchbase展示了较低的耽误。纵然在雷同数量的并发用户下,Couchbase可以或许提供比MongoDB低4-5倍的耽误
4.性价比在雷同硬件并满意雷同耽误值的要求下,CouchbaseServer比mongodb可以或许提供2.5倍乃至4.5倍的吞吐量。如许,CouchbaseServer的操纵费用将只有
MongoDB的22-44%。
如今很多互联网巨头都迁徙到
CouchbaseServer上了,如paypal、linkedin、ebay、GE等。
三.怎样安装
下面以windows体系为例:
一起首,到官网下载安装包:https://www.couchbase.com/nosql-databases/downloads,可根据你的的硬件操纵体系选择所要的安装包,这里为方便起见选择了64位的企业windows版couchbase-server-enterprise_4.1.0-windows_amd64.exe,安装体系最小必要内存为4G,处理惩罚
器最小为4核处理惩罚器;同时以后网站上再下载一个Java版的应用程序包Couchbase-Java-Client-2.2.5.zip,以便背面开辟应用项目之用。
然后点击这个exe文件开始安装,选择安装的路径,确认安装所需的最小内存巨细和处理惩罚器个数完成安装。
二.设置
完成安装之后,直接就会
进入一个管理界面举行配
置。别的,在桌面上,安装程序默认就会天生一个快捷方式。点击设置按钮,进入5个设置步调:
1.设置服务器
设置磁盘存储路径,服务器主机,是否天生一个新
集群还是参加已有一个集群中。
2.安装示例数据
安装体系提供两个样品数据桶bucket(下面将具体先容)和MapReduce,可选择安不安装
3.创建默认的
桶(bucket)
设置桶范例(Couchbase或Memcached)、每个节点利用的内存巨细、备份
、磁盘读写同步工作个数以及冲洗Flush。
4.关照设置是否盼望收到升级的提示以及产物登记。
5.设置
服务器
设置管理员的口令,留意帐号名和暗码要区分巨细写
6.设置完成之后,进入
监控web页面console。以后可以点击桌面快捷图标打开,在此监控页面上就可以看到
服务器的利用环境并可查察和编辑
数据。整个console共有8个Tab页面:
集群概况
、服务器节点
、数据桶(bucket)、视图、索引、跨数据中心备份、日记和设置。
a"集群概况(ClusterOverview)
当前时间段上桶的操纵
图和磁盘读取图以及服务器当前活动状态,见上图
b:服务器节点(ServerNodes)
包罗节点名称
、活动状态、何种服务、内存
利用
、互换利用、CPU
利用、磁盘利用、数据项数(
活泼/备份)。还可举行添加
服务器、撤除
服务器、分组服务器、更换服务器等操纵
c:数据桶(DataBuckets)
(bucket)是一种新概念,相称于关系型数据库中的Schema,即
数据存储区间
。每一个bucket都包罗活泼和备份的数据集,并映射到1024个逻辑分区(VirtualBucket,简称vBucket),文档的读取写入等操纵只与分区vBuckets打交互。雷同的文档ID,每次都被哈希到雷同的分区,分区vBucket可以在节点之间移动(rebalance),vBucket和物理服务器之间的对应关系被存储在clustermap中。
在此Tab上,不但可以监控各个
数据桶的利用状态,还可创建新的数据桶,创建新文档,查察、修改和删除已有文档
d:视图(Views)
视图是一种可视化的表,在Couchbase中以两种格式(计划和生产)文档存储在
数据桶中,每张视图由一名字和一组MapReduce函数表现。
其必须Map
函数
形貌了怎样从数据桶中提取数据,而可选Reduce函数形貌了怎样聚合其结果。
在此Tab中,可以查察视
图数据并可举行过滤排序等操纵,还可创建、删除和编辑计划视图的Java文档,并发布为生产视图
e:Index(索引)
Couchbase提供有三种用于差别服务的索引:
·MapReduce
视图
索引,是线性增长的,只当文档有变革时才重新索引;
·立体视图索引,Couchbase利用立体视图来查询
地理空间
信息,一个立体视图含有地理空间数据,基于所记录的数据是否在一给定的多维范围内来
查询所要信息。他们也用于非多少多维范围内的查询,不像MapReduce视图
有两个
函数map和reduce,立体视图只有一个函数spatial,雷同于前者函数map。
全局第二索引(GSI),使得应用以高速率举行快速查询和
数据扫描,不像视图索引,其索引值仅局部每个节点,全局第二索引是创建在整个集群上的
f:XDCR(跨数据中心备份)
XDCR提供了一种把
数据从一个
集群备份到另一个
集群的便利方式,可把活泼数据拷贝到N+1个Couchbase服务器集群或外部应用(如Elastic,Spark,Storm等),这些集群常用于多个地理分散的劫难规复或为快速传输而靠近实际用户,这种备份可设为双向或多向。
在此Tab页面上,可以方便创建多个运种
集群,设置备份参数。
g:日记(Log)
Tab记录了变乱
、模块代码、服务器节点和时间的日记,可用于诊断Couchbase集群内的活动和错误。
h:设置(Setting)
设置Tab页面用于设置你的Couchbase服务器全局参数,包罗集群设置
、更新关照、主动修复、报警、主动压缩、帐号管理、审计和样品数据桶。
三.开辟实例
当安装并设置好Couchbase
服务器
集群(只一台服务器也构成一个集群)后,就可以举行应用开辟了。将前面下载的Couchbase-Java-Client-2.2.5.zip解压,将此中的三个jar包:couchbase-core-io-1.2.5.jar、couchbase-java-client-2.2.5.jar、rxjava-1.0.15.jar参加你所用的IDE库中。
起首,你必要做的是毗连
集群:
Clustercluster=CouchbaseCluster.create();
当不带参数时,则此毗连逻辑上与localhost相连的
集群绑定,这种做法在开辟
环境下是可以的,但在生产环境下必要指定服务器节点,如下所示:
Clustercluster=CouchbaseCluster.create("192.168.56.101","192.168.56.102");你不必把集群中每个节点都列上,只需几个种子节点以便客户可以创建
早先始毗连,实际毗连是当调用openBucket方法时才创建起与数据桶的真正毗连:
Bucketbucket=cluster.openBucket();这只是毗连缺省的数据桶,并返回Bucket引用。假如你想毗连一个差别的数据桶,你需通过console界面预先创建好一个数据桶才可毗连,代码如下:
Bucketbucket=cluster.openBucket("bucket","password");当应用关闭时,你必须断开与集群的毗连以确保开释全部资源(如sockets,threads,等),下面代码关闭客户:cluster.disconnect();这断开全部数据桶并开释全部资源。如今有了Bucket引用,就可以操纵JSON文档了。起首,天生一个用户的JsonObject:
JsonObjectuser=JsonObject.empty()
.put("firstname","Walter")
.put("lastname","White")
.put("job","chemistryteacher")
.put("age",50);
JsonObject的作用非常雷同Map,但被计划仅用于插入值,以便存为有效的JSON(包罗嵌套对象和数组),所天生的结果文档雷同如下:
{
"firstname":"Walter",
"job":"chemistryteacher",
"age":50,
"lastname":"White"
}
为存储文档,需调用bucket的upsert方法。由于服务器上的文档具有多种特性,必要给他赋予一个唯一文档ID,如walter:
JsonDocumentdoc=JsonDocument.create("walter",user);
JsonDocumentresponse=
bucket.upsert(doc);
这个Document将主动转换为JSON并存入集群中,假如这个文档ID已经存在它将被更换。Bucket提供了诸多如插入(insert)、获取(get)、删除(remove)、关闭(close)等方法,为调用方便,我把他们写在一个称为ConnectionManager类里:packagecom.couchbase.beersample;importjava.util.ArrayList;importjava.util.NoSuchElementException;importjava.util.concurrent.CountDownLatch;importrx.Observable;importrx.Subscriber;importrx.functions.Action1;importrx.functions.Func1;importcom.couchbase.client.java.*;importcom.couchbase.client.java.document.JsonDocument;importcom.couchbase.client.java.view.AsyncViewResult;importcom.couchbase.client.java.view.AsyncViewRow;importcom.couchbase.client.java.view.Stale;importcom.couchbase.client.java.view.ViewQuery;/***TheConnectionManagerhandlesconnecting,disconnectingandmanagingofthe*Couchbaseconnection.*/publicclassConnectionManager{//天生一个静态instanceprivatestaticfinalConnectionManagerconnectionManager=newConnectionManager();publicstaticConnectionManagergetInstance(){returnconnectionManager;}//天生一个静态集群staticClustercluster=CouchbaseCluster.create();//打开一个数据桶,这里为beer-sample,安装时主动天生的staticBucketbucket=cluster.openBucket("beer-sample");//关闭集群publicstaticvoiddisconnect(){cluster.disconnect();}//得到视图的行聚集列表,这里利用异步获取方式publicstaticArrayListAsyncViewRowgetView(StringdesignDoc,Stringview){finalArrayListAsyncViewRowresult=newArrayListAsyncViewRow();finalCountDownLatchlatch=newCountDownLatch(1);bucket.async().query(ViewQuery.from(designDoc,view).limit(20).stale(Stale.FALSE)).doOnNext(newAction1AsyncViewResult(){@Overridepublicvoidcall(AsyncViewResultviewResult){if(!viewResult.success()){System.out.println(viewResult.error());}}}).flatMap(newFunc1AsyncViewResult,ObservableAsyncViewRow(){@OverridepublicObservableAsyncViewRowcall(AsyncViewResultviewResult){returnviewResult.rows();}}).subscribe(newSubscriberAsyncViewRow(){@OverridepublicvoidonCompleted(){latch.countDown();}@Overridepublicvoid(Throwablethrowable){System.err.println("Whoops:"+throwable.getMessage());}@OverridepublicvoidonNext(AsyncViewRowviewRow){result.add(viewRow);}});try{latch.await();}catch(InterruptedExceptione){e.printStackTrace();}returnresult;}//获取一个Json文档publicstaticJsonDocumentgetItem(Stringid){JsonDocumentresponse=null;try{response=bucket.get(id);}catch(NoSuchElementExceptione){System.out.println("ERROR:Noelementwithmessage:"+e.getMessage());e.printStackTrace();}returnresponse;}//删除一个Json文档publicstaticvoiddeleteItem(Stringid){try{bucket.remove(id,PersistTo.MASTER);}catch(NoSuchElementExceptione){System.out.println("ERROR:Noelementwithmessage:"+e.getMessage());}}//更新一个Json文档publicstaticvoidupdateItem(JsonDocumentdoc){bucket.upsert(doc);}//关闭数据桶的毗连publicstaticvoidcloseBucket(){bucket.close();}}为演示目标,这里举一个把啤酒beer信息存储到Couchbase里的应用例子,先要创建一个BeerModel类:packagecom.couchbase.beersample;publicclassBeerModel{privateStringname,style,deion,category,abv,srm,ibu,upc,brewery,Id="";publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetStyle(){returnstyle;}publicvoidsetStyle(Stringstyle){this.style=style;}publicStringgetDeion(){returndeion;}publicvoidsetDeion(Stringdeion){this.deion=deion;}publicStringgetCategory(){returncategory;}publicvoidsetCategory(Stringcategory){this.category=category;}publicStringgetAbv(){returnabv;}publicvoidsetAbv(Stringabv){this.abv=abv;}publicStringgetSrm(){returnsrm;}publicvoidsetSrm(Stringsrm){this.srm=srm;}publicStringgetIbu(){returnibu;}publicvoidsetIbu(Stringibu){this.ibu=ibu;}publicStringgetUpc(){returnupc;}publicvoidsetUpc(Stringupc){this.upc=upc;}publicStringgetBrewery(){returnbrewery;}publicvoidsetBrewery(Stringbrewery){this.brewery=brewery;}publicStringgetId(){returnId;}publicvoidsetId(Stringid){this.Id=id;}}再制作一个Main类,在main函数里举行测试,packagecom.couchbase.beersample;importcom.couchbase.client.java.document.JsonDocument;importcom.couchbase.client.java.document.json.JsonObject;importcom.couchbase.client.java.view.AsyncViewRow;importjava.util.ArrayList;importrx.functions.Action1;importrx.functions.Func1;/****@authorXijian*/publicclassMain{publicstaticvoidmain(String[]args){BeerModelbeerModel=newBeerModel();beerModel.setId("2");beerModel.setName("beer2");beerModel.setStyle("beer2style");beerModel.setDeion("beer2Deion");beerModel.setAbv("beer2abv");beerModel.setIbu("beer2ibu");beerModel.setSrm("beer2srm");beerModel.setUpc("beer2upc");beerModel.setBrewery("beer2Breweryid");JsonObjectbeer=JsonObject.empty().put("name",beerModel.getName()).put("style",beerModel.getStyle()).put("deion",beerModel.getDeion()).put("abv",beerModel.getAbv()).put("ibu",beerModel.getIbu()).put("srm",beerModel.getSrm()).put("upc",beerModel.getUpc()).put("brewery",beerModel.getBrewery()).put("type","beer");JsonDocumentdoc=JsonDocument.create(beerModel.getId(),beer);ConnectionManager.updateItem(doc);beerModel=newBeerModel();beerModel.setId("3");beerModel.setName("beer3");beerModel.setStyle("beer3style");beerModel.setDeion("beer3Deion");beerModel.setAbv("beer3abv");beerModel.setIbu("beer3ibu");beerModel.setSrm("beer3srm");beerModel.setUpc("beer3upc");beerModel.setBrewery("beer3Breweryid");beer=JsonObject.empty().put("name",beerModel.getName()).put("style",beerModel.getStyle()).put("deion",beerModel.getDeion()).put("abv",beerModel.getAbv()).put("ibu",beerModel.getIbu()).put("srm",beerModel.getSrm()).put("upc",beerModel.getUpc()).put("brewery",beerModel.getBrewery()).put("type","beer");doc=JsonDocument.create(beerModel.getId(),beer);ConnectionManager.updateItem(doc);ArrayListAsyncViewRowresult=ConnectionManager.getView("beer","by_name");System.out.println("size:"+result.size());doc=ConnectionManager.getItem("2");System.out.println("name:"+doc.content().getString("name"));}}运行Main类,将得到如下结果:size:2name:beer2其次,打开管理员console页面,进入ViewsTab中,在顶上一行的Views之前的下拉单里选取beer-sample,然后点击按钮CreateDevelopmentView,在弹出的窗口中,DesignDocumentName:框下填入name,ViewName:框下填入by_name,再点击Save按钮存入,此时ViewCode的分区睁开,有两个窗口,左边为Map窗,内含缺省函数,function(doc,meta){emit(meta.id,null);}右边为Reduce窗,缺省为空。修改Map函数为function(doc,meta){if(doc.typedoc.type=="beer"){emit(doc.name,doc.brewery_id+","+doc.style);}}Reduce窗稳固,点击Save按钮存入。再点击下面的ShowResults则表现如下视图结果:
你还可以过滤这些结果(需点击FilterResults箭头icon),确定这些结果精确之后就可以把其发布到生产环境上去,这可通过点Publish按钮完成。
我要评论