跳到主要内容

背景(Background)

由 Michael Stonebraker 介绍

被选中的读物


Joseph M. Hellerstein and Michael Stonebraker. What Goes Around Comes Around. Readings in Database Systems, 4th Edition (2005).

Joseph M. Hellerstein, Michael Stonebraker, James Hamilton. Architecture of a Database System. Foundations and Trends in Databases, 1, 2 (2007).


这两篇文章写作于十年之前,真让我感到惊讶!毕竟他们深度剖析的数据模型,在短短数年之内,其细节就出现了巨大的变化,而围绕着数据模型这个领域,最让人吃惊的就是,人们似乎从来都不能够从历史当中汲取教训。因此我们首先就将围绕数据模型这方面的文章展开讨论。

十年以前,xml 是最为流行的模型。软件供应商们专注于向他们的关系型引擎中,加入xml相关的功能特性。而在工业级的数据分析人员(以及许许多多的研究人员)当中,XML 普遍被视作为“业界的下一件大事”(the next big thing)。可在十年之后,可以看到,xml已经变成了小众的产品,而领域内的目光,已然移步到其它的事情之上。就我本人(以及文章中做出的预测)来看,xml文档走向衰落,其原因归纳为如下:

  1. 复杂性过高(以至于没有人可以理解)
  2. 对于关系模型的拓展过于复杂,且在真实应用中表现并不出色
  3. 没有广泛的可信应用案例

而具有一点讽刺意味的是,文章中觉得的,x 将通过对 xml 文档的简化而摘下图灵奖的这个预测,如今已经被证明完全错误。关系型数据模型再次取得了胜利,而 xml 则输掉了战争。

当然,这可没有阻挡“新人们”重新发明轮子。当下的挑战者已经变成了 Json,它可以采用下面的三种方式,来进行查阅:

  1. 一种通用的分层数据格式。任何赞同这种观念的人,可以阅读 IMS 文章当中有关数据模型的部分
  2. 一种稀疏数据的表示方法。请让我们来想象一组有关雇员的属性,并假定,我们希望记录雇员们的爱好。而对于每一类爱好,我们所做的数据记录,都会有所差异,且基本上非常稀疏。尽管在关系型数据库当中,为“爱好”做出建模非常简单,然而它会导致相当庞大的,且十分稀疏的数据表。对于基于磁盘存储的行数据而言,这种做法无疑意味着一场灾难,不过对于按列存储的数据而言,这种做法却工作良好。而在前面的那种情况下面,Json 将会成为一种可靠的,适合于记录“爱好”的数据列的选择,且最近有一些不同种类的关系型数据库也提供了对于 Json 数据类型的支持
  3. 一种“读取时架构”(schema on read)的机制。就生产实践而言,这种模式非常广阔也相当稀疏,而基本上所有的用户们都非常期待,可以对这种模式作一些投影。也就是,当我们从广阔的,稀疏的数据模式读取数据的时候,某个用户可以直接表达出,他希望在运行时能够查询出来的内容。就概念上而言,这无非就是一种投影的操作。所以,“读取时架构”,只是一种对于 Json 编码数据的关系型操作

总而言之,Json 是一种稀疏数据方面的可靠选择。而融合历史方面的情况来看,我期待它可以做出许多方面的拓展;但在另外一个方面,我又认为,作为一种通用的分层数据格式,Json 正在演变为一场灾难。我相当期待关系型数据库系统,能够就只把 Json 归纳为他们当中的一种数据类型。换而言之,对于编码那些备用的关系型数据而言,Json 是一条可靠的途径。

一件不容置疑的事情就是,下一版本的红皮书,必将抛弃一些仅仅只是立足于前人脚趾,而非肩膀上的人所发明出来的新分层数据格式。

在过去十年间引发了业界许多讨论的另外一种数据模型,就是 Map-Reduce,它是 Google 为顺利支持他们的互联网爬虫数据(web crawl data base)而建造出来的。然而就在几年以后,Google 选择停止为自家应用程序使用 Map-Reduce,而是使用 Big Table 来做替代。而目前,世界上许多其他地方的人,开始看到了 Google 早些时候发现到的事情: Map-Reduce 并不是一种具备广阔延伸性的应用体系架构。与之相对的,Map-Reduce 的市场已经逐渐向着 HDFS 的市场而做延伸,同时似乎计划进军关系型 SQL 市场。举例来说,Cloudera 最近就引入了 Impala,它是一种 SQL 引擎,架构于 HDFS 之上,而非 Map-Reduce。

