zoukankan      html  css  js  c++  java
  • 主流 NoSQL 数据库常见应用场景详解

    一、导读

    对比传统关系型数据库,NoSQL有着更为复杂的分类——键值、面向文档、列存储以及图数据库。这里就带你一览NoSQL各种类型的适用场景及一些知名公司的方案选择。

    在过去几年,关系型数据库一直是数据持久化的唯一选择,数据工作者考虑的也只是在这些传统数据库中做筛选,比如SQL Server、Oracle或者是MySQL。甚至是做一些默认的选择,比如使用.NET的一般会选择SQL Server;使用Java的可能会偏向Oracle,Ruby是MySQL,Python则是PostgreSQL或MySQL等等。

         

    原因很简单,过去很长一段时间内,关系数据库的健壮性已经在多数应用程序中得到证实。我们可以使用这些传统数据库良好的控制并发操作、事务等等。然而如果传统的关系型数据库一直这么可靠,那么还有NoSQL什么事?NoSQL之所以生存并得到发展,是因为它做到了传统关系型数据库做不到的事!

    二、关系型数据库中存在的问题

    Impedance Mismatch

     

    我们使用Python、Ruby、Java、.Net等语言编写应用程序,这些语言有一个共同的特性——面向对象。但是我们使用MySQL、PostgreSQL、Oracle以及SQL Server,这些数据库同样有一个共同的特性——关系型数据库。这里就牵扯到了“Impedance Mismatch”这个术语:存储结构是面向对象的,但是数据库却是关系的,所以在每次存储或者查询数据时,我们都需要做转换。类似Hibernate、Entity Framework这样的ORM框架确实可以简化这个过程,但是在对查询有高性能需求时,这些ORM框架就捉襟见肘了。

    应用程序规模的变大

         

    网络应用程序的规模日渐变大,我们需要储存更多的数据、服务更多的用户以及需求更多的计算能力。为了应对这种情形,我们需要不停的扩展。扩展分为两类:一种是纵向扩展,即购买更好的机器,更多的磁盘、更多的内存等等;另一种是横向扩展,即购买更多的机器组成集群。

         

    在巨大的规模下,纵向扩展发挥的作用并不是很大。首先单机器性能提升需要巨额的开销并且有着性能的上限,在Google和Facebook这种规模下,永远不可能使用一台机器支撑所有的负载。鉴于这种情况,我们需要新的数据库,因为关系数据库并不能很好的运行在集群上。不错你也可能会去搭建关系数据库集群,但是他们使用的是共享存储,这并不是我们想要的类型。于是就有了以Google、Facebook、Amazon这些试图处理更多传输所引领的NoSQL纪元。

    三、NoSQL数据库的类型

    当下已经存在很多的NoSQL数据库,比如MongoDB、Redis、Riak、HBase、Cassandra等等。每一个都拥有以下几个特性中的一个:

    • 不再使用SQL语言,比如MongoDB、Cassandra就有自己的查询语言
    • 通常是开源项目
    • 为集群运行而生
    • 弱结构化——不会严格的限制数据结构类型


    NoSQL可以大体上分为4个种类:Key-value、Document-Oriented、Column-Family Databases以及 Graph-Oriented Databases。下面就一览这些类型的特性。
    1、 键值(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数据库中故障产生时不可以进行回滚。


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

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


     适用的场景 

    • 1. 日志。企业环境下,每个应用程序都有不同的日志信息。Document-Oriented数据库并没有固定的模式,所以我们可以使用它储存不同的信息。
    • 2. 分析。鉴于它的弱模式结构,不改变模式下就可以储存不同的度量方法及添加新的度量。


    不适用场景     在不同的文档上添加事务。Document-Oriented数据库并不支持文档间的事务,如果对这方面有需求则不应该选用这个解决方案。
    3、列存储(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的数据结构,我们就会发现结构是基于我们期望的数据查询方式而定。在模型设计之初,我们根本不可能去预测它的查询方式,而一旦查询方式改变,我们就必须重新设计列族。

    4、图(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. 推荐引擎。如果我们将数据以图的形式表现,那么将会非常有益于推荐的制定不适用场景不适合的数据模型。图数据库的适用范围很小,因为很少有操作涉及到整个图。


    (注0:本文以下内容英文出处:Kristóf Kovács)NoSQL数据库之间的不同,远超过两 SQL数据库之间的差别。这意味着软件架构师更应该在项目开始时就选择好一个适合的 NoSQL数据库。针对这种情况,这里 Cassandra、 Mongodb、 CouchDB、 Redis、  Riak、 Membase、 Neo4j  和 HBase 进行了比较。    (注1:NoSQL:是一项全新的数据库革命性运动,NoSQL的拥护者们提倡运用非关系型的数据存储。现今的计算机体系结构在数据存储方面要求具 备庞大的水平扩 展性,而NoSQL致力于改变这一现状。目前Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型数据库。参见NoSQL词条。)

    1> CouchDB

    • 所用语言:Erlang
    • 特点:DB一致性,易于使用
    • 使用许可:Apache
    • 协议:HTTP/REST
    • 双向数据复制,
    • 持续进行或临时处理,
    • 处理时带冲突检查,
    • 因此,采用的是master-master复制(见编注2)
    • MVCC – 写操作不阻塞读操作
    • 可保存文件之前的版本
    • Crash-only(可靠的)设计
    • 需要不时地进行数据压缩
    • 视图:嵌入式 映射/减少
    • 格式化视图:列表显示
    • 支持进行服务器端文档验证
    • 支持认证
    • 根据变化实时更新
    • 支持附件处理
    • 因此, CouchApps(独立的 js应用程序)
    • 需要 jQuery程序库


    最佳应用场景     
    适用于数据变化较少,执行预定义查询,进行数据统计的应用程序。适用于需要提供数据版本支持的应用程序。
    例如:CRM、CMS系统。master-master复制对于多站点部署是非常有用的。
    (注2:master-master复制:是一种数据库同步方法,允许数据在一组计算机之间共享数据,并且可以通过小组中任意成员在组内进行数据更新。) 2> Redis

    • 所用语言:C/C++
    • 特点:运行异常快
    • 使用许可:BSD
    • 协议:类 Telnet
    • 有硬盘存储支持的内存数据库,
    • 但自2.0版本以后可以将数据交换到硬盘(注意, 2.4以后版本不支持该特性!)
    • Master-slave复制(见编注3)
    • 虽然采用简单数据或以键值索引的哈希表,但也支持复杂操作,例如 ZREVRANGEBYSCORE。
    • INCR & co (适合计算极限值或统计数据)
    • 支持 sets(同时也支持 union/diff/inter)
    • 支持列表(同时也支持队列;阻塞式 pop操作)
    • 支持哈希表(带有多个域的对象)
    • 支持排序 sets(高得分表,适用于范围查询)
    • Redis支持事务
    • 支持将数据设置成过期数据(类似快速缓冲区设计)
    • Pub/Sub允许用户实现消息机制


    最佳应用场景
    适用于数据变化快且数据库大小可遇见(适合内存容量)的应用程序。     例如:股票价格、数据分析、实时数据搜集、实时通讯。
    (注3:Master-slave复制:如果同一时刻只有一台服务器处理所有的复制请求,这被称为 Master-slave复制,通常应用在需要提供高可用性的服务器集群。) 3> MongoDB

    • 所用语言:C++
    • 特点:保留了SQL一些友好的特性(查询,索引)。
    • 使用许可:AGPL(发起者:Apache)
    • 协议:Custom, binary( BSON)
    • Master/slave复制(支持自动错误恢复,使用 sets 复制)
    • 内建分片机制
    • 支持 javascript表达式查询
    • 可在服务器端执行任意的 javascript函数
    • update-in-place支持比CouchDB更好
    • 在数据存储时采用内存到文件映射
    • 对性能的关注超过对功能的要求
    • 建议最好打开日志功能(参数 –journal)
    • 在32位操作系统上,数据库大小限制在约2.5Gb
    • 空数据库大约占 192Mb
    • 采用 GridFS存储大数据或元数据(不是真正的文件系统)


    最佳应用场景   
    适用于需要动态查询支持;需要使用索引而不是 map/reduce功能;需要对大数据库有性能要求;需要使用 CouchDB但因为数据改变太频繁而占满内存的应用程序。
    例如:你本打算采用 MySQL或 PostgreSQL,但因为它们本身自带的预定义栏让你望而却步。 4> Riak

    • 所用语言:Erlang和C,以及一些Javascript
    • 特点:具备容错能力
    • 使用许可:Apache
    • 协议:HTTP/REST或者 custom binary
    • 可调节的分发及复制(N, R, W)
    • 用 JavaScript or Erlang在操作前或操作后进行验证和安全支持。
    • 使用JavaScript或Erlang进行 Map/reduce
    • 连接及连接遍历:可作为图形数据库使用
    • 索引:输入元数据进行搜索(1.0版本即将支持)
    • 大数据对象支持( Luwak)
    • 提供“开源”和“企业”两个版本
    • 全文本搜索,索引,通过 Riak搜索服务器查询( beta版)
    • 支持Masterless多站点复制及商业许可的 SNMP监控


    最佳应用场景
    适用于想使用类似 Cassandra(类似Dynamo)数据库但无法处理 bloat及复杂性的情况。适用于你打算做多站点复制,但又需要对单个站点的扩展性,可用性及出错处理有要求的情况。
    例如:销售数据搜集,工厂控制系统;对宕机时间有严格要求;可以作为易于更新的 web服务器使用。
    5> Membase

    • 所用语言:Erlang和C
    • 特点:兼容 Memcache,但同时兼具持久化和支持集群
    • 使用许可:Apache 2.0
    • 协议:分布式缓存及扩展
    • 非常快速(200k+/秒),通过键值索引数据
    • 可持久化存储到硬盘
    • 所有节点都是唯一的( master-master复制)
    • 在内存中同样支持类似分布式缓存的缓存单元
    • 写数据时通过去除重复数据来减少 IO
    • 提供非常好的集群管理 web界面
    • 更新软件时软无需停止数据库服务
    • 支持连接池和多路复用的连接代理


    最佳应用场景     适用于需要低延迟数据访问,高并发支持以及高可用性的应用程序     例如:低延迟数据访问比如以广告为目标的应用,高并发的 web 应用比如网络游戏(例如 Zynga)。 6> Neo4j

    • 所用语言:Java
    • 特点:基于关系的图形数据库
    • 使用许可:GPL,其中一些特性使用 AGPL/商业许可
    • 协议:HTTP/REST(或嵌入在 Java中)
    • 可独立使用或嵌入到 Java应用程序
    • 图形的节点和边都可以带有元数据
    • 很好的自带web管理功能
    • 使用多种算法支持路径搜索
    • 使用键值和关系进行索引
    • 为读操作进行优化
    • 支持事务(用 Java api)
    • 使用 Gremlin图形遍历语言
    • 支持 Groovy脚本
    • 支持在线备份,高级监控及高可靠性支持使用 AGPL/商业许可


    最佳应用场景
    适用于图形一类数据。这是 Neo4j与其他nosql数据库的最显著区别。例如:社会关系,公共交通网络,地图及网络拓谱 7> Cassandra

    • 所用语言:Java
    • 特点:对大型表格和 Dynamo支持得最好
    • 使用许可:Apache
    • 协议:Custom, binary (节约型)
    • 可调节的分发及复制(N, R, W)
    • 支持以某个范围的键值通过列查询
    • 类似大表格的功能:列,某个特性的列集合
    • 写操作比读操作更快
    • 基于 Apache分布式平台尽可能地 Map/reduce
    • 我承认对 Cassandra有偏见,一部分是因为它本身的臃肿和复杂性,也因为 Java的问题(配置,出现异常,等等)


    最佳应用场景 
    当使用写操作多过读操作(记录日志)如果每个系统组建都必须用 Java编写(没有人因为选用 Apache的软件被解雇)。    例如:银行业,金融业(虽然对于金融交易不是必须的,但这些产业对数据库的要求会比它们更大)写比读更快,所以一个自然的特性就是实时数据分析 8> HBase
    HBase配合 ghshephard使用。

    • 所用语言:Java
    • 特点:支持数十亿行X上百万列
    • 使用许可:Apache
    • 协议:HTTP/REST (支持 Thrift,见编注4)
    • 在 BigTable之后建模
    • 采用分布式架构 Map/reduce
    • 对实时查询进行优化
    • 高性能 Thrift网关
    • 通过在server端扫描及过滤实现对查询操作预判
    • 支持 XML, Protobuf, 和binary的HTTP
    • Cascading, hive, and pig source and sink modules
    • 基于 Jruby( JIRB)的shell
    • 对配置改变和较小的升级都会重新回滚
    • 不会出现单点故障
    • 堪比MySQL的随机访问性能


    最佳应用场景
    适用于偏好BigTable,并且需要对大数据进行随机、实时访问的场合。例如:Facebook消息数据库(更多通用的用例即将出现)。

  • 相关阅读:
    array and ram
    char as int
    pointer of 2d array and address
    Install SAP HANA EXPRESS on Google Cloud Platform
    Ubuntu remount hard drive
    Compile OpenSSL with Visual Studio 2019
    Install Jupyter notebook and tensorflow on Ubuntu 18.04
    Build OpenCV text(OCR) module on windows with Visual Studio 2019
    Reinstall VirtualBox 6.0 on Ubuntu 18.04
    Pitfall in std::vector<cv::Mat>
  • 原文地址:https://www.cnblogs.com/shujuyr/p/14754831.html
Copyright © 2011-2022 走看看