□基本含义

NoSQL最常见的解释是“non-relational”, “Not Only SQL”也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。NoSQL是一项全新的数据库革命性运动,其拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
NoSQL有如下优点:易扩展,NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间也在架构的层面上带来了可扩展的能力。大数据量,高性能,NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。

□分类

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

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

列存储数据库

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

文档型数据库

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

图形(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度关系查找等 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。

□优点

数据是当今世界最有价值的资产之一。在大数据时代,人们生产、收集数据的能力大大提升,但是传统的关系型数据库在可扩展性、数据模型和可用性方面已远远不能满足当前的数据处理需求,因此,各种 NoSQL 数据库系统应运而生。

NoSQL 数据库不像关系型数据库那样都有相同的特点,遵循相同的标准。NoSQL 数据库类型多样,可满足不同场景的应用需求,因此取得了巨大的成功。

NoSQL 数据库基本理念是以牺牲事务机制和强一致性机制,来获取更好的分布式部署能力和横向扩展能力,创造出新的数据模型,使其在不同的应用场景下,对特定业务数据具有更强的处理性能。

NoSQL 数据库最初是为了满足互联网的业务需求而诞生的,互联网数据具有大量化、多样化、 快速化等特点。

在信息化时代背景下,互联网数据增长迅猛,数据集合规模已实现从 GB、PB 到 ZB 的飞跃。数据不仅仅是传统的结构化数据,还包含了大量的非结构化和半结构化数据,关系型数据库无法存储此类数据。

因此,很多互联网公司着手研发新型的、非关系型的数据库,这类非关系型数据库统称为 NoSQL 数据库,其主要优势如下。

灵活的数据模型

互联网数据如网站用户信息、地理位置数据、社交图谱、用户产生的内容、机器日志数据以及传感器数据等,正在快速改变着人们的通信、购物、广告、娱乐等日常生活,没有使用这些数据的应用很快就会被用户所遗忘。开发者希望使用非常灵活的数据库,容纳新的数据类型,并且不会被第三方数据提供商的数据结构变化所影响。

关系型数据库的数据模型定义严格,无法快速容纳新的数据类型。例如,若要存储客户的电话号码、姓名、地址、城市等信息,则 SQL 数据库需要提前知晓要存储的是什么。这对于敏捷开发模式来说十分不方便,因为每次完成新特性时,通常都需要改变数据库的模式。

NoSQL 数据库提供的数据模型则能很好地满足这种需求,各种应用可以通过这种灵活的数据模型存储数据而无须修改表;或者只需增加更多的列,无须进行数据的迁移。

可伸缩性强

对企业来说,关系型数据库一开始是普遍的选择。然而,在使用关系型数据库的过程中却遇到了越来越多的问题,原因在于它们是中心化的,是纵向扩展而不是横向扩展的。这使得它们不适合那些需要简单且动态可伸缩性的应用。

NoSQL 数据库从一开始就是分布式、横向扩展的,因此非常适合互联网应用分布式的特性。

在互联网应用中,当数据库服务器无法满足数据存储和数据访问的需求时,只需要增加多台服务器,将用户请求分散到多台服务器上,即可减少单台服务器的性能瓶颈出现的可能性。

自动分片

由于关系型数据库存储的是结构化的数据,所以通常采用纵向扩展,即单台服务器要持有整个数据库来确保可靠性与数据的持续可用性。这样做的代价是非常昂贵的,而且扩展也会受到限制。针对这种问题的解决方案就是横向扩展,即添加服务器而不是扩展单台服务器的处理能力。

NoSQL 数据库通常都支持自动分片,这意味着它们会自动地在多台服务器上分发数据,而不需要应用程序增加额外的操作。

自动复制

NoSQL 数据库支持自动复制。在 NoSQL 数据库分布式集群中,服务器会自动对数据进行备份,即将一份数据复制存储在多台服务器上。因此,当多个用户访问同一数据时,可以将用户请求分散到多台服务器中。

同时,当某台服务器岀现故障时,其他服务器的数据可以提供备份,即 NoSQL 数据库的分布式集群具有高可用性与灾备恢复的能力。

□常见的非关系型数据列表

**

类别 前3~5名 说明
时序数据库 InfluxDB、RRDtool、Graphite、OpcnTSDB、Kdb+ 存储时间序列数据,每条记录都带有时间戳。如存储从感应器采集到的数据
键/值数据库 Redis、Memcached、Riak KV、Hazelcast、Ehcache 遵循“键——值”模型,是最简单的数据库管理系统
文档数据库 MongoDB、Couchbase、Amazon DynamoDB、CouchDB、MarkLogic 无固定结构,不同的记录允许有不同的列数和列类型。列允许包含多值,记录允许嵌套
图数椐库 Neo4j、OrientDB、Titan、Virtuoso、ArangoDB 以“点——边”组成的网络(图结构)来存储数据
搜索引擎 Elasticsearch、Solr、Splunk、MarkLogic、Sphinx 存储的目的是为了搜索,主要功能是搜索
对象数据库 Caché、db4o、Versant Object Database、ObjcctStore、Matisse 受面向对象编程语言的启发,把数据定义为对象并存储在数据库中,包括对象之问的关系,如继承
宽列数据库 Cassandra、HBase、Accumulo 按照列(由“键——值”对组成的列表)在数据文件中记录数据,以获得更好的请求及遍历效率。一行中的列数允许动态变化,且列的数目可达数百万,每条记录的关键码不同,支持多值列。

下面对排名靠前的开源数据库做一些简单介绍。

1. MySQL/MariaDB

2008 年美国 Sun 公司花费 10 亿美元收购 MySQL,一年后 Oracle 公司又花费 60 亿美元收购了 Sun 公司,从此 Sun 公司的服务器、操作系统、MySQL 等产品线全部归属 Oracle 公司。

拉力·艾立森奉行的经营哲学是“竞争不过它,我就买了它”。竞争不过,说明竞争对手的产品更具优势,所以收购它,从而变成自己的优势。几十年来,Oracle 从一家小型数据库公司变成今天覆盖硬件、平台软件、数据库、中间件、应用软件各个层次产品线的 IT 巨无霸,靠的就是美国的良好环境和总裁奉行的收购策略。

MySQL 数据库占据中小型数据库应用市场的半壁江山,在这块市场,Oracle 数据库明显占下风,巅峰时世界上超过 70% 的网站后台都采用 MySQL 数据库。但是自从被 Oracle 公司收购后,MySQL 发展明显趋缓,是继续开源还是闭源,Oracle 公司一直没下定论。于是 MySQL 的原班人马陆续离开 Oracle 公司,另立炉灶,推出了 MariaDB 开源数据库。

MariaDB 继承了 MySQL 小巧精悍、简洁高效、稳定可靠的特征,并与 MySQL 保持兼容。时至今日,已有 Google、Facebook 等知名企业把应用从 MySQL 切换到了 MariaDB 上,各种 Linux 发行版的操作系统默认数据库都开始采用 MariaDB;而 Apple 公司反应更快,当 Oracle 公司收购 Sun 公司时,就切换到了 PostgreSQL 数据库。

截至 2014 年年末的数据库综合排名,MySQL 继续位居第二名,但是其表现出来的颓势较明显,而 MariaDB 却具备强劲的生命力。

MariaDB 是一个开源的免费的关系数据库,截至发稿前的最新版本是 10.0.15,安装包可从 https://downloads.mariadb.org 网站下载。整个安装包大约 200MB,几乎能在所有的操作系统上安装和运行,与 Oracle 数据库、SQL Server、DB2 等商业数据库动辄好几张光盘相比,算是短小精悍了。

另外,也可以从这个网站下载数据库的源代码。对于非数据库型的 SaaS 云提供商来说,云端采用 MariaDB 是最好的选择,而且可以轻松搭建数据库集群。

2. PostgreSQL

PostgreSQL 能被苹果公司大量使用并替换早期的 MySQL 数据库,说明其一定有不俗的表现。在 2014 年年末的数据库排行榜上,PostgreSQL 位居第四位,号称世界上最先进的、最安全的开源数据库,也是面向对象的关系数据库。

华为内部局域网接入控制系统 SPES 也采用 PostgreSQL 数据库,在 Linux 操作系统上运行,极少出问题。经过十多年的磨砺,如今 PostgreSQL 数据库具备如下特点:

  • 面向对象,安全性极高,能运行在全部主流的操作系统上,完全 ACID 兼容。
  • 支持外键、连接、视图、触发器和存储过程(多语言)。
  • 支持最新的 SQL 2008 标准的数据类型,包括整型、数字型、字符型、布尔型、可变字符型、日期型、时间戳、自增长型以及各种二进制对象(如图片、声音和视频等)。
  • 提供了各种流行语言的编程接口,如 C/C++、Java、.NET、Perl、Python、Ruby、Tcl、ODBC 等。

PostgreSQL 数据库同时具备很多众多令人振奋的优点,比如在线备份、数据域、表分区、表空间、嵌套事务、时刻点恢复、两段式提交、多版本并发控制、子查询等。

在 PostgreSQL 中,数据库大小没有限制,表大小上限为 32TB,一条记录的大小上限为 1.6TB,字段大小上限是 1GB,一个表包含的记录数没有限制,一条记录的字段数上限为 1600 个,一个表上创建的索引数目没有限制。

另外,SQLite 是一个非常小型的 ACID 兼容的关系数据库,适合嵌入式系统。

3. InfluxDB

InfluxDB 是一个开源的时间序列数据库,能应付极高的写和查询并发数,主要用于存储大规模的时间戳数据(每条记录自动附加时间戳),如 DevOps 监控数据、应用系统运行指标数据、物联网感应器采集的数据及实时分析的结果数据等。InfluxDB 具备如下特征:

  • 全部用 Go 语言编写,并被编译成单一运行程序,无须第三方依赖。
  • 简洁、高效地写和查询 HTTP(S)编程接口(API)。
  • 通过插件能与其他的数据采集工具集成,如 Graphite、collectd、OpenTSDB。
  • 可以搭建高可用性的 InfluxDB 环境。
  • 量身定制化的类-SQL 语言。
  • 允许给序列数据附加标签来创建索引,以便快速高效查询。
  • 通过定义策略轻松实现自动失效过时的数据。
  • 基于 Web 的管理界面。

对于一个具体的时间序列应用来说,除存储外,还需要集成数据采集、可视化和告警功能。为此,InfluxData 社区相应提供了 Telegraf(数据采集)、Chronograf(数据可视化)、Kapacitor(告警)三个开源项目,再加上 InfluxDB,能部署成一个完整的时间序列应用系统(简称为 TICK)。这四者的关系如图 1 所示。
简介 - 图1
图 1 数据采集示意图

4. Redis

Redis 是遵循 BSD 开源协议的存储系统,数据存储在内存中,因此具备极高的性能,可用作数据库、缓存和消息中间件。Redis 支持多种类型的数据结构,如字符串、哈希、列表、集合、带范围查询的有序集合、位图、hyperloglogs 和带半径查询的地理空间索引。

Redis 内置了复制、脚本语言编程、最近最少使用(LRU)淘汰、事务以及不同级别的磁盘持久化等功能,通过 Redis Sentinel 和集群自动分区机制实现高可用性。Redis 采用 C 语言编写,能运行在 Windows、MacOS X、Linux、Solaris 等操作系统上,不过 Linux 是其最佳的运行平台,无须第三方依赖,它提供了最广泛的编程语言接口。

5. MongoDB

MongoDB 是排名第一的文档数据库,属于 NoSQL 大类,诞生于 2009 年,正好是云计算兴起的前夜。MongoDB 采用 C++ 语言开发,能运行在 Windows、MacOS X、Linux、Solaris 操作系统上,提供了绝大部分计算机语言的编程接口。保存在 MongoDB 中的一条记录称为一个文档,类似 JSON 语法,例如:
简介 - 图2
从上面的例子可以看出,一个文档就是“键:值”对的集合。

MongoDB 的主要优势包括:高性能、富查询语言(支持 CRUD、数据聚合、文本搜索和地理空间查询)、高可靠性、自动伸缩架构、支持多存储引擎。MongoDB 适合文档存储、检索和加工的应用场合,如大数据分析。

6. Neo4j

Neo4j 是一个用 Java 语言开发的图数据库,它将结构化数据存储在由“点—边”组成的网络(数学术语叫“图”)上而不是表中。与关系数据库相比,图数据库擅长处理大量复杂、互连接、低结构化的数据。这些数据变化迅速,需要频繁查询,如果使用关系数据库,那么这些查询会导致大量的表连接,因此会产生性能上的问题。

Neo4j 重点解决了拥有大量连接的传统关系数据库在查询时出现的性能衰退问题。Neo4j 还提供了非常快的图算法、推荐系统和 OLAP 风格的分析,而这一切在目前的关系数据库系统中都无法实现。Neo4j 提供了广泛使用的 REST 接口,能够方便地集成到基于 Java、PHP、.NET 和 JavaScript 的环境里。

Neo4j 使用 Cypher 语言进行增删改操作,例如:
简介 - 图3
简介 - 图4
创建了两个节点:变量“e1”和“e2”,标签“员工”,属性“{……}”。
简介 - 图5
创建了一条边,最终形成下图,如图 2 所示。
简介 - 图6
图 2 最终形成

7. Elasticsearch

Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎,用于存储、搜索和近乎实时地分析大规模数据。Elasticsearch 常被人们用于构建具备复杂搜索功能的应用系统,比如维基百科和优步的搜索,再比如网店中搜索商品、商业智能、日志收集与分析、价格告警等。利用 Elasticsearch 实现的数据采集、存储和可视化套件 ELK(Elasticsearch、Logstash、Kibana)在日志分析领域应用最为广泛。

8. Caché

大概 20 年前,人们提出了后关系型数据库的概念,目前已有不少产品,其中由 InterSystems 公司开发的 Caché 是后关系型数据库中的领头羊,它提供 3 种方式访问数据:对象访问、SQL 访问、直接对多维数据数组访问,而且 3 种访问方式能够并发访问同一数据。多维数据结构和多种数据库访问方式构成了后关系型数据库的基础。

Caché 数据库具备如下一些特点:

1)速度快

