• 10个出色的NoSQL数据库


    http://www.infoq.com/research/nosql-databases?utm_source=infoqresearch&utm_campaign=lr-homepage
     
    摘要:随着大数据的不断发展,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。现今的计算机体系结构在数据存储方面要有庞大的水平扩展性,而NoSQL也正是致力于改变这一现状。目前Google的 BigTable和Amazon 的Dynamo使用的就是NoSQL型数据库,本文介绍了10种出色的NoSQL数据库。

    NoSQL的分类

    NoSQL可以大体上分为4个种类:Key-value、Document-Oriented、Column-Family Databases以及 Graph-Oriented Databases。下面就一览这些类型的特性:

    一、 列存储(Wide Column Store/Column-Family)数据库

    列存储数据库将数据储存在列族(column family)中,一个列族存储经常被一起查询的相关数据。举个例子,如果我们有一个Person类,我们通常会一起查询他们的姓名和年龄而不是薪资。这种情况下,姓名和年龄就会被放入一个列族中,而薪资则在另一个列族中。

    产品:Cassandra、HBase

    有谁在使用:Ebay (Cassandra)、Instagram (Cassandra)、NASA (Cassandra)、Twitter (Cassandra and HBase)、Facebook (HBase)、Yahoo!(HBase)

    适用的场景

    1. 日志。因为我们可以将数据储存在不同的列中,每个应用程序可以将信息写入自己的列族中。

    2. 博客平台。我们储存每个信息到不同的列族中。举个例子,标签可以储存在一个,类别可以在一个,而文章则在另一个。

    不适用场景

    1. 如果我们需要ACID事务。Vassandra就不支持事务。

    2. 原型设计。如果我们分析Cassandra的数据结构,我们就会发现结构是基于我们期望的数据查询方式而定。在模型设计之初,我们根本不可能去预测它的查询方式,而一旦查询方式改变,我们就必须重新设计列族。

    二、 面向文档(Document-Oriented)数据库

    面向文档数据库会将数据以文档的形式储存。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或者JSONB等多种形式存储。

    产品:MongoDB、CouchDB、RavenDB

    有谁在使用:SAP (MongoDB)、Codecademy (MongoDB)、Foursquare (MongoDB)、NBC News (RavenDB)

    适用的场景

    1. 日志。企业环境下,每个应用程序都有不同的日志信息。Document-Oriented数据库并没有固定的模式,所以我们可以使用它储存不同的信息。

    2. 分析。鉴于它的弱模式结构,不改变模式下就可以储存不同的度量方法及添加新的度量。

    不适用场景

    在不同的文档上添加事务。Document-Oriented数据库并不支持文档间的事务,如果对这方面有需求则不应该选用这个解决方案。

    三、 键值(Key-Value)数据库

    键值数据库就像在传统语言中使用的哈希表。你可以通过key来添加、查询或者删除数据,鉴于使用主键访问,所以会获得不错的性能及扩展性。

    产品:Riak、Redis、Memcached、Amazon’s Dynamo、Project Voldemort

    有谁在使用:GitHub (Riak)、BestBuy (Riak)、Twitter (Redis和Memcached)、StackOverFlow (Redis)、 Instagram (Redis)、Youtube (Memcached)、Wikipedia(Memcached)

    适用的场景

    储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择。

    不适用场景

    1. 取代通过键查询,而是通过值来查询。Key-Value数据库中根本没有通过值查询的途径。

    2. 需要储存数据之间的关系。在Key-Value数据库中不能通过两个或以上的键来关联数据。

    3. 事务的支持。在Key-Value数据库中故障产生时不可以进行回滚。

    四、 图(Graph-Oriented)数据库

    图数据库允许我们将数据以图的方式储存。实体会被作为顶点,而实体之间的关系则会被作为边。比如我们有三个实体,Steve Jobs、Apple和Next,则会有两个“Founded by”的边将Apple和Next连接到Steve Jobs。

    产品:Neo4J、Infinite Graph、OrientDB

    有谁在使用:Adobe (Neo4J)、Cisco (Neo4J)、T-Mobile (Neo4J)

    适用的场景

    1. 在一些关系性强的数据中

    2. 推荐引擎。如果我们将数据以图的形式表现,那么将会非常有益于推荐的制定

    不适用场景

    不适合的数据模型。图数据库的适用范围很小,因为很少有操作涉及到整个图。

    类型

    部分代表

    特点

    列存储

    Hbase

    Cassandra

    Hypertable

    顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。

    文档存储

    MongoDB

    CouchDB

    文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。

    key-value存储

    Tokyo Cabinet / Tyrant

    Berkeley DB

    MemcacheDB

    Redis

    可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)

    图存储

    Neo4J

    FlockDB

    图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。

    对象存储

    db4o

    Versant

    通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。

    xml数据库

    Berkeley DB XML

    BaseX

    高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。

    以上NoSQL数据库类型的划分并不是绝对,只是从存储模型上来进行的大体划分。它们之间没有绝对的分界,也有交差的情况,比如Tokyo Cabinet / Tyrant的Table类型存储,就可以理解为是文档型存储,Berkeley DB XML数据库是基于Berkeley DB之上开发的。

    虽然NoSQL流行语火起来才短短一年的时间,但是不可否认,现在已经开始了第二代运动。尽管早期的堆栈代码只能算是一种实验,然而现在的系统已经更加的成熟、稳定。不过现在也面临着一个严酷的事实:技术越来越成熟——以至于原来很好的NoSQL数据存储不得不进行重写,也有少数人认为这就是所谓的2.0版本。这里列出一些比较知名的工具,可以为大数据建立快速、可扩展的存储库。

    1. Casssandra

    Cassandra最初由Facebook开发,后来成了Apache开源项目,它是一个网络社交云计算方面理想的数据库。它集成了其他的流行工具如Solr,现在已经成为一个完全成熟的大型数据存储工具。Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynomite(分布式的Key-Value存储系统)更丰富,但支持度却不如文档存储MongoDB。Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra的一个写操作,会被复制到其他节点上去,而对Cassandra的读操作,也会被路由到某个节点上面去读取。在最近的一次测试中,Netflix建立了一个288个节点的集群

    2. Lucene/Solr

    Lucene是Apache软件基金会4 jakarta项目组的一个子项目,这是一个开放源代码的全文检索引擎工具包,就是说它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构。不过大多数人并不认同Lucene是一个数据库,因为大多数人只是用它来检索大量的文本块,不过它的确采用了与其他NoSQL数据存储相似的模型。如果说查询并不是仅仅局限于精确的匹配,而是寻找出那些出现在块中的字或者字段的话,毫无疑问,Lucene/Solr是最好的查询方式。

    3. Riak

    Riak是由技术公司basho开发的一个类似Dynamo的分布式Key-Value系统。其以分布式,水平扩展性,高容错性等特点著称。从事Riak工作最有趣的部分是可以使用JavaScript或者Erlang来做Map/Reduce查询,它们会查询每个节点,收集结果,而且可以重复,如果需要使用的结果进行重新进行搜寻的话。该系统还为类似于Solr的搜索提供全文索引,同时还提供一个控制面板,可以查看集群的信息。

    4. CouchDB

    CouchDB是用Erlang开发的面向文档的数据库系统,不过它不是一个传统的关系数据库,而是面向文档的数据库,其数据存储方式有点类似lucene的index文件格式,CouchDB最大的意义在于它是一个面向web应用的新一代存储系统。作为一个分布式的数据库,CouchDB可以把存储系统分布到n台物理的节点上面,并且很好的协调和同步节点之间的数据读写一致性。CouchDB支持REST API,可以让用户使用JavaScript来操作CouchDB数据库,也可以用JavaScript编写查询语句,可以想像一下,用AJAX技术结合CouchDB开发出来的CMS系统会是多么的简单和方便。

    CouchDB还有一个更加商业化的“表亲”——Couchbase,不过它提供缓存功能,更好的分片,增量查询,更好的索引和一些其他的功能。其实Couchbase与CouchDB也是紧密相关的,Couchbase产品包含了CouchDB的一个副本。

    5. Neo4J

    大多数的NoSQL数据库只是存储键和值的一个灵活的捆绑。不过Neo4J的存储的是对象之间的关系,或者说这种结构就是数学中的“图”。Neo4J是一个面向网络(“图”)的数据库,也就是说,它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络上而不是表中,当然也可以把Neo4J看作是一个高性能的图引擎,该引擎具有成熟和健壮的数据库的所有特性。该工具包括很多有关搜索和分析的关系的算法,它能够帮助寻找谁是我的朋友,或者寻找朋友的朋友。这些“图的遍历”算法,可以节省很多指针查询的麻烦。

    6. Oracle的NoSQL

    也许是NoSQL运动太红火的原因,Oracle决定开发一款产品,将键/值对拆分在整个节点集上,这样的优势在于提供了一个灵活的事务保护措施,进而可以确保从数据在节点上等待存储开始到通过网络被成功备份结束,都尽在掌握之中。

    Oracle的NoSQL Database,是在10月4号的甲骨文全球大全上发布的Big Data Appliance的其中一个组件,Big Data Appliance是一个集成了Hadoop、NoSQL Database、Oracle数据库Hadoop适配器、Oracle数据库Hadoop装载器及R语言的系统。

    7. MongoDB

    MongoDB是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的。MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。MongoDB支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。

    MongoDB是高性能开源文档数据库,也是目前最受关注的NoSQL技术之一,以敏捷、可扩展和对企业应用友好(支持事务,一致性和数据完整性保证,有大企业应用案例)而著称。有人甚至认为LAMP中的M应该用MongoDB取代MySQL,其火热程度可见一斑。使用MongoDB的公司包括Foursquare, Craiglist, 迪士尼,SAP,Intuit,EA等,国内淘宝、大众点评、视觉中国等公司有应用。(最新版MongoDB 2.2下载)

    https://www.mongodb.org/downloads 

    Install MongoDB on Windows(安装配置官方参考) http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/

    把程序文件解压在C盘下的mongodb文件夹下,数据库和配置文件放在D盘下的testmongodb文件夹下。


    解压安装包到C:MongoDB

    建立数据库目录 D: estMongoDBdata

    建立日志目录 D: estMongoDBlogs

    建立配置文件目录 D: estMongoDBetc

    建立配置文件 D: estMongoDBetcmongodb.conf

    在CMD下运行如下代码配置:

    C:mongodbmongod.exe --dbpath d: estmongodbdata

    C:mongodbmongod.exe

    C:mongodbmongo.exe


    systemLog: destination: file
    path: c:datalogmongod.log
    storage: dbPath: c:datadb

    sc.exe create MongoDB binPath= "C:mongodbmongod.exe --service --config="C:mongodbmongod.cfg"" DisplayName= "MongoDB" start= "auto"

    设置系统环境变量:
    C:Program FilesMongoDBServer3.0in
    配置默认数据库文件
    mongod.exe --dbpath d:mongodbdata
    配置日记文件
    mongod.exe --dbpath D:MongoDBdata --logpath=D:MongoDBlogsmongodb.log --logappend
    配置服务
    --创建服务
    sc create MongoDB binPath= "C:Program FilesMongoDBServer3.0inmongod.exe --service --dbpath D: estMongoDBdata --logpath=D: estMongoDBlogsmongodb.log --logappend"
    --删除服务
    sc delete MongoDB


    Component Set Binaries
    Server mongod.exe
    Router mongos.exe
    Client mongo.exe
    MonitoringTools mongostat.exe, mongotop.exe
    ImportExportTools mongodump.exe, mongorestore.exe, mongoexport.exe, mongoimport.exe
    MiscellaneousTools bsondump.exe, mongofiles.exe, mongooplog.exe, mongoperf.exe

    MongoDB shell version: 3.0.6
    connecting to: test
    Server has startup warnings:
    2015-09-08T11:44:26.265+0800 I CONTROL [initandlisten]
    2015-09-08T11:44:26.265+0800 I CONTROL [initandlisten] ** NOTE: This is a 32 bi
    t MongoDB binary.
    2015-09-08T11:44:26.265+0800 I CONTROL [initandlisten] ** 32 bit builds a
    re limited to less than 2GB of data (or less with --journal).
    2015-09-08T11:44:26.265+0800 I CONTROL [initandlisten] ** Note that journ
    aling defaults to off for 32 bit and is currently off.
    2015-09-08T11:44:26.265+0800 I CONTROL [initandlisten] ** See http://doch
    ub.mongodb.org/core/32bit
    2015-09-08T11:44:26.265+0800 I CONTROL [initandlisten]
    2015-09-08T11:44:26.265+0800 I CONTROL [initandlisten] ** NOTE: your operating
    system version does not support the method that MongoDB
    2015-09-08T11:44:26.265+0800 I CONTROL [initandlisten] ** uses to detect
    impending page faults.
    2015-09-08T11:44:26.265+0800 I CONTROL [initandlisten] ** This may result
    in slower performance for certain use cases
    2015-09-08T11:44:26.265+0800 I CONTROL [initandlisten]
    > show dbs
    admin 0.078GB
    local 0.078GB
    > help
    db.help() help on db methods
    db.mycoll.help() help on collection methods
    sh.help() sharding helpers
    rs.help() replica set helpers
    help admin administrative help
    help connect connecting to a db help
    help keys key shortcuts
    help misc misc things to know
    help mr mapreduce

    show dbs show database names
    show collections show collections in current database
    show users show users in current database
    show profile show most recent system.profile entries wit
    h time >= 1ms
    show logs show the accessible logger names
    show log [name] prints out the last segment of log in memor
    y, 'global' is default
    use <db_name> set current database
    db.foo.find() list objects in collection foo
    db.foo.find( { a : 1 } ) list objects in foo where a == 1
    it result of the last line evaluated; use to f
    urther iterate
    DBQuery.shellBatchSize = x set default number of items to display on s
    hell
    exit quit the mongo shell
    >

    http://docs.mongodb.org/manual/reference/method/db.createUser/#db.createUser

    use admin
    db.createUser(
    {
    user: "appAdmin",
    pwd: "password",
    roles:
    [
    { role: "readWrite", db: "config" },
    "clusterAdmin"
    ]
    }
    )

    Mongodb GUI
    MongoVUE http://www.mongovue.com/downloads/
    MongoHub https://github.com/bububa/mongohub
    RockMongo https://github.com/iwind/rockmongo
                     http://sourceforge.net/projects/rockmongoadmin/ 

    http://hubbledotnet.codeplex.com/SourceControl/latest
    https://github.com/mongodb
    https://github.com/mongodb/mongo-csharp-driver

    MongoDB常用命令教程 

    mongodb超级用户相关命令: 

    use admin 

    #增加或修改用户密码 

    db.addUser(169it,'pwd') 

    #查看用户列表 

    db.system.users.find() 

    #用户认证 

    db.auth(169it,'pwd') 

    #删除用户 

    db.removeUser('mongodb') 

    #查看所有用户 

    show users 

    #查看所有数据库 

    show dbs 

    #查看所有的collection 

    show collections 

    #查看各collection的状态 

    db.printCollectionStats() 

    #查看主从复制状态 

    db.printReplicationInfo() 

    #修复数据库 

    db.repairDatabase() 

    #设置记录profiling,0=off 1=slow 2=all 

    db.setProfilingLevel(1) 

    #查看profiling 

    show profile 

    #拷贝数据库 

    db.copyDatabase('mail_addr','mail_addr_tmp') 

    #删除collection 

    db.mail_addr.drop() 

    #删除当前的数据库 

    db.dropDatabase() 

    mongodb客户端连接命令: 

    /usr/local/mongodb/bin/mongo 8.8.88/ixigualib -u ixigua -p 'pwd' 

    mongodb增删改命令: 

    #存储嵌套的对象 

    db.foo.save({'name':'ysz','address':{'city':'beijing','post':100096},'phone':[138,139]}) 

    #存储数组对象 

    db.user_addr.save({'Uid':'169it@sohu.com','Al':['test-1@sohu.com','test-2@sohu.com']}) 

    #根据query条件修改,如果不存在则插入,允许修改多条记录 

    db.foo.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true) 

    #删除yy=5的记录 

    db.foo.remove({'yy':5}) 

    #删除所有的记录 

    db.foo.remove() 

    mongodb索引命令: 

    #增加索引:1(ascending),-1(descending) 

    db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true}); 

    #索引子对象 

    db.user_addr.ensureIndex({'Al.Em': 1}) 

    #查看索引信息 

    db.deliver_status.getIndexes() 

    db.deliver_status.getIndexKeys() 

    #根据索引名删除索引 

    db.user_addr.dropIndex('Al.Em_1') 

    mongodb查询命令: 

    #查找所有 

    db.foo.find() 

    #查找一条记录 

    db.foo.findOne() 

    #根据条件检索10条记录 

    db.foo.find({'msg':'Hello 1'}).limit(10) 

    #sort排序 

    db.deliver_status.find({'From':'169it@sina.com'}).sort({'Dt',-1}) 

    db.deliver_status.find().sort({'Ct':-1}).limit(1) 

    #count操作 

    db.user_addr.count() 

    #distinct操作 

    db.foo.distinct('msg') 

    #>操作 

    db.foo.find({"timestamp": {"$gte" : 2}}) 

    #子对象的查找 

    db.foo.find({'address.city':'beijing'}) 

    mongodb管理命令: 

    #查看collection数据的大小 

    db.deliver_status.dataSize() 

    #查看colleciont状态 

    db.deliver_status.stats() 

    #查询所有索引的大小 

    db.deliver_status.totalIndexSize() 

    #查看当前所使用的数据库 

    db 

    8. Hadoop的HBase

    HBase(Hadoop Database),是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据。

    虽然大多数人都认为Hadoop及其所有的工具都是作为管理大规模集群的一种机制,其实不然,Hadoop也包括数据库,在HBase中也是通过节点来传播数据。Hadoop的Map /Reduce的架构是非常适合于复杂的计算任务或查询工作。领土在不断的扩张,新的数据库像Accumulo就是Hadoop平台的一个延伸。(Apache Accumulo是一个可靠的、可伸缩的、高性能的排序分布式的Key-Value存储解决方案,基于单元访问控制以及可定制的服务器端处理。使用Google BigTable设计思路,基于Apache Hadoop、Zookeeper和Thrift构建)

    9. BigTable/ Accumulo/ Hypertable

    BigTable是非关系的数据库,是一个稀疏的、分布式的、持久化存储的多维度排序Map。Bigtable的设计目的是可靠的处理PB级别的数据,并且能够部署到上千台机器上。Bigtable已经实现了下面的几个目标:适用性广泛、可扩展、高性能和高可用性。Bigtable已经在超过60个Google的产品和项目上得到了应用,包括Google Analytics、GoogleFinance、Orkut、Personalized Search、Writely和GoogleEarth。

    谷歌的BigTable开启了NoSQL的热潮,现在很多公司都模仿谷歌的架构搭建了自己的平台。谷歌的AppEngine用户可以把键/值对存储在数据库中,而Hadoop的用户可以把它们放在Accumulo上,其他的可以使用Hypertable。所有的这些基本上都属于键/值存储,只不过添加了一些额外的功能,增加了搜索的速度而已。

    10. DynamoDB

    DynamoDB是亚马逊的key-value模式的存储平台,可用性和扩展性都很好,性能也不错:读写访问中99.9%的响应时间都在300ms内。DynamoDB的NoSQL解决方案,也是使用键/值对存储的模式,平且通过服务器把所有的数据存储在SSD上的三个不同的区域。如果有更高的传输需求,DynamoDB也可以在后台添加更多的服务器。(编译/@CSDN王鹏,审校/包研)

    原文链接:InfoWorld

  • 相关阅读:
    醒醒吧少年,只用Cucumber不能帮助你BDD
    【Python3 爬虫】06_robots.txt查看网站爬取限制情况
    【Python3 爬虫】05_安装Scrapy
    【基尼系数】基尼系数的计算方法与计算案例
    【Python3 爬虫】04_urllib.request.urlretrieve
    【Python3 爬虫】03_urllib.error异常处理
    【Python3 爬虫】02_利用urllib.urlopen向百度翻译发送数据并返回结果
    【Python】help与dir的用法
    在线激活Pycharm(亲测有效)
    【Python3 爬虫】01_简单页面抓取
  • 原文地址:https://www.cnblogs.com/geovindu/p/4774982.html
Copyright © 2020-2023  润新知