什么是 NoSQL?

NoSQL实践上是两个词的组合:No和SQL。这意味着NoSQL是一种对抗SQL的技能或产品。

盛行语NoSQL的发明者和早期选用者或许想说No RDBMS或No Relations,但沉迷于听起来更好的NoSQL并坚持下去。

在适当的时候,一些人提出了NonRel作为NoSQL的替代品.其他一些人试图经过提出NoSQL实践上是一个扩展到“not only SQL”的首字母缩略词来挽救原始术语。

无论字面意思怎么,NoSQL今天被用作一切数据库和数据存储的总称,这些数据库和数据存储不遵从盛行和完善的RDBMS原则,并且一般与在Web规划上拜访和操作的大型数据集有关。这意味着NoSQL不是一个单一的产品,甚至不是一个单一的技能。它代表了一类产品和有关数据存储和操作的各种(有时是相关的)概念的调集。

布景和一些历史

在我开端具体介绍NoSQL类型和所触及的概念之前,设置NoSQL呈现的上下文十分重要。非联系数据库并不新鲜。事实上,榜首个非联系存储能够追溯到榜首套核算机被发明的时候。非联系数据库因大型机的呈现而蓬勃发展,并存在于专用和特定范畴 – 例如,用于存储身份验证和授权凭据

呈现在NoSQL国际中的是一个新的化身,它诞生于可大规划扩展的Internet运用程序的国际。这些非联系型NoSQL存储在很大程度上是在分布式和并行核算范畴构思的。

从Inktomi开端,它能够被认为是榜首个真正的搜索引擎,到谷歌,很明显,广泛选用的联系数据库办理体系(RDBMS)在运用于很多数据时有其自身的一系列问题。这些问题与高效处理、有用并行化、可扩展性和成本有关。

RDBM的应战

RDBMS在大规划Web级数据处理方面的应战并非特定于产品,而是与此类数据库的整个类别有关。

RDBMS假定数据中有一个界阐明确的结构。它假定数据是密集的,并且在很大程度上是均匀的。RDBMS建立在能够预先界说数据特点的先决条件之上,并且其互相联系已建立并体系地引证。它还假定能够在数据集上共同地界说索引,并且能够统一运用此类索引来加速查询速度。

不幸的是,一旦这些假定不成立,RDBMS就会开端显示出让位的痕迹。RDBMS当然能够处理一些不规则和缺乏结构的问题,但在具有松懈界说的结构的很多稀少数据集的布景下,RDBMS好像是一种强制拟合。关于海量数据集,典型的存储机制和拜访办法也会捉襟见肘。非规范化表、删除约束和放宽业务确保能够协助RDBMS扩展,可是在这些修正之后,RDBMS开端相似于NoSQL产品。

灵敏性是有价值的:

NoSQL缓解了RDBMS带来的问题,使处理大型稀少数据变得容易,但反过来又剥夺了业务完好性和灵敏的索引和查询的力气。

具有讽刺意味的是,NoSQL中最短少的功用之一是SQL,该范畴的产品供货商正在进行各种测验来弥合这一距离。

在曩昔的几年里,谷歌现已为其搜索引擎和其他运用程序构建了一个大规划可扩展的根底设施,包括谷歌地图、谷歌地球、GMail、谷歌财经和谷歌运用。

谷歌的办法是在运用程序仓库的每个等级处理问题。方针是构建一个可扩展的根底架构,用于并行处理很多数据。因而,Google创立了一个完好的机制,其间包括分布式文件体系,面向列系列的数据存储,分布式协调体系和依据MapReduce的并行算法履行环境。

十分客气的是,谷歌宣布并提交了一系列论文,解说了其根底设施的一些要害部分。

谷歌向大众发布的论文激发了开发人员的极大兴趣。

开源搜索引擎的创立者Lucene是榜首个开发开源版别的人,该版别仿制了Google根底架构的某些功用。随后,Lucene的中心开发人员加入了yahoo,在许多其他贡献者的协助下,他们创立了一个平行国际,仿照了谷歌分布式核算仓库的一切部分。这个开源替代计划是Hadoop,它的子项目,以及它的相关项目。

在没有进入Hadoop开发的切当时刻表的情况下,在其榜首个版别中呈现了NoSQL的主意。