Caché 数据库在同等条件下查询相同数据,比 Oracle 等普通数据库要快 7~20 倍。

2)节省存储空间

存储空间可能节省 2/3,而基于 Caché 的应用程序,比原来基于关系型数据库的应用程序运行有可能快 20 倍。

3)使用简单

Caché 数据库支持标准 SQL 语句,因此不太熟悉 M 语言的用户依然可以轻松对数据库中的数据进行操作。

4)接口容易

Caché 数据库支持 ODBC 标准接口,因此在与其他系统进行数据交换时非常容易,同时 Caché 亦可以将数据输出为文本文件格式,以供其他系统访问调用。

5)真正的三层结构

Caché 数据库能够在真正意义上实现 3 层结构,实现真正的分布式服务,便于做横向扩张。

6)对象型编辑

Caché 数据库是真正的对象型数据库,开发时用户可直接用数据库定义自己想要的对象,然后再在其他开发工具中调用该对象的方法和属性即可完成开发工作,非常方便。

7)支持 Web 开发

Caché 数据库提供自带的 Web 开发工具,使用、维护非常方便,符合当今软件业发展的趋势。

8)价格便宜

Caché 数据库的价格比 Oracle 数据库要便宜很多。

Caché 数据库在欧美的医疗系统使用最为普遍,被医疗界公认为首选的数据库,国内中山大学第三附属医院、深圳南山医院、北京安贞医院等也采用 Caché 数据库

9. Cassandra

Cassandra 是在 Google 的 Bigtable 基础上发展起来的 NoSQL 数据库,由脸谱于 2008 年用 Java 语言开发,目前被贡献给 Apache 基金会。Cassandra 被称为“列数据库”,这里的“列”不是指关系数据库中一个表中的列,而是由“键—值”对组成的列表(语法与 Python 语言中的列表相同),如:
简介 - 图7
Cassandra 中一行数据语法是“一行的键={列,列,…}”,一行可包含上百万列,比如:
简介 - 图8
Cassandra 中的列族(ColumnFamily)格式是“列族名={若干行}”,一个列族可包含几十亿行,例如:
简介 - 图9
一个 Cassandra 运行实例管理很多键空间(Keyspace),Keyspace 相当于关系数据库管理系统中的数据库,一个键空间包含很多列族。键空间、列族、行、列的关系如图 3 所示。
简介 - 图10
图 3 键空间、列族、行、列的关系

所以,Cassandra 中的寻址是一个四维或者五维哈希表:
简介 - 图11
比如:
简介 - 图12
返回广东理工职业学院(gdpi)计算机系(computer)张三(zsan)这个学生的年龄。

OpenStack 生态中的 HBase 也是列数据库,目前排名第二。