NoSQL数据库概况梳理

目录

一、NoSQL概述

二、NoSQL数据库分类

三、NoSQL数据特点

四、NoSQL数据库适用场景

五、常用NoSQL数据库软件产品

1、Redis

2、HBase

3、MongoDb

4、Neo4J

5、Cassandra

6、Elasticsearch

7、Tokyo Cabinet

8、CouchDB

9、memcached

10、InfluxDB

11、TDengine

 

 

 

 

 

 

一、NoSQL数据库概述

      NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。

        NoSQL最常见的解释是“non-relational”, “Not Only SQL”也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。NoSQL是一项全新的数据库革命性运动,其拥护者们提倡运用非关系型的数据存储

      NoSQL有如下优点:易扩展,NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间也在架构的层面上带来了可扩展的能力。大数据量,高性能,NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。 

 

二、NoSQL数据库分类

 

1、键值(Key-Value)存储数据库

     这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果数据库管理员(DBA)只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB。

2、列存储数据库

     这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.

3、文档型数据库

     文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值,在处理网页等复杂数据时,文档型数据库比传统键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。

4、图形(Graph)数据库

     图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph。

 

不同分类特点对比

分类

Examples举例

典型应用场景

数据模型

优点

缺点

键值(key-value)

Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB

内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。

Key 指向 Value 的键值对,通常用hash table来实现

查找速度快

数据无结构化,通常只被当作字符串或者二进制数据

列存储数据库

Cassandra, HBase, Riak

分布式的文件系统

以列簇式存储,将同一列数据存在一起

查找速度快,可扩展性强,更容易进行分布式扩展

功能相对局限

文档型数据库

CouchDB, MongoDb

Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容)

Key-Value对应的键值对,Value为结构化数据

数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构

查询性能不高,而且缺乏统一的查询语法。

图形(Graph)数据库

Neo4J, InfoGrid, Infinite Graph

社交网络,推荐系统等。专注于构建关系图谱

图结构

利用图结构相关算法。比如最短路径寻址,N度关系查找等

很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。

 

       此外,时序数据库(Times Series,第5类)也可以算作NoSQL数据库,典型的产品如:InfluxDB、Prometheus及TDengine。

 

 

三、NoSQL数据特点

      对于NoSQL数据库并没有一个明确的范围和定义,但是他们都普遍存在下面一些共同特征:

     

易扩展

NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。

大数据量,高性能

NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache。 

灵活的数据模型

NoSQL无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。。

高可用

NoSQL在不太影响性能的情况,就可以方便地实现高可用的架构。比如Cassandra、HBase模型,通过复制模型也能实现高可用。 

 

四、NoSQL数据库适用场景

NoSQL数据库在以下的这几种情况下比较适用:

1、数据模型比较简单;

2、需要灵活性更强的IT系统;

3、对数据库性能要求较高;

4、不需要高度的数据一致性

5、对于给定key,比较容易映射复杂值的环境。

 

五、常用NoSQL数据库软件产品

   1、Redis

     Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

    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等客户端,使用很方便。 

    Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。 

       从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

   Redis的作者,叫Salvatore Sanfilippo,来自意大利的西西里岛,居住在卡塔尼亚。目前供职于Pivotal公司。他使用的网名是antirez。

 

2、HBase

       HBase是一个分布式的、面向列的开源数据库。它主要用来存储非结构化和半结构化的松散数据,是基于列而非行进行数据存储的。HBase建立在HDFS之上,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务,可以通过Hive支持来实现多表join等复杂操作。它还可以横向扩展,增加廉价的商用服务器来提高HBase的计算和存储能力。

 

相较于传统的数据表,HBase中的数据表一般有这样一些特点

       (1)大表,一个表可以有上亿行,上百万列;

       (2)面向列(族)的存储和权限控制,列(族)独立检索;

       (3)稀疏表结构,对于为空(null)的列,并不占用存储空间。

     HBase的数据表中的所有行都按照行键的字典序排列。在存储时,Table在行的方向上分割为多个HRegion。HRegion是按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,Hregion就会等分为两个新的HRegion。 当Table中的行不断增多,就会有越来越多的HRegion。

       HRegion是HBase中分布式存储和负载均衡的最小单元,不同的HRegion可分布在不同的HRegion server上,但一个HRegion是不会拆分到多个Server上的。一个HRegion由一个或者多个Store组成,每个Store保存一个columns family。每个Strore又由一个MemStore和0~多个StoreFile组成。StoreFile以HFile格式保存在HDFS上。

                   

3、MongoDb

     MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似Json的Bjson格式,因此可以存储比较复杂的数据类型。MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,还支持为数据建立索引。它的特点是高性能、易部署、易使用、存储数据非常方便。 

主要功能特性:

1)面向集合存储,易存储对象类型的数据。

“面向集合”( Collenction-oriented),意思是数据被分组,存储在数据集中,被称为一个集合。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库里的表,不同的是它不需要定义任何模式( Schema)。 

2)模式自由。

模式自由,意味着对于存储在Mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。 

 

MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品。MongoDB查询语言功能非常强大,可以实现类似关系数据库单表查询的绝大部分功能,同时支持数据索引。

      对于数据查询:MongoDB支持动态查询,支持丰富的查询表达式。支持完全索引,可以在任意属性上建立索引,包含内部对象。MongoDB还提供创建基于地理空间索引的能力。MongoDB的查询优化器会分析表达式,并生成一个高效的查询计划,并且包含一个监视工具用于分析数据库操作的性能。      

      对于数据存储:MongoDB采用高效的传统存储方式,文件存储格式为BSON(JSON的一种扩展)。BSON是对二进制格式的JSON的简称,BSON支持文档和数组的嵌套。支持二进制数据及大型对象。 同时,MongoDB采用自动分片功能,自动处理碎片,以支持云计算层次的扩展性,可动态添加额外的机器。MongoDB对数据进行分片可以使集群存储更多的数据,实现更大的负载,也能保证存储的负载均衡。

      提供了多种语言的接口:支持Python、PHP、Ruby、Java、C、C#、Javascript、Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。开发人员使用任何一种主流开发语言都可以轻松编程,实现访问MongoDB数据库。

 

       针对MongoDB的特点和提供的功能,MongoDB不适合处理传统的商业智能应用和那些要求高度事务性的系统以及复杂的跨文档(表)级联查询。

       MongoDB非常适合在以下应用环境中使用:

(1)网站数据:MongoDB非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

(2)缓存:由于性能很高,MongoDB也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB搭建的持久化缓存层可以避免下层的数据源过载。

(3)大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候往往会选择传统的文件进行存储。

(4)高伸缩性的场景:MongoDB非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包含对MapReduce引擎的内置支持。

(5)用于对象及JSON数据的存储:MongoDB的BSON数据格式非常适合文档化格式的存储及查询。

 

4、Neo4J(Neo4j)

       Neo4j是一个将结构化数据存储在图(网络)而不是表中的NoSQL图数据库,它可以被看作是一个嵌入式的、基于磁盘的、具备完全事务特性的高性能Java持久化图引擎,该引擎具有成熟数据库的所有特性。

       Neo4j重点解决了拥有大量连接的传统RDBMS在查询时出现的性能衰退问题。围绕图进行数据建模后,Neo4j会以相同的速度遍历节点与边,其遍历速度与构成图的数据规模没有关系。此外,Neo4j还提供了非常快的图算法、推荐系统和OLAP风格的分析。

       遍历是图数据库数据检索的一个基本操作,也是图模型中所特有的操作。遍历的重要概念是其本身的局域化,遍历查询数据时仅使用必需的数据,而不是像关系数据库中使用join操作那样对所有的数据集实施代价昂贵的分组操作。   

       Neo4j本身是用Java语言实现的,它也提供了Java API帮助用户来实现相关的数据库操作。同时Neo4j提供Cypher声明式图谱查询语言,用来可视化查询展示图谱里面的节点和关系。Cypher围绕图谱查询提供了可读性好和容易使用,功能强大的众多优点,并且是跨平台的,包括Java、Shell等其他所有平台。

 