谁发明了NoSQL这个术语的历史以及何时发明是无关紧要的,但重要的是要注意,Hadoop的呈现为NoSQL的快速增加奠定了根底。此外,重要的是要考虑到谷歌的成功有助于推进新时代分布式核算概念,Hadoop项目和NoSQL的健康选用。在谷歌的论文激发了人们对并行可扩展处理和非联系分布式数据存储的兴趣一年后,亚马逊决议同享自己的一些成功故事。

2007年,亚马逊提出了一个名为Dynamo的分布式高度可用和终究共同的数据存储的主意。

跟着两大网络巨子谷歌和亚马逊对NoSQL的认可,这一范畴呈现了几款新产品。许多开发人员开端考虑在他们的运用程序中运用这些办法的主意,许多企业,从初创公司到大公司,都乐意更多地了解这项技能,并或许运用这些办法。在不到5年的时刻里,NoSQL和办理大数据的相关概念现已变得普遍,许多闻名公司都呈现了用例,包括Facebook,Netflix,Yahoo,eBay,Hulu,IBM等等。其间许多公司还经过向国际开源其扩展和新产品做出了贡献。


你很快就会学到很多关于各种NoSQL产品的常识,包括它们的异同,

可是,现在让我离题,扼要介绍一下环绕大数据和并行处理的一些应战和处理计划。这个弯路将协助一切读者在开端探究NoSQL产品时做好预备。

大数据

究竟有多少数据才算是大数据?

这个问题必然会寻求不同的回答,这取决于你问谁。答案也或许因提问时刻而异。目前,任何超越几TB的数据集都被归类为大数据。这一般是数据集足够大以开端跨越多个存储单元的巨细。这也是传统RDBMS技能开端显示出压力开端痕迹的规划。

字节是由 8 位组成的数字信息单位。在国际单位制 (SI) 计划中,每 1,000 (103) 个字节的倍数被赋予一个不同的称号,如下所示:

1Byte = 8 Bit

1 KB = 1,024 Bytes 

1 MB = 1,024 KB = 1,048,576 Bytes 

1 GB = 1,024 MB = 1,048,576 KB = 1,073,741,824 Bytes

1 TB = 1,024 GB = 1,048,576 MB = 1,073,741,824 KB = 1,099,511,627,776 Bytes

1 PB = 1,024 TB = 1,048,576 GB =1,125,899,906,842,624 Bytes

1 EB = 1,024 PB = 1,048,576 TB = 1,152,921,504,606,846,976 Bytes

1 ZB = 1,024 EB = 1,180,591,620,717,411,303,424 Bytes

1 YB = 1,024 ZB = 1,208,925,819,614,629,174,706,176 Bytes

即便在几年前,TB的个人数据或许看起来也相当大。可是,现在本地硬盘驱动器和备份驱动器一般以这种巨细供给。在接下来的几年里,如果您的默认硬盘驱动器容量超越几TB,也就家常便饭了。咱们生活在一个数据增加迅猛的时代。咱们的数码相机输出、博客、每日交际网络更新、推文、电子文档、扫描内容、音乐文件和视频正在快速增加。咱们正在耗费很多数据并生成它。

很难评价数字化数据的真实巨细或互联网的巨细,但一些研究、估计和数据点标明,它十分大,在一项正在进行的名为“数字国际十年 – 你预备好了吗? 的陈述中。该陈述宣称,到2020年,创立和仿制的数字数据的总巨细将增加到35泽字节。该陈述还宣称,现在发生和可用的数据量正在超越可用存储量。

其他一些值得考虑的数据点如下:

  • 2009年宣布在ACM上的一篇论文,题为“MapReduce:简化的大型数据处理”集群———透露谷歌每天处理24PB的数据。

  • 2009年,Facebook关于其相片存储体系的一篇文章“难如登天:数十亿张相片的有用存储”–说到Facebook中相片的总巨细为1.5佩字节。同一篇文章说到,Facebook上存储了大约600亿张图片。

  • archive.org 的互联网档案馆常见问题解答说,互联网档案馆中存储了2PB的数据。它还说数据正在以每月 20 TB 的速度增加。

  • 电影《阿凡达》占用了1PB的存储空间用于烘托3D CGI作用。(“信不信由你:阿凡达占用 1 PB 的存储空间,相当于 32 年的 MP3”– 空间相当于 32 年长的 mp3)。

