Architechure of a Database System翻译一

数据库系统的架构

Joseph M.Hellerstein, Michael StoneBraker and James Hamilton

  1. University of California Berkeley, USA, [email protected]
  2. Massachusetts Institute of Technology, USA
  3. Microsoft Research, USA

摘要

  数据库管理系统(DBMS)是一个无处不在且至关重要的现代计算的组成部分,是学术界和工业界数十年的研究和发展成果。从历史上看,数据库管理系统是最早发展的多用户服务系统之一,因此开创了许多具有可拓展性和可靠性的系统设计技术,这些技术至今也在许多其他的环境中被使用。虽然许多数据库使用的算法和抽象理论已经是教科书中的材料知识,但是仍然有一些在系统设计论题论文中覆盖相对较少的内容支持着数据库系统运行。这篇论文展示了一些数据库管理系统的设计原则,包括处理模型,并行架构,存储系统设计,事务系统应用,查询处理器,优化器架构,以及典型的共享组件和工具的讨论。本文用成功的商业和开源系统作参考,尤其是已经被不同团体采用的多个可选的设计。

介绍

  数据库管理系统是复杂的,任务关键型的软件系统。今天的数据库管理系统包含了数十年的学术界和工业界的研究以及激烈的企业软件发展。数据库管理系统是最早部署的在线服务器系统之一,因此,它开创了许多设计方案的先河,不仅在于数据管理,还在于应用,操作系统和网络服务。早期的数据库管理系统在计算机科学中是最具有影响力的软件系统之一,它开创的思想和实施部署的问题被广泛复制和重新改造。

  数据库系统结构的课程应该被广泛开设,然而出于各种原因,却没有被广泛开设。首先是因为应用数据库系统的社区非常小。市场力量仅支持几个高端的竞争对手,所以只有少数几个成功的数据库系统存在。参与数据库系统开发和应用和的人群也很少:许多人来自同样的学校,在具有同样影响力的项目中做研究,合作了相同的商业产品。其次,数据库系统的学术经常忽略架构问题。数据库系统的教科书演示例行地集中在了算法和理论问题,这些传授,学习和测试都很自然但是缺少全面实现系统架构的整体讨论。由此,许多关于如何构建数据库系统的传统智慧是可用的,但很少被记录或者是广泛传播。

  在本篇论文中,我们试图去捕捉现代数据库系统的主要的架构层面,讨论一些高级的主题。一些出现在本论文中的文献,我们在适当的地方提供参考手册。其他的一些问题有些藏在了手册之中,有些则是社区中简单的口头传统。我们在适当的地方使用商业的和开源的系统作为讨论的不同架构形式的例子。然而,由于篇幅原因,我们不能枚举基于百万行代码找到解决问题的方法和细微的更好的差别,其中多数的代码已经是十多年前的。我们的目标集中在教科书中通常不讨论的总体的系统设计和压力问题,以提供更多广为人知的算法和概念可以应用的有用的场景。我们假设读者们熟悉数据库系统教科书的内容(例如:[72]和[83])和现代操作系统的基本功能比如UNIX,LINUX以及Windows操作系统。在下一个章节介绍完高级的数据库管理系统的架构,我们在章节1.2的每一个部分都提供了一系列背景阅读资料。

1.1 关系型系统:查询的生命周期

  如今在生产中最成熟和广泛被使用的数据库系统是关系数据库管理系统。可以在世界上许多应用程序的基础设施核心中找到这个系统,仅举几例:电子商务,医疗记录,计费,人力资源,工资单,顾客管理和应用链管理。网络商务和社区网站的出现仅提高了使用他们的广度和深度。关系型系统是几乎所有在线交易和绝大多数的在线内容管理系统(blogs, wikis, 社交网络等)背后的记录存储库。除了作为重要的软件基础设施,关系数据库系统还作为未来拓展的或者具有革命性改变的新数据库系统的一个众所周知的参考点。因此,我们通过本论文来专注探讨关系型数据库系统。