Neo4j的典型数据特征:

•数据结构不是必须的,甚至可以完全没有,这可以简化模式变更和延迟数据迁移。

•可以方便建模常见的复杂领域数据集,如CMS里的访问控制可被建模成细粒度的访问控制表,类对象数据库的用例、TripleStores以及其他例子。

•典型使用的领域如语义网和RDF、LinkedData、GIS、基因分析、社交网络数据建模、深度推荐算法以及其他领域。

围绕内核,Neo4j提供了一组可选的组件。其中有支持通过元模型构造图形结构、SAIL - 一种SparQL兼容的RDF TripleStore实现或一组公共图形算法的实现。

 

5、Cassandra

Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynomite(分布式的Key-Value存储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库的。支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。)Cassandra最初由Facebook开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型。

 

 

6、Elasticsearch

      Elasticsearch 是一个强大的文档存储与搜索引擎,常用于全文检索、日志和事件数据分析等场景。

适用场景: 全文搜索、日志分析

优点: 搜索速度快,支持大规模数据集分析

缺点: 索引存储需求高,数据更新复杂

 

 

7、Tokyo Cabinet
       Tokyo Cabinet是一个Kay/Value型数据库,每个Key和Value的长度都可以不同,Kay和Value既可以是二进制数据,也可以是字符串,无数据表和数据类型的概念,记录是以哈希表、B+树和固定长度数组形式组织的。Tokyo Cabinet具有以下优点:

空间利用率高 – 数据文件尺寸更小;

执行效率高 – 更快的处理速度;

并发性能好 – 在多线程环境性能更好;

改善的可用性 – 简化的API;

改善的可靠性 – 即使在发生灾难的情况下,数据文件也不会损坏;

支持64位架构 – 支持海量的存储空间和巨型数据库文件。

Tokyo Cabinet是用C语言编写的,为C,Perl,Ruby,Java和Lua提供了API。

 

8、CouchDB 

     CouchDB 是一个开源的面向文档的数据库管理系统,可以通过 RESTful JavaScript Object Notation (JSON) API 访问。术语 “Couch” 是 “Cluster Of Unreliable Commodity Hardware” 的首字母缩写,它反映了 CouchDB 的目标具有高度可伸缩性,提供了高可用性和高可靠性,即使运行在容易出现故障的硬件上也是如此。CouchDB 最初是用 C++ 编写的,但在 2008 年 4 月,这个项目转移到 Erlang OTP 平台进行容错测试

   CouchDB是用Erlang开发的面向文档的数据库系统,2010年7月14日发布了1.0版本。CouchDB不是一个传统的关系数据库,而是面向文档的数据库,其数据存储方式有点类似lucene的index文件格式,CouchDB最大的意义在于它是一个面向web应用的新一代存储系统,事实上,CouchDB的口号就是:下一代的Web应用存储系统。

CouchDB的特点:

1)、CouchDB是分布式的数据库,他可以把存储系统分布到n台物理的节点上面,并且很好的协调和同步节点之间的数据读写一致性。这当然也得靠Erlang无与伦比的并发特性才能做到。对于基于web的大规模应用文档应用,分布式可以让它不必像传统的关系数据库那样分库拆表,在应用代码层进行大量的改动。

2)、CouchDB是面向文档的数据库,存储半结构化的数据,比较类似lucene的index结构,特别适合存储文档,因此很适合CMS,电话本,地址本等应用,在这些应用场合,文档数据库要比关系数据库更加方便,性能更好。