跟着数据规划的增加和数据创立来历的日益多样化,以下不断增加的应战将进一步扩大:

  • 有用地存储和拜访很多数据是困难的。容错和备份的额定需求使工作变得更加杂乱。

  • 操作大型数据集触及运转十分并行的进程。在此类运转期间从任何故障中正常康复并在合理的短时刻内供给成果十分杂乱。

  • 办理由不同来历生成的半结构化和非结构化数据的不断发展的架构和元数据是一个杂乱的问题。

因而,存储和检索很多数据的办法和办法需求超越咱们当时办法的新办法。NoSQL和相关大数据处理计划是朝着这个方向迈出的榜首步。

可扩展性

可伸缩性是体系经过增加资源来处理负载增加问题来进步吞吐量的才能。

可扩展功能够经过预配大型而强壮的资源来满足额定需求来完成,也能够经过依靠普通核算机集群作为一个单元来完成。大型、功用强壮的机器的参与一般被归类为笔直可扩展性。配置具有许多 CPU 内核和很多直连存储的超级核算机是典型的笔直扩展处理计划。这种笔直缩放选项一般既昂贵又专有。笔直可伸缩性的替代办法是水平可伸缩性。水平可伸缩性触及商用体系集群,其间集群跟着负载的增加而扩展。

水平可伸缩性一般触及增加其他节点以供给额定的负载。

大数据的呈现以及对大规划并行处理来操作这些数据的需求导致了水平可扩展根底设施的广泛选用。谷歌、亚马逊、Facebook、eBay和yahoo的一些水平扩展根底设施触及很多服务器。其间一些根底设施有数千甚至数十万台服务器。

处理分布在水平扩展核算机群集中的数据十分杂乱。

MapReduce模型或许供给了在水平机器集群上处理大规划数据的最佳办法之一。

界说和介绍

MapReduce是一种并行编程模型,答应对核算机集群上的大型数据集进行分布式处理。MapReduce框架已取得专利,但这些主意在许多开源完成中被自在同享和选用.

MapReduce的主意和创意来自函数式编程范畴的概念。

map和reduce是函数式编程国际中常用的函数。

在函数式编程中,map 函数将操作或函数运用于列表中的每个元素。

例如,列表 [1, 2, 3, 4] 上的乘以 2 函数将生成另一个列表,如下所示:

[2, 4, 6, 8]

运用此类函数时,不会更改原始列表。函数式编程信任保持数据不可变,防止在多个进程或线程之间同享数据。这意味着刚刚阐明的map函数,虽然它或许微不足道,能够经过列表中的两个或多个多个线程运转,并且这些线程不会互相踩踏,由于列表自身不会改变。

与map函数相同,函数式编程具有reduce函数的概念。实践上,函数式编程中的reduce函数一般被称为折叠函数。削减或折叠函数有时也称为累加、紧缩或注入函数。减缩或折叠函数将函数运用于数据结构的一切元素(如列表),并生成单个成果或输出。因而,对映射函数生成的列表(即 [2,4,6,8])运用相似 reduce 函数的求和将生成等于 20 的输出。

因而,map和reduce函数能够结合运用来处理数据列表,其间函数首先运用于列表的每个成员,然后将聚合函数运用于转换和生成的列表。

映射和归约的简略主意已扩展到大型数据集。这个主意被略微修正为处理元组或键/值对的调集。map 函数对调集中的每个键/值对运用一个函数,并生成一个新调集。然后,reduce函数处理新生成的调集,并运用聚合函数来核算终究输出。经过一个比如能够更好地了解这一点,所以让我举一个微不足道的比如来解说流程。假定您有一个键/值对的调集,如下所示:

[{ “94303”: “Tom”}, {“94303”: “Jane”}, (“94301”: “Arun”}, {“94302”:“Chen”}]

这是键/值对的调集,其间键是邮政编码,值是居住在该邮政编码内的人员的名字。此调集上的简略地图函数能够获取居住在特定邮政编码中的一切人的名字。此类映射函数的输出如下:

[{"94303":["Tom", "Jane"]},{"94301":["Arun"]},{"94302":["Chen"]}]