而到了最近,在HDFS的土地上面,出现了另外一种值得一提的推动力,技即“数据湖”(data lakes)。它以一组被整合起来的数据队列的形式而作为一种合理应用 HDFS 集群的策略被使用(截至目前,绝大多数商业集团公司,已经开始在这一领域投入资源,并希望挖掘出一些对他们有用的事情来)。假以时日,商业公司将会明白,究竟哪一些部分,值得让他们进行清查与处理(数据的管理策略,我们将会在这本书的第十二章节当中,进行讨论)。因此,数据湖在这个时候,更像只是一种“垃圾抽屉”(junk drawer)一样。同样地,我们将会在第五章中,就 HDFS,Spark 与 Hadoop 展开讨论。

简单来说,已然逝去的十年之中,似乎没有人领悟到“转过头来”(comes around)的教训。新的数据模型不断诞生,然而无非就是在数据表上变形为 SQL。而分层模型的再次发明正如我们所的预测那样,走向失败。而假若在下一个十年如果同样类似的场景再度上演,我也不会感到有什么惊讶的。因为人们似乎命中注定,总是在重新发明轮子!

而对于那些就数据库展开深度剖析的文章而言;在短短十年之后,我们就已然发现,数据库的构建方式,已经发生了巨大的变化。好在,即使内部的细节变化繁多,但是文章之中描述的总体架构,依旧贴近当下的实践。由我们所选中的这篇文章,将会描述,绝大多数的历史遗留下来的数据库(如,Oracle,DB2)如何展开他们的工作。回首十年以前,它们是当时十分流行的数据库实现方案。而再看今朝。这些数据库系统,已然变作历史的遗产;而不再一招吃遍天下。就比如,在数据仓库的市场里面,得益于1~2个数量级的性能提升,列存储对文章里面提及的行存储已经做到了完全替代。而在OLTP的世界里面,带有轻量级事务管理引擎特性的内存SQL引擎,正在迅速常态化。我们集中把这些新的变化记录在红皮书的第四章里面。到了今天,已经很难再找到一个充满活力的,行存储模式占优的应用领域。所以,他们理当要被送到“退休软件之家”去。

我们很难想象,“一招吃遍天下”(one size fits all)将会再一次成为主流的架构。大象往往存在着“革新者困境”(innovators dilemma)的糟糕问题。而 Clayton Christiansen 在他撰写的经典著作中指出,传统的软件供应商,很难在不丢失顾客的情况下,转变到新的结构中来。即便如此,大象面向未来的转变已经非常明显。例如,SQLServer 14 版本中,已经配备了至少两种引擎组件(Hekaton 是一种内存 OLTP 系统,而 SQLServer 则是一种历史遗留下来的行存储),并将他们聚合在同一个公共引擎下面。因此,微软公司的战略其实非常清晰,就是不断向常规的解析器中添加新的引擎,以支持数据在不干扰到应用程序运行的情况下,从已经过时的引擎平滑地迁移到新的引擎。不过这种战略的成功与否,依旧有待观察。

不过,这些新的系统的基本架构,持续遵循着我们在论文中提出的解析-优化-执行的结构(parsing/optimizer/executor structure)。除此之外,线程模型与处理器模型,无论是今天还是十年前,都一样地重要。所以,读者不仅仅理当注意到事务控制,故障恢复,查询优化,数据结构及索引的细节依旧处于不断变化的状态,同时也要注意到,数据库的基本结构,依旧保持不变。

除此之外,那些历史遗留系统依旧需要很长时间才可以走向灭亡。而实际上,IMS 依旧被应用到无数的生产用例之中。有鉴于此,我们建议所有数据库领域的同学们,对这款曾经独占鳌头的数据库系统的架构,做一个了解。

更进一步,伴随着计算机体系结构的发展,本文所牵涉的各个方面,很有可能会演变地更加密切相关。就比如说,即将到来的 NVRAM 很有可能为新的架构理念,或者旧结构的二次新生带来机遇。