随着大数据时代的来临,数据类型繁多,包括结构化数据和各种非结构化数据,其中非结构化数据的比例高达90%以上,传统的关系型数据库由于数据类型不灵活、水平扩展能力较差等局限性,已无法满足各种类型的非结构化数据的大规模存储需求。
Nosql是Not Only SQL简写,从字面意思上就可以理解为不仅仅是SQL。
百度百科上是这样描述的:
NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。NoSQL是一项全新的数据库革命性运动,其拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
百度百科
NoSQL是一种下一代数据库管理系统 (DBMS)。NoSQL 数据库具有灵活的模式,可用于构建具有大量数据和高负载的现代应用程序。
NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。
2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论,来自Rackspace的Eric Evans再次提出了NOSQL的概念,这时的NOSQL主要指非关系型、分布式、不提供ACID的数据库设计模式。
2009年,在亚特兰大举行的"no:sql(east)"讨论会是一个里程碑,其口号是"select fun, profit from real_world where relational=false;"。因此,对NOSQL最普遍的解释是“非关联型的”,强调键-值存储和面向文档数据库的优点,而不是单纯的反对RDBMS。
在处理大量数据时,任何关系数据库管理系统 (RDBMS) 的响应时间都会变慢。为了解决这个问题,我们可以通过升级现有硬件来“扩大”信息系统,这非常昂贵。但是,NoSQL 可以更好地横向扩展并且更具成本效益。
NoSQL 对于非结构化或非常大的数据对象(例如聊天日志数据、视频或图像)非常有用,这就是为什么 NoSQL 在微软、谷歌、亚马逊、Meta (Facebook) 等互联网巨头中特别受欢迎的原因。
RDBMS与NoSQL的区别
首先是结构化数据,根据定义结构化数据指的是由二维表结构来逻辑表达和实现的数据,严格遵循数据格式与长度规范,也称作为行数据,特点为:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。
因此关系型数据库完美契合结构化数据的特点,关系型数据库也是关系型数据最主要的存储与管理引擎。
非结构化数据,指的是数据结构不规则或不完整,没有任何预定义的数据模型,不方便用二维逻辑表来表现的数据,例如办公文档(Word)、文本、图片、HTML、各类报表、视频音频等。
介于结构化与非结构化数据之间的数据就是半结构化数据了,它是结构化数据的一种形式,虽然不符合二维逻辑这种数据模型结构,但是包含相关标记,用来分割语义元素以及对记录和字段进行分层。常见的半结构化数据有XML和JSON,例如:
张三 18 12345
这种结构也被成为自描述的结构。
CAP理论,指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性),不能同时成立。
指写操作后的读操作可以读取到最新的数据状态,当数据分布在多个节点上,从任意节点读取到的数据都是最新的状态。
可用性是指任何事务操作都可以得到响应结果,且不会出现响应超时或响应错误。
通常分布式系统的各节点部署在不同的子网,这就是网络分区,不可避免的会出现由于网络问题而导致结点之间通信失败,此时仍可对外提供服务,这叫分区容错性。
CAP 定理的基本表述是:给定"一致性"(Consistency,C)、"可用性"(Availabilty,A)、"分区耐受性"(Partition tolerance,P)三个属性,只能同时满足其中两个属性。作为分布式系统的理论,P 是必要的,所以要在 A 与 C 中做选择。===>当系统可能会遭遇"分区"状态时,我们需要在 C 和 A 之间进行权衡,综合处理来满足特定需求。
在 NoSQL 领域中,通常认为"CAP 定理",是需要放宽一致性约束的原因。
CAP 将"可用性"一词定义为"系统中某个无障碍节点所接收的每一条请求,无论成功失败,都会得到响应"。这可以视为能够忍受的最大延迟时间,一旦延迟过高,就放弃操作,并认为数据不可用。
NoSQL 系统具备"BASE 属性"(基本可用、柔性状态、最终一致性),ACID 与 BASE 之间存在多个逐渐过渡的权衡方案可选。
BASE 理论是对 CAP 中 AP 理论的扩展,通过牺牲强一致性获得可用性。当出现故障时,允许部分不可用,但能保证核心功能可用;允许数据在一段时间内不一致,但最终要达到一致。
NoSQL 大致可以分为以下几类:
可以把KV数据库看成一个简单的哈希表,主要用在所有数据库都通过主键来访问的情况下使用。Key用来定位Value,Value对数据库而言是透明不可见的,不能对Value进行索引和查询,只能对Key进行查询,Value可以用来存储任意类型的数据,比如整型、字符型、数组,还可以是对象。
此外,关系数据库很难实现横向扩展而只能通过纵向扩展的方式实现扩充,但是键值数据库是天生具有良好的伸缩性,理论上可以通过横向扩展实现无限扩容(纵向扩展需要通过更换一个更大的服务器实现,而横向扩展无需新购买更大的服务器,只需要增加一个的服务器、虚拟机或是云服务器就可以实现扩展)。键值数据库的弱项是条件查询,如果只对部分值进行查询或者更新,键值数据库的效率比较低,此外,键值数据库不支持回滚操作,所以无法支持事务。
Redis是K-V存储的典型代表,它是一款开源(基于BSD许可)的高性能K-V缓存和存储系统。Redis的Value是具体的数据结构,包括string、hash、list、set、sorted set、bitmap和hyperloglog,所以常被称为数据结构服务器。
适用的场景
不适用场景
相对于关系型数据库而言,关系型数据库需要通过建立索引来实现加速查询(索引的原理),频繁发生写操作时,索引会发生频繁更新,因此产生维护索引的开销很大。Redis提供的主从复制模式(Replication-Sentinel模式)和集群模式(Redis-Cluster模式)可以很好地提供多数据中心、多向复制等高度可用性和高度扩展性。
Redis高性能的数据存储总结下来有下面几个原因。
顾名思义,列式数据库就是按照列来存储数据的数据库,与之对应的传统关系数据库被称为“行式数据库”,关系数据库就是按照行来存储数据的。
HBase 是一个分布式、面向列的 NoSQL 数据库,是 Google Bigtable 的开源实现,底层存储基于 HDFS,原生支持 MapReduce 计算框架,实现的编程语言为Java。它是Apache软件基金会Hadoop项目的一部分,运行于HDFS文件系统上,为Hadoop提供类似BigTable规模的服务。因此,它可以存储海量稀疏的数据。HBase基于LSM树实现,它将对数据的修改增量保持在内存中,达到指定的大小后将这些修改操作批量写入磁盘。
在极端情况下,写性能比MySQL高一个数量级,读性能低一个数量级,所以列式数据库的适用场景,以HBase为例说明如下:
主要特点
适用的场景
不适用场景
列族数据库一般用列族数据模型,数据库由多个行构成,每行数据包含多个列族,不同的行可以具有不同数量的列族,属于同一个列族的数据会被存放在一起,以HBase为例介绍一下列族数据库的数据模型:
上图是一张用来保存学生信息的HBase表,学号作为行键来唯一标识每一个学生,表中设计了列族Info用来保存学生相关信息,列族Info中包含了三个列:name、major和email,分别用来保存学生的姓名、专业和电子邮箱信息。学号为“201505003”的学生存在两个版本的电子邮件地址,时间戳分别为ts1和ts2,时间戳较大的数据版本是最新的数据。在关系数据库中,我们可以通过行和列组成的二维坐标来定位一个具体值在获取数据的值,而在HBase中,需要通过行键、列族、列限定符和时间戳组成的一个四维坐标来获取一个值。
HBase是面向列存储的,而传统的关系型数据库是面向行存储的。行式数据库中,数据表中的每行是连续地存储在磁盘页中,数据是一行一行存储的,第一行写入磁盘页后,再写第二行,所以在查询数据的时候,需要从磁盘中顺序地扫描出每行的完整内容,然后再从这个完整的内容中筛选出这次查询所需要的属性。假设有一种情况,我们存储的某一行数据属性很多,但是其中只有一个属性是这次查询需要的,其他很多无关的属性虽然用不到,这时候由于采用的是顺序扫描,所以会扫描到很多用不到的属性值,浪费很多磁盘和内存的开销。而采用列式存储,同一个列族的数据会存储在一起,同一个属性的所有值会被存储到一起,执行查询时可以只对可以回答查询的列进行处理,而不需要处理与查询无关的数据行。
列族数据库主要适合于批量数据处理等,因为它可以降低I/O开销,支持大量并发用户查询,典型的应用是分布式数据存储与管理。
为了解决关系数据库Schema带来的问题,文档数据库应运而生。MongoDB作为文档数据库的典型代表,是专为可扩展性、高性能和高可用性设计的数据库。它可以从单服务器部署扩展到大型、复杂的多数据中心架构。利用内存计算的优势,MongoDB能够提供高性能的数据读写操作。MongoDB的本地复制和自动故障转移功能使应用程序具有企业级的可靠性和操作灵活性。
文档数据库最大的特点就是No-Schema(不使用表结构)存储和可读取任意数据。目前绝大部分文档数据库存储的数据格式是JSON,因为JSON数据是自描述的,读取一个JSON中不存在的字段也不会导致SQL那样的语法错误。文档数据库的No-Schema特性,为业务开发带来了几个明显的优势。
面向文档数据库会将数据以文档的形式储存。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或者JSONB等多种形式存储。
MongoDB 是一个分布式文件存储、面向文档的 NoSQL 数据库,用于大容量数据存储,提供统一的数据格式(bson),支持不同类型的索引。
主要特点
适用场景
不适用的场景如下
传统的关系数据库的存储方式是以表的形式存放,而在MongoDB中,以文档的形式存在。数据结构由键值对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。下面这张图片就是一个典型的JSON文档。
下面的图片描述了关系数据库和MongoDB之间概念的对应关系以及存储形式,可以帮助我们理解MongoDB。关系数据库中的表对应MongoDB中的集合,关系数据库中的行对应MongoDB中的文档。
文档数据库和刚才介绍的第一种键值数据库类似,可以看做是键值数据库的升级版,而且它比键值数据库具有更高的查询效率,与键值数据库不同,文档数据库既可以根据Key来构建索引,也可以基于文档内容来构建索引。
MongoDB可以用来存储、索引并管理面向文档的数据或者类似的半结构化数据。
图数据库是最复杂的非关系数据库类型,它们可以处理大量数据。图数据库专注于数据元素之间的连接和关系,并使用图论来存储、搜索和管理这些关系。图数据库使用 nodes 来存储数据,用 nodes 表示单个实体或数据。一个节点连接到另一个节点。为了表示实体之间的连接或关系,图数据库还用到了 edges。
图数据库中的“图”是数学中的概念(数据结构中也有类似的概念),用来表示一个对象的集合,包括顶点以及连接顶点的边。图数据库专门使用图作为存储模型来存储数据,完全不同于键值、列族数据库和文档数据库的数据模型,可以高效存储不同顶点之间的关系,比较适用于社交网络、模式识别、以及路径寻找等问题。
图数据库允许我们将数据以图的方式储存。实体会被作为顶点,而实体之间的关系则会被作为边。比如我们有三个实体,Steve Jobs、Apple和Next,则会有两个“Founded by”的边将Apple和Next连接到Steve Jobs。
适用的场景
图数据库对于许多公司,尤其金融、互联网等领域的公司来说,是刚需。正如Neo4j在新闻稿中所提到的,他们的服务已经被75%的Fortune 100公司所使用。然而,图数据库也有着自己的局限性。第一,图数据库的数据量规模往往较小。以社交网络举例,图数据库的常用建模方式是存储一个用户到其所关联用户的映射关系, 一个用户对应数据库内部一条记录。可以想象,在该数据库中存储的记录条数最多不会超过网站的注册用户数。对于亿级别的数据量来说,单机往往就已经足够。这就一定程度上限制了图数据库通过分布式批量卖机器来赚钱。第二,图数据库本身就不适合分布式。与传统OLTP或OLAP数据库轻松通过分库分表做扩展的方式不同,图数据库做分布式的两种方式,按边切割与按点切割,都是hard级难度,从理论上就难以优化。这并非危言耸听,毕竟只要认真研究过图计算领域的同学都会发现绝大多数关于分布式图计算的论文都在讨论切割问题。并且,图数据有着非常强的偏度(skewness),也就是说,个别节点会拥有大量的边。以社交网络举例,大V们的粉丝涵盖了整个社交网络绝大多数用户。这一特性使得图数据库做分布式难上加难。因此,哪怕数据规模达到分布式需求的时候,从性能角度出发,用户可能还是更加倾向于租用更好的单机,而非选择分布式。第三,图数据库相比于OLTP与OLAP数据库,更加难以成为信源(source-of-truth)。也就是说,用户更倾向于将数据持久化在其他系统中,当需要使用图数据库的时候再将数据进行导入导出。这种做法会导致系统的用户黏性没有那么强,替换成本较低。
传统的关系数据库通过索引来达到快速查询的目的,但是在全文搜索的业务场景下,索引也无能为力,主要体现在:全文搜索的条件可以随意排列组合,如果通过索引来满足,则索引的数量会非常多。
全文搜索的模糊匹配方式,索引无法满足,只能用like查询,而like查询是整表扫描的,效率非常低。全文搜索引擎(又称为倒排索引)的基本原理是建立单词到文档的索引。而正排索引的基本原理是建立文档到单词的索引。Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文的搜索引擎。当然Elasticsearch并不像Apache Lucene那么简单,它不仅具有全文搜索功能,还具有下列特性和能力:
下表是一份简易的Elasticsearch和关系数据库的术语对照表。
一个Elasticsearch集群可以包含多个索引(数据库),也就是说可以包含很多类型。这些类型中包含了很多的文档(行),然后每个文档中又都包含了很多字段(列)。Elasticsearch的交互可以使用Java Native API,也可以使用HTTP的Restful API。Elasticsearch通过Lucene的倒排索引技术可以实现比关系数据库更快的过滤。
Elasticsearch可以为任何形式的数据提供出色的搜索和分析,通过Kibana提供交互式控制面板。我们经常使用Elasticsearch来调试日志用例。
主要特点
适用场景
时序数据是随时间不断产生的一系列数据,简单来说,就是带时间戳的数据。在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测和预警。
时序数据的主要数据属性如下:
时序数据库是专门处理时序数据的数据库,因此其相关概念是和时序数据紧密联系的,下面是时序数据库的一些基本概念。
时序数据库产品:Graphite、InfluxDB、OpenTSDB
时序数据库的应用场景在物联网和互联网APM等场景应用比较多,下面是列举了一些时序数据库的应用场景,但不是全部:
时序数据库是一个非常细化的市场,场景很有针对性,其所针对的领域包括了系统监控、物联网、金融等。做这种特化的数据库优势是容易批量找到合适的用户,但缺陷是实际的市场空间较小。跟通用型数据库,尤其是OLAP数据库相比,时序数据库最大的差异点在于对于时间维度建立了独特的索引与优化,而其他所谓schemaless等特性在OLAP数据库上都能做到,不存在技术障碍。这也就是为什么其实在公司做时序场景的数据库选型的时候会直接将时序数据库与一些OLAP数据库(比如ClickHouse)做比较。如果要把时序数据库往更宽的场景发展,那就是想好如何与那么多的通用型数据库做竞争了。当然,时序数据库可以朝特定场景发展。但是,在这些特定场景下,也存在着诸多竞争对手。比如如果做金融场景,就基本绕不开跟老牌金融数据库kdb+做竞争。如果做IoT 场景,就会需要考虑到跟EMQ X这样的专业IoT玩家做竞争。如果做系统监控,那么就需要挑战Chronosphere这样的独角兽公司。总之,时序数据库是个细化市场,如何掌握好产品的宽度与深度将是个创业公司们面临的问题。
随着企业更快地积累更大的数据集,结构化数据和关系模式并不总是适合。有必要使用非结构化数据和大型对象来更好地捕获这些信息。
传统的 RDBMS 使用 SQL(结构化查询语言)语法来存储和检索结构化数据,相反,NoSQL 数据库包含广泛的功能,可以存储和检索结构化、半结构化、非结构化和多态数据。
有时,NoSQL 也被称为“不仅仅是 SQL”,强调它可能支持类似 SQL 的语言或与 SQL 数据库并列。SQL 和 NoSQL DBMS 之间的一个区别是 JOIN 功能。SQL 数据库使用 JOIN 子句来组合来自两个或多个表的行,因为 NoSQL 数据库本质上不是表格的,所以这个功能并不总是可行或相关的。
但是,一些 NoSQL DBMS 可以执行类似于 JOIN的操作——就像 MongoDB 一样。这并不意味着不再需要 SQL DBMS,相反,NoSQL 和 SQL 数据库倾向于以不同的方式解决类似的问题。
SQL 数据库的一个缺点是它们是垂直扩展的。当存储变多时,需要增加当前机器上的硬件和提高计算能力。这可能代价高昂。需要增加处理能力和内存存储来处理增加的负载以提高性能。
NoSQL 数据库的一大优势是它们可以水平扩展。
它们的设计方式可以将更多机器添加到现有机器(例如云服务器)中。与需要额外 CPU(中央处理单元)或 RAM(随机存取存储器)资源的垂直缩放相比,这种行为更可取。
但当然,NoSQL 数据库的一个缺点是它们不能确保数据的完整性和一致性。
根据 Gartner 的统计,2025 年全球会有 175ZB 的数据需求,其中大部分是非结构化/半结构化数据,并且会大量沉淀在 TOS/S3 等存储产品中,这些数据的存储和计算都蕴含大量的机遇。当然机遇与挑战并存,谁能解决数据的处理(存储+计算)问题,谁就能立于不败之地。
NoSQL 不仅是 not only SQL 也不仅是没有 SQL 语言,我对 NoSQL 的定义是高性能弹性存储+可扩展性动态计算的数据库。
现在我们从数据 Schema 维度审视,NoSQL 代表了半结构化和非结构化的数据处理。“处理”既包括计算,也包含存储。从 CAP 理论维度来看,NoSQL 强调的是“最大化” P,也就是弹性规模化能力,在 C 和 A 上不同的场景各有不同权衡。
预测未来NOSQL的发展趋势如下: