您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 几款主流 NoSQL 数据库的对比
北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层几款主流NoSQL数据库的对比最近小组准备启动一个node开源项目,从前端亲和力、大数据下的IO性能、可扩展性几点入手挑选了NoSql数据库,但具体使用哪一款产品还需要做一次选型。我们最终把选项范围缩窄在HBase、Redis、MongoDB、Couchbase、LevelDB五款较主流的数据库产品中,本文将主要对它们进行分析对比。鉴于缺乏项目中的实战经验沉淀,本文内容和观点主要还是从各平台资料搜罗汇总,也不会有太多深入或底层原理探讨。本文所引用的资料来源将示于本文尾部。所汇总的内容仅供参考,若有异议望指正。HBaseHBase是ApacheHadoop中的一个子项目,属于bigtable的开源版本,所实现的语言为Java(故依赖JavaSDK)。HBase依托于Hadoop的HDFS(分布式文件系统)作为最基本存储基础单元。HBase在列上实现了BigTable论文提到的压缩算法、内存操作和布隆过滤器。HBase的表能够作为MapReduce任务的输入和输出,可以通过JavaAPI来访问数据,也可以通过REST、Avro或者Thrift的API来访问。1.特点1.1数据格式HBash的数据存储是基于列(ColumnFamily)的,且非常松散——不同于传统的关系型数据库(RDBMS),HBase允许表下某行某列值为空时不做任何存储(也不占位),减少了空间占用也提高了读性能。北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层不过鉴于其它NoSql数据库也具有同样灵活的数据存储结构,该优势在本次选型中并不出彩。我们以一个简单的例子来了解使用RDBMS和HBase各自的解决方式:⑴RDBMS方案:其中Article表格式:Author表格式:⑵等价的HBase方案:对于前端而言,这里的ColumnKeys和ColumnFamily可以看为这样的关系:columId1={//id=1的行article:{//ColumnFamily-articletitle:XXX,//ColumnFamily-article下的key之一content:XXX,tags:XXX},author:{//ColumnFamily-authorname:XXXnickname:XXX}}北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层1234567891011columId1={//id=1的行article:{//ColumnFamily-articletitle:XXX,//ColumnFamily-article下的key之一content:XXX,tags:XXX},author:{//ColumnFamily-authorname:XXXnickname:XXX}}北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层1.2性能HStore存储是HBase存储的核心,它由两部分组成,一部分是MemStore,一部分是StoreFiles。MemStore是SortedMemoryBuffer,用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile),当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除,因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBaseI/O的高性能。1.3数据版本Hbase还能直接检索到往昔版本的数据,这意味着我们更新数据时,旧数据并没有即时被清除,而是保留着:Hbase中通过row+columns所指定的一个存贮单元称为cell。每个cell都保存着同一份数据的多个版本——版本通过时间戳来索引。时间戳的类型是64位整型。时间戳可以由Hbase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。为了避免数据存在过多版本造成的的管理(包括存贮和索引)负担,Hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层1.4CAP类别属于CP类型(了解更多)。2.Node下的使用HBase的相关操作可参考下表:在node环境下,可通过node-hbase来实现相关访问和操作,注意该工具包依赖于PHYTHON2.X(3.X不支持)和Coffee。如果是在window系统下还需依赖.NETframwork2.0,64位系统可能无法直接通过安装包安装。官方示例:varassert=require('assert');varhbase=require('hbase');hbase({host:'127.0.0.1',port:8080}).table('my_table')//创建一个ColumnFamily.create('my_column_family',function(err,success){this.row('my_row')//定位到指定行.put('my_column_family:my_column','myvalue',function(err,success){this.get('my_column_family',function(err,cells){this.exists(function(err,exists){北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层assert.ok(exists);});});});});12345678910111213141516varassert=require('assert');varhbase=require('hbase');北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层hbase({host:'127.0.0.1',port:8080}).table('my_table')//创建一个ColumnFamily.create('my_column_family',function(err,success){this.row('my_row')//定位到指定行.put('my_column_family:my_column','myvalue',function(err,success){this.get('my_column_family',function(err,cells){this.exists(function(err,exists){assert.ok(exists);});});});});数据检索:client.table('node_table').scan({startRow:'my_row',//起始行maxVersions:1//版本},function(err,rows){console.log(err,rows);});北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层12345678client.table('node_table').scan({startRow:'my_row',//起始行maxVersions:1//版本},function(err,rows){console.log(err,rows);});另有hbase-client也是一个不错的选择,具体API参照其文档。3.优缺点优势北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层1.存储容量大,一个表可以容纳上亿行,上百万列;2.可通过版本进行检索,能搜到所需的历史版本数据;3.负载高时,可通过简单的添加机器来实现水平切分扩展,跟Hadoop的无缝集成保障了其数据可靠性(HDFS)和海量数据分析的高性能(MapReduce);4.在第3点的基础上可有效避免单点故障的发生。缺点1.基于Java语言实现及Hadoop架构意味着其API更适用于Java项目;2.node开发环境下所需依赖项较多、配置麻烦(或不知如何配置,如持久化配置),缺乏文档;3.占用内存很大,且鉴于建立在为批量分析而优化的HDFS上,导致读取性能不高;4.API相比其它NoSql的相对笨拙。适用场景1.bigtable类型的数据存储;2.对数据有版本查询需求;北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层3.应对超大数据量要求扩展简单的需求。RedisRedis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。目前由VMware主持开发工作。1.特点1.1数据格式Redis通常被称为数据结构服务器,因为值(value)可以是字符串(String),哈希(Hash/Map),列表(list),集合(sets)和有序集合(sortedsets)五种类型,操作非常方便。比如,如果你在做好友系统,查看自己的好友关系,如果采用其他的key-value系统,则必须把对应的好友拼接成字符串,然后在提取好友时,再把value进行解析,而redis则相对简单,直接支持list的存储(采用双向链表或者压缩链表的存储方式)。我们来看下这五种数据类型。⑴Stringstring是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。string类型是二进制安全的。意思是Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。string类型是Redis最基本的数据类型,一个键最大能存储512MB。实例:redis127.0.0.1:6379SETnamezfpxOK北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层redis127.0.0.1:6379GETnamezfpx1234redis127.0.0.1:6379SETnamezfpxOKredis127.0.0.1:6379GETnamezfpx在以上实例中我们使用了Redis的SET和GET命令。键为name,对应的值为”zfpx”。注意:一个键最大能存储512MB。⑵HashRedishash是一个键值对集合。Redishash是一个string类型的field和value的映射表,hash特别适合用于存储对象。实例:redis127.0.0.1:6379HMSETuser:1usernamezfpxpassword123OKredis127.0.0.1:6379HGETALLuser:1北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层1)username2)zfpx3)password4)1231234567redis127.0.0.1:6379HMSETuser:1usernamezfpxpassword123OKredis127.0.0.1:6379HGETALLuser:11)username2)zfpx3)password4)123以上实例中hash数据类型存储了包含用户脚本信息的用户对象。实例中我们使用了RedisHMSET,HGETALL命令,user:1为键值。每个hash可以存储232–1键值对(40多亿)。⑶List北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导
本文标题:几款主流 NoSQL 数据库的对比
链接地址:https://www.777doc.com/doc-5264997 .html