3)、CouchDB支持REST API,可以让用户使用JavaScript来操作CouchDB数据库,也可以用JavaScript编写查询语句,我们可以想像一下,用AJAX技术结合CouchDB开发出来的CMS系统会是多么的简单和方便。

其实CouchDB只是Erlang应用的冰山一角,在最近几年,基于Erlang的应用也得到的蓬勃的发展,特别是在基于web的大规模,分布式应用领域,几乎都是Erlang的优势项目。

 

9、memcached

       memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但被许多网站使用。这是一套开放源代码软件,以BSD license授权发布。

memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。

memcached的API使用三十二比特的循环冗余校验(CRC-32)计算键值后,将数据分散在不同的机器上。当表格满了以后,接下来新增的数据会以LRU机制替换掉。由于memcached通常只是当作缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的数据库)需要额外的代码更新memcached内的数据。

memcached是一套分布式的快取系统,与redis相似,当初是Danga Interactive为了LiveJournal所发展的,但被许多软件(如MediaWiki)所使用。这是一套开放源代码软件,以BSD license授权协议发布。 

memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。 

 

 

10、InfluxDB

InfluxDB 是一个时间序列数据库,用于处理海量写入与负载查询。InfluxDB旨在用作涉及大量时间戳数据的任何用例(包括DevOps监控,应用程序指标,物联网传感器数据和实时分析)的后端存储。

 

特点

  • 为时间序列数据专门编写的自定义高性能数据存储。 TSM引擎具有高性能的写入和数据压缩
  • Golang编写,没有其它的依赖
  • 提供简单、高性能的写入、查询 http api
  • 插件支持其它数据写入协议,例如 graphite、collectd、OpenTSDB
  • 支持类sql查询语句
  • tags可以索引序列化,提供快速有效的查询
  • Retention policies自动处理过期数据
  • Continuous queries自动聚合,提高查询效率

 

11、TDengine

TDengine 是一款开源云原生的时序数据库,专为物联网、工业互联网、金融、IT 运维监控等场景设计并优化。它能让大量设备、数据采集器每天产生的高达 TB 甚至 PB 级的数据得到高效实时的处理,对业务的运行状态进行实时的监测、预警,从大数据中挖掘出商业价值。

 

TDengine 社区版是一开源版本,采用的是 AGPL 许可证,它具备高效处理时序数据所需要的所有功能,包括:

SQL 写入、无模式写入和通过第三方工具写入
S标准 SQL 查询、时序数据特色查询以及自定义函数(UDF)
S缓存每个时间序列的最新数据
S连续查询以及事件驱动流计算
S类 Kafka 数据订阅,加以过滤功能
S与 Grafana、Google Data Studio 可视化工具的无缝集成
S集群、高可用、高可靠
S主流编程语言的连接器
S命令行以及监控、数据导出、数据导入等多种工具

 

TDengine 提供了丰富的应用程序开发接口,为了便于用户快速开发自己的应用,TDengine 支持了多种编程语言的连接器,其中官方连接器包括支持 C/C++、Java、Python、Go、Node.js、C# 和 Rust 的连接器。这些连接器支持使用原生接口(taosc)和 REST 接口(部分语言暂不支持)连接 TDengine 集群。社区开发者也贡献了多个非官方连接器,例如 ADO.NET 连接器、Lua 连接器和 PHP 连接器。

taospy 是 TDengine 的官方 Python 连接器。taospy 提供了丰富的 API, 使得 Python 应用可以很方便地使用 TDengine。taospy 对 TDengine 的原生接口和 REST 接口都进行了封装, 分别对应 taospy 包的 taos 模块 和 taosrest 模块。 除了对原生接口和 REST 接口的封装,taospy 还提供了符合 Python 数据访问规范(PEP 249) 的编程接口。这使得 taospy 和很多第三方工具集成变得简单,比如 SQLAlchemy 和 pandas。

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值