《代码的未来》读书笔记——支撑大数据的存储技术之NoSQL

代码的未来说起NoSQL,这里并不是指某种数据库软件叫这个名字。所谓NoSQL,是一个与象征关系型数据库的SQL语言相对立而出现的名词,它是包括键-值存储在内的所有非关系型数据库的统称。

P237

RDB的极限

在大规模环境中,尤其是作为大流量网站的后台,一般认为关系型数据库在性能上存在极限,因为关系型数据库必须遵守ACID特性。

ACID是Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)这四个单词首字母的缩写。

所谓Atomicity,是指对于数据库的操作只允许“全部完成”或“完全未做改变”这两种状态中的一种,而不允许任何中间状态。因为操作无法进行进一步分割,所以用了“原子”这个词来表现。

所谓Consistency,是指数据库的状态必须永远满足给定的条件这一性质。当某个事务无法满足给定条件时,其执行就会被取消。

所谓Isolation,是指保持原子性的一系列操作的中间状态,不能由其他事务进行干涉这一性质,由此可以保持隔离性而避免对其他事务产生影响。

所谓Durability,是指当保持原子性的一系列操作完成时,其结果会被保存并且不会丢失这一性质。
当数据量和访问频率增加时,ACID特性就成了导致性能下降的原因,因为随着数据量和访问频率的增加,维持ACID特性所带来的开销就会越来越明显。

例如,为了保持数据的一致性,就需要对访问进行并发控制,这样则必然会导致能接受的并发访问数量下降。如果将数据库分布到多台服务器上,则为了保持一致性所带来的通信开销也会导致性能下降。

当然,如果以适当的方式将数据库分割开来,从而在控制访问频率和数据量方面进行优化的话,在一定程度上可以应对这个问题。在大规模环境下使用关系型数据库,一般有水平分割和垂直分割两种分割方式。

所谓水平分割,就是将一张表中的各行数据直接分割到多个表中。例如,对于像mixi这样的社交化媒体(SNS)网站,如果将用户编号为奇数的用户信息和编号为偶数的用户信息分别放在两张表中,应该会比较有效。

相对地,所谓垂直分割就是将一张表中的某些字段(列)分离到其他的表中。用SNS网站举例的话,相当于按照“日记”、“社区”等功能来对数据库进行分割。

通过这样的分割,可以对单独一个关系型数据库的访问量和数量进行控制。但是这样做,维护的难度也随之增加。

P237

NoSQL数据库的解决方案

NoSQL之所以受到关注,就是因为它可以成为解决关系型数据库极限问题的一种方案。和关系型数据库相比,NoSQL数据库具有以下优势:

  • 限定访问数据的方式

在大多数NoSQL数据库中,对数据访问的方式都被限定为通过键(查询条件)来查询相对应的值(查询对象数据)这一种。由于存在这样的设定,就可以实现高速查询。而且,大多数NoSQL数据库都可以以键为单位来进行自动水平分割。

此外,也有像memcached这样不永久保存数据,只是作为缓存来使用的数据库。这也算是一种对数据库访问方式的限定吧。

  • 放宽一致性原则

要保持大规模数据库,尤其是分布式数据库的一致性,所需要的开销十分显著。因此大多数NoSQL数据库都遵循“BASE”这一原则。

所谓BASE,是Basically Available、Soft-state和Eventually consistent的缩写,ACID无论在任何情况下都要保持严格的一致性,而实际上数据不一致并不会经常发生,因此BASE比较重视可用性(Basically Available),但不追求状态的严密性(Soft-state),且不管过程中的情况如何,只要最终能够达成一致性即可(Eventually consistent)。

如果遵循BASE原则,那么用于保持一致性的开销就可以得到控制,而标榜ACID的关系型数据库则很难做出这样的决断。

P238

形形色色的NoSQL数据库

NoSQL数据库只是一个统称,其中包含各种各样的数据库系统。大体上,可以分为以下三种:

  • 键-值存储数据库
  • 面向文档数据库
  • 面向对象数据库

键-值存储是一种让键和值进行关联的简单数据库,查询方式基本上限定为通过键来进行,可以理解为在关系型数据库中只能提供对“拥有特定值的记录”进行查询的功能,而且还是有限制的。在UNIX中从很早就提供的DBM这种简单数据库,从分类上来看也可以算作键-值存储,但是在NoSQL这个语境中,所谓键-值存储一般都指的是分布式键-值存储系统。符合这样条件的键-值存储数据库包括“memcached”、“ROMA”、“Redis”、“TokyoTyrant”等。

所谓面向文档数据库,是指对于键-值存储中“值”的部分,存储的不是单纯的字符串或数字,而是拥有结构的文档。和单纯的键-值存储不同,由于它可以保存文档结构,因此可以基于文档内容进行查询。
举个例子,一张会员订单包括姓名、地址和电话号码,现在要从中查找一个名字叫“松本”的会员。也许乍看之下这和关系型数据库的应用方式是一样的,但是不同之处在于,在面向文档数据库中,对于存放会员信息的文档来说,每个会员的文档可以是不同的。因此要查找名字叫“松本”的会员,实际上相当于对“具备名字这个属性,且该属性的值为松本的文档”进行查询。这种情况下的文档,通常采用的是XML(eXtended Markup Language)和JSON(JavaScript Object Notation)格式。面向文档数据库包括CouchDB、MongoDB以及各种XML数据库等。

所谓面向对象数据库,是将面向对象语言中对象直接进行永久保存,也就是当计算机断电关机之后对象也不会消失的意思。键-值存储和面向文档数据库给人的感觉还像是个数据库,但大多数面向对象数据库看起来只是将一个对象进行永久保存的系统而已。当然,面向对象数据库也提供对对象的查询功能。面向对象数据库的例子有Db4o、ZopeDB、ObjectStore等。

P239

发表评论

您的电子邮箱地址不会被公开。