现在,reduce函数能够在此输出上工作,以简略地核算属于特定邮政编码的人数。终究输出如下:

[("94303": 2},("94301": 1},{"94302": 1)]

这个比如十分简略,MapReduce机制关于这样的操作来说好像太杂乱了,但我希望你能了解概念和流程背面的中心思维。

排序的有序列存储

谷歌的Bigtable支撑一种模型,其间数据以面向列的办法存储。这与RDBMS中的面向行的格局形成鲜明对比。面向列的存储答应有用地存储数据。当该列不存在值时,只需不存储该列,从而防止在存储 null 时占用空间。

每个数据单元都能够被认为是一组键/值对,其间单元自身是借助主标识符(一般称为主键)来标识的。Bigtable 及其克隆倾向于将此主键称为行键。此外,单位以有序排序的办法存储。数据单元依据行键进行排序和排序。为了解说排序的有序面向列的存储,示例比很多文本更好,因而让我向您介绍一个比如。考虑一个简略的值表,它保留有关一组人员的信息。此类表能够包括first_name、last_name、occupotion、zip_code和gender等列。此表中的人员信息或许如下所示:

first_name:John
last_name:Doe 
zip_code:10001 
gender:male

同一表中的另一组数据或许如下所示:

first_name:Jane
zip_code:94303

榜首个数据点的行键能够是 1,第二个数据点能够是 2。然后,数据将存储在排序的有序列式存储中,行键为 1 的数据点将存储在具有行键 2 的数据点之前,并且两个数据点将互相相邻。接下来,将只为每个数据点存储有用的键/值对。所以,该示例或许的一个列系列能够是具有列first_name的称号,last_name是其成员。另一个列族能够是以 zip_code 作为其成员的位置。第三个列系列能够是profile。gender列能够是个人资料的成员列族。在相似于 Bigtable 的面向列的存储中,数据以列系列为根底存储。列族一般在配置或启动时界说。列自身不需求先验界说或声明。此外,列能够存储任何数据类型,只需数据能够持久化为字节数组。

因而,这个简略示例的根底逻辑存储由三个存储桶组成:称号、位置和配置文件。在每个存储桶中,仅存储具有有用值的键/值对。因而,称号列系列存储桶存储以下值:

For row-key:1
first_name:John
last_name:Doe
For row-key:2 
first_name:Jane

location列系列存储以下内容:

zip_code:10001
For row-key:2 
zip_code:94303

profile列系列仅具有行键为 1 的数据点的值,因而它仅存储以下内容:

For row-key:1
gender:male

在实践存储术语中,列族关于给定行不是物理隔离的。与行键相关的一切数据都存储在一起。列系列充任其包括的列的键,行键充任整个数据集的键。

Bigtable 及其克隆中的数据以接连的顺序办法存储。跟着数据增加以填满一个节点,它被涣散到多个节点中。数据不只在每个节点上进行排序和排序,并且跨节点进行排序和排序,供给一个大型接连排序集。数据以容错办法持久保存,其间保护每个数据集的三个副本。大多数 Bigtable 克隆运用分布式文件体系将数据持久保存到磁盘。分布式文件体系答应数据存储在核算机集群中。

排序有序结构使按行键查找数据十分高效。数据拜访不是随机和暂时的,查找就像在保存数据的序列中查找节点相同简略。数据将插入到列表的结尾。更新是就地更新的,但一般意味着将较新版别的数据增加到特定单元,而不是就地覆盖。这意味着一直保护每个单元的几个版别。版别控制特点一般是可配置的。

HBase是一个盛行的,开源的,排序的有序列系列存储,以Google的Bigtable提出的主意为蓝本。

存储在HBase中的数据能够运用MapReduce根底设施进行操作。Hadoop的MapReduce东西能够很容易地运用HBase作为数据源和/或接收器。

键/值存储

哈希映射或关联数组是最简略的数据结构,能够保存一组键/值对。这样的数据结构十分盛行,由于它们为拜访数据供给了十分有用的大O(1)平均算法运转时刻。键/值对的键是调集中的唯一值,能够轻松查找以拜访数据。

键/值对有多种类型:有些将数据保存在内存中,有些供给将数据保存到磁盘的功用。键/值对能够分布并保存在节点集群中。

一个简略但功用强壮的键/值存储是Oracle的Berkeley DB。Berkeley DB 是一个纯存储引擎,其间键和值都是一个字节数组。Berkeley DB 的中心存储引擎不会将含义附加到键或值上。它接受字节数组对并将其回来给调用用户。

Berkeley DB 答应将数据缓存在内存中,并跟着数据的增加刷新到磁盘。还有一个概念是索引键以加速查找和拜访速度。伯克利DB自1990年代中期以来一直存在。它的创立是为了替代AT&T的NDBM,作为从BSD 4.3迁移到1996 4.4.In 的一部分,Sleepycat软件的成立是为了保护和供给对Berkeley DB的支撑。

另一种常用的键/值存储类型是缓存。缓存供给运用程序中最常用的数据的内存中快照。缓存的意图是削减磁盘 I/O。缓存体系能够是基本的映射结构,也能够是具有缓存过期策略的强健体系。缓存是一种盛行的策略,用于核算机软件仓库的一切等级,以进步功能。操作体系、数据库、中间件组件和运用程序运用缓存。

强健的开源分布式缓存体系,如EHCache广泛用于Java运用程序。EHCache能够被认为是NoSQL处理计划。另一个在 Web 运用程序中广泛运用的缓存体系是 Memcached,它是一个开源的高功能目标缓存体系。Brad Fitzpatrick在2003年为LiveJournal创立了Memcached。除了作为缓存体系之外,Memcached 还经过创立大型虚拟池并依据需求在节点之间分配内存来协助有用的内存办理。这能够防止碎片区域,其间一个节点或许具有多余但未运用的内存,而另一个节点或许短少内存。

跟着NoSQL运动的势头越来越强,呈现了许多键/值对数据存储。其间一些较新的存储依据Memcached API构建,一些运用Berkeley DB作为底层存储,还有一些其他商铺供给从头开端构建的替代处理计划。

其间许多键/值对都具有答应获取和设置机制来获取和设置值的 API。一些,如Redis,供给了更丰厚的抽象和强壮的API。Redis 能够被视为数据结构服务器,由于它除了映射之外,还供给字符串(字符序列)、列表和调集等数据结构。此外,Redis 还供给了一组十分丰厚的操作来拜访来自这些不同类型的数据结构的数据。

这里列出的三个键/值对是灵敏、快速的完成,为实时数据、暂时常用数据甚至全面持久性供给存储。

到目前为止列出的键/值对为其存储的数据供给了强壮的共同性模型。可是,其他一些键/值对着重分布式布置中的可用性而不是共同性。其间许多创意来自亚马逊的Dynamo,这也是一个键/值对。亚马逊的Dynamo许诺了卓越的可用性和可扩展性,并构成了亚马逊分布式容错和高可用性体系的骨干。Apache Cassandra,Basho Riak和Voldemort是Amazon Dynamo提出的主意的开源完成。

Amazon Dynamo 将许多要害的高可用性理念带到了最前沿。最重要的主意是终究的共同性。终究共同性意味着,当数据在对等节点之间更新时,仿制节点之间或许存在很小的不共同距离。

终究共同性并不意味着不共同。它仅仅意味着一种比RDBMS中典型的ACID类型共同性更弱的共同性形式。

一切三个Cassandra,Riak和Voldemort都供给开源的Amazon Dynamo功用。

Cassandra和Riak在他们的行为和特点方面表现出双重性质。

Cassandra拥有Google Bigtable和Amazon Dynamo的特点。

Riak 既充任键/值存储,又充任文档数据库。

文档数据库

文档数据库不是文档办理体系。一般情况下,从NoSQL开端的开发人员会将文档数据库与文档和内容办理体系混淆。文档数据库中的word文档表明文档中结构松懈的键/值对集,一般是JSON(JavaScript目标表明法),而不是文档或涂抹酱(虽然这些也能够存储)。

文档数据库将文档视为一个整体,防止将文档拆分为其组成称号/值对。在调集等级,这答应将一组不同的文档组合到单个调集中。文档数据库不只答应依据其主要标识,还答应依据其特点对文档编制索引。

目前有几种不同的开源文档数据库可用,但可用选项中最突出的是MongoDB和CouchDB。


本文正在参加「技能专题19期 闲谈数据库技能」活动