NoSQL与其常见的产品

一. 什么是NoSQL

  NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",它是一种非关系型数据库

二. 为什么要有NoSQL

  在现代的计算系统上每天网络上都会产生庞大的数据量,而传统的关系型数据库在应付超大规模,超大流量以及高并发的时候力不从心,首先,对数据库存储的容量要求越来越高,单机无法满足需求,很多时候需要用集群来解决问题,而RDBMS(关系型数据库)由于要支持join,union等操作,一般不支持分布式集群。其次,在大数据大行其道的今天,很多的数据都“频繁读和增加,不频繁修改”,而RDBMS对所有操作一视同仁,这就带来了优化的空间。另外,互联网时代业务的不确定性导致数据库的存储模式也需要频繁变更,不自由的存储模式增大了运维的复杂性和扩展的难度。

  通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。

三. NoSQL的性质

  - 代表着不仅仅是SQL
  - 没有声明性查询语言
  - 没有预定义的模式
  -键 - 值对存储,列存储,文档存储,图形数据库
  - 最终一致性,而非ACID属性
  - 非结构化和不可预知的数据
  - CAP定理(分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得)
  - 高性能,高可用性和可伸缩性

四. 常见的NoSQL数据库(NoSQL火热后,有许多NoSQL产品随之而生,这里列出部分常见的数据库)

  MongoDB

    性质:

      MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案。当数据量达到50GB以上的时候,MongoDB的数据库访问速度是MySQL的10倍以上。MongoDB的并发读写效率不是特别出色,根据官方提供的性能测试表明,大约每秒可以处理0.5万~1.5万次读写请求。MongoDB还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储。

      MongoDB也有一个Ruby的项目MongoMapper,是模仿Merb的DataMapper编写的MongoDB接口,使用起来非常简单,几乎和DataMapper一模一样,功能非常强大。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

所谓“面向集合”(Collenction-Orented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个 集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized dOcument Format)。

      MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

      MongoDB把数据存储在文件中,为提高效率使用内存映射文件进行管理。

    特点:

      面向集合存储,易存储对象类型的数据。
      基于文档的数据库系统,格式是以BSON(JSON,半结构化数据)存储。
      性能的保证,基于C++研发,速度快。
      支持完全索引(数据读取全靠索引)
      不支持事务,意味每一个操作都是原子的且是强一致性。
      操作在内存中进行,定义同步到磁盘。
      支持很好的扩展性,比如复制,auto_sharding。
      能基于复制自动完整故障转移。
      支持文档的查询,可以返回一个文档也可以返回一个游标(结果集)。
      支持查询性能分析。
      支持动态查询,就是可以像MySQL那样自己书写查询条件,而有些NoSQL这不行。
      支持使用Map Redure做分组聚合操作,处理大数据极强。
      支持空间索引,用于地理数据表述的场景,如地图。
      自动处理碎片,以支持云计算层次的扩展性。

    优点:

      1.更高的写负载,MongoDB拥有更高的插入速度。

      2.处理很大的规模的单表,当数据表太大的时候可以很容易的分割表。

      3.高可用性,设置M-S不仅方便而且很快,MongoDB还可以快速、安全及自动化的实现节点(数据中心)故障转移。

      4.快速的查询,MongoDB支持二维空间索引,比如管道,因此可以快速及精确的从指定位置获取数据。MongoDB在启动后会将数据库中的数据以文件映射的方式加载到内存中。如果内存资源相当丰富的话,这将极大地提高数据库的查询速度。

      5.非结构化数据的爆发增长,增加列在有些情况下可能锁定整个数据库,或者增加负载从而导致性能下降,由于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响,整个过程会非常快速。

    缺点:

      不支持事务操作。(4.0的版本支持ACID事务)
      占用空间过大。
      大数据量持续插入,写入性能有较大波动。
      在集群分片中的数据分布不均匀。
      没有成熟的维护工具。
    适用场景:
      MongoDB 的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS 系统(具有丰富的功能)之间架起一座桥梁,它集两者的优势于一身。根据官方网站的描述,Mongo 适用于以下场景。
      ● 网站数据:Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
      ● 缓存:由于性能很高,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo 搭建的持久化缓存层可以避免下层的数据源过载。
      ● 大尺寸、低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
      ● 高伸缩性的场景:Mongo 非常适合由数十或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce 引擎的内置支持。
      ● 用于对象及JSON 数据的存储:Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。

  redis

    性质:
      redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
      Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 [1] 
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
    特点:
      内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
      Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
      Redis支持数据的备份,即master-slave模式的数据备份。
      支持事务
    优点:
      性能极高。
      丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
      原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。(事务)
      丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
      分布式 读写分离模式。
      可用于缓存,消息,按key设置过期时间,过期后自动删除。
      redis具有快速和持久化的特征,速度快,因为数据存在内存中。
    缺点:
      不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。

      主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。

      redis的主从复制采用全量复制,复制过程中主机会fork出一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内存。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一次全量的数据复制,这对实际的系统运营造成了不小的麻烦。

      Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

    适用场景:

      缓存——热数据(数据高并发的读写操作)

      计数器(数据高并发)

      排行榜(对扩展性要求高的数据)

      最新列表等

  MemcacheDB

    性质:

      MemcacheDB是一个分布式、key-value形式的持久存储系统。它不是一个缓存组件,而是一个基于对象存取的、可靠的、快速的持久存储引擎。协议跟memcache一致(不完整),所以很多memcache客户端都可以跟它连接。MemcacheDB采用Berkeley DB作为持久存储组件,故很多Berkeley DB的特性的他都支持。

      memcache分布式缓存服务器添加了Berkeley DB的持久化存储机制和异步主辅复制机制,让memcached具备了事务恢复能力、持久化能力和分布式复制能力,非常适合于需要超高性能读写速度,但是 不需要严格事务约束,能够被持久化保存的应用场景。读写速度每秒可达上万次。

    优点:

      1.Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。

      2.支持直接配置为session handle。

    缺点:

      只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。
      无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。
      无法进行数据同步,不能将MC中的数据迁移到其他MC实例中。
      Memcached内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计。

  Hbase

    性质:

      HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。

    优点:

      列的可以动态增加,并且列为空就不存储数据,节省存储空间。
      自动切分数据,使得数据存储自动具有水平scalability。
      可以提供高并发读写操作的支持。

    缺点:

      单一RowKey固有的局限性决定了它不可能有效地支持多条件查询。

      不适合于大范围扫描查询。

      不直接支持 SQL 的语句查询。

    适用场景:

      半结构化或非结构化数据 。

      记录非常稀疏 。

      多版本数据。

      超大数据量 。

原文地址:https://www.cnblogs.com/ywb-articles/p/10560633.html