图.1.1 DBMS的主要组成

  从本质上说,一个典型的RDBMS有五个主要的组件,就像是图1.1中显示的那样。作为对每个组件和它们组合在一起如何工作的介绍,我们逐步进入数据库系统的查询生命周期。这也是下面章节的一个预览。

  考虑机场里的一个简单但是经典的数据库交互,一个登机门的经理点击一个表格来获取一个航班的乘客列表。点击按钮触发了一个单查询的事务,大致如下工作:

  1. 机场登机门的电脑(客户端)调用api,这个api可以轮流通过网络和DBMS的客户端通信管理器建立连接(图1.1的顶部)。在某些情况下,这个连接直接建立在客户端和数据库服务器上,比如通过 ODBC 或 JDBC 连接协议。这个安排被称作“双层”或者是“客户端——服务端”系统。其他情况下,客户端也许会通过一个“中间层服务器”(一个web服务器,事务处理监视器这类组件),这个组件使用一个协议来代理客户端和DBMS的通信。这通常被称为“三层”系统。许多基于场景的网站在web服务器和DBMS中间还有另外一种应用服务器层,产生了四层。考虑到这些不同的选项,一个典型的DBMS需要和不同的客户端驱动以及中间系统所使用的许多不同的连接协议相兼容。然而,从基本来看,DBMS客户端连接管理器的职责在所有这些连接中都是相同的:建立和记住调用者的连接状态(不管是客户端还是中间服务器),回应调用者的SQL命令,并且视情况返回数据和控制信息(结果,代码,错误等等)。在我们的简单的例子中,连接管理器将建立和客户端的安全凭证,设立状态并记住一个新的连接的细节和当前调用的SQL命令,并转发客户端的第一个请求深入到DBMS以被处理。
  2. 一旦接收到客户端的第一个SQL指令,DBMS必须分配一个计算线程给这条指令。它必须保证这个线程的数据和控制输出是通过通信控制器连接到达客户端的。这些任务称作是DBMS的处理管理器的job(图1.1的左侧)。DBMS在查询阶段需要做的最重要的决定是关于准入控制:系统是否应该立刻开始处理查询,还是推迟查询,直到足够多的系统资源可用。我们在第二部分讨论处理管理器的细节。
  3. 客户端的查询一旦准入并被分配一个控制线程,查询将开始执行。它通过调用关系查询处理器中的代码开始查询(图1.1的中央)。这一系列的模块检查用户是否有权限进行查询,并且编译用户的SQL文本指令为内部查询计划。一旦编译,生成的查询计划交由计划执行器执行。计划执行器包含一组运算符以执行任何查询(关系型算法实现)。典型的运算符实现了关系型查询任务包括:join, where, select, aggregation, sorting等等,以及从底层获取数据记录的调用。在我们的示例查询中,这些运算符的一个小的子集,被查询优化器组装,然后被调用以满足查询。我们将在第四部分探讨查询处理器。
  4. 在这个查询计划的基础上,一个或者多个操作符被使用来从数据库获取数据。这些操作符创建调用从管理着所有数据获取(read)和数据操纵(create, update, delete)的事务存储管理器(图1.1的底部)中取回数据。这个存储系统包括了用来在磁盘上组织和获取数据的算法和数据结构,像基本的结构像表和索引。也包括一个决定在什么时候什么样的数据可以在磁盘和内存缓冲之间传输的缓存管理器模块。回到我们的例子,在数据获取方法去获取数据的过程中,查询必须调用事务管理的代码以保证众所周知的事务“ACID”属性[30] (将在5.1节中讨论更多的细节)。在得到数据前,必须从锁管理器获得锁来确保本命令在当前其他并发的查询中可以正确地执行。如果查询涉及到了对数据库的更新,它将和日志管理器交互以确保提交的事务可持久化,并且若操作中止则更改可撤销。在第五节中,我们讨论存储和缓存管理器的更多细节。第六节中涉及事务一致性架构。
  5. 在示例查询的生命周期的这个时候,它已经开始了获取数据记录,并且正准备使用它们为客户端计算结果。这是由“展开堆栈”做到目前为止我们描述的活动的。获取方法将控制权返回给查询执行器的操作符,它编排从数据库数据计算得到的结果元组。生成的元组被放置在了客户端管理器的缓存中,它将把结果送回给调用者。对于大型的结果集,客户端通常会多次调用以逐步从查询中获取更多的数据,导致多次访问通信管理器,查询执行器和存储管理器。在我们这个简单的示例中,查询的最后,事务完成,连接关闭。然后事务管理器清除事务的状态,进程处理器清理查询的控制结构,通信管理器清理连接的状态。

  我们对这个示例查询的讨论触及了RDBMS的许多关键组件,但并不是全部。图1.1右侧描述了一系列的共享组件和工具,他们对一个具有完全功能的DBMS的操作所至关重要。目录和内存管理器在任何的事务中都被当做工具调用,包括我们的示例中。目录由查询处理器使用以进行身份验证,解析和查询优化。每当需要分配内存和释放内存的时候内存管理器就会被使用。剩下的模块在图1.1的右侧的框中列出,他们作为工具独立运行于任何特定的查询,使得数据库保持整体的良好调整性和可靠性。我们将在第七节中探讨这些共享组件和工具。

你可能感兴趣的:(Architechure of a Database System翻译一)