迄今为止,发展成熟并且得到最广泛应用的数据库类型是关系数据库(RDBMS)。

数据库系统架构读书笔记-概述_big data


让我们来考虑这样一个简单却很典型的数据库在机场的应用实例:查询某次航班的所有旅客名单。这个操作所引发的的查询请求大致按如下方式被处理:

1、机场登机口的 PC 机(客户端)调用 API 与 DBMS 的客户端通信管理器(Client

Communications Manager)建立网络连接。在一些情况下,客户端直接通过 ODBC 或 JDBC连接协议与数据库服务器建立这种连接。这种处理方式被称为“两层”或者“客户端-服务器”。还有一些情形中,客户端与“中间层服务器”建立连接,如 web 服务器、事务处理系统等,它们通过协议代理原本直接建立在客户端与数据库服务器之间的连接,这被称为“三层”模式。在一些网络应用中,还会再多一个应用服务器架设于网络服务器和 DBMS 之间,这被称为“四层”模式。为了适用于如此多的环境,一个 DBMS 需要兼容许多不同客户端以及中间系统的多种连接协议。不过实际上,DBMS 中负责多种协议的管理器基本上是相同的:为调用者(客户端或者中间件)建立连接并记录其连接地址,对客户端的 sql 语句做出回应,并在适当的时候返回数据以及控制信息。在本文例子中,通信管理器还将为客户端建立安全证书,为新的连接细节以及客户端 sql 命令分配空间,并将客户端的请求传送到 DBMS 更底层进行处理。

2、在收到客户端的第一个请求之后,DBMS 必须为之分配一个计算线程。系统必须确保该线程的数据以及控制输出是通过通信管理器与客户端连接的。这些工作交由 DBMS 的进程管理器(Process Manager)来管理(图 1-1 左)。在这一部分中,DBMS 所做的主要工作是准入控制,即系统是否应该立即处理该查询,或是等待系统有足够资源时再处理该查询。我们将在第二章详细介绍进程管理器。

3、在分配控制进程之后,登机口的查询便可以被处理了。处理工作借助于关系查询处理器(Relational Query Processor,图 1-1 中间部分)中的代码来实现。这些模块检查用户是否有权进行该查询,然后将用户的 sql 查询语句编译为中间查询计划。在编译之后,结果查询计划被交给查询执行器。查询执行器包含一系列处理查询的操作(关系型算法实现)。典型的处理查询任务的操作包括:连接、选择、投影、聚集、排序等等,当然也包括从底层读取需要的数据。在我们的例子中,包括优化查询的操作在内,调用了一个操作集合来解决用户的查询问题。在第四章我们将讨论查询处理问题。

4、在登机口代理的查询计划的底层,由若干操作从数据库请求数据。这些操作通过调用(call)来从 DBMS 的存储管理器(transactional storage manager,图 1-1 底部)中收集数据;存储管理器负责所有的数据接口(读)和操作调用(建立、更新、删除)。存储系统包括用于管理磁盘数据的基本算法和数据结构,比如基本的表和索引。它还包括一个缓冲管理器,用来控制内存缓冲区和磁盘之间的数据传输。回到我们的例子中,在获取数据的过程中,登机口客户端的查询必须调用事务管理代码来保证“ACID”性质(将在第 5.1 节讨论)。在获取数据之前,需要通过锁管理器来确保并发情况下运行的正确性。如果登机口客户端的查询包含对数据库的更新操作,那么,它需要与日志系统进行交互,来确保更新操作的持久性以及撤销操作的完整性。在第 5 章,我们会讨论存储与缓冲管理的更多细节,弟 6 章介绍业务一致性结构。

5、在查询的这一时期,查询操作已经开始获取数据并准备好用它们来为客户端计算结果。这一步通过展开我们之前提到的所有操作的堆栈来完成。访问方法把控制权交给查询处理器,查询处理器将数据库的数据组织成结果元组;结果元组生成后被放入客户通信管理器的缓冲区中,然后该通信管理器将结果发送给调用者。对于较大的结果集合,客户端会发送更多的请求来获取更多的数据,这也导致了通信管理器、查询处理器和存储管理器的循环操作。在我们的例子中,在查询操作的最后,事务结束,连接关闭;事务管理器中的结果被清空,进程管理器释放无用的数据结构,通信管理器将连接状态清空。

我们通过这个查询的例子讨论了 RDBMS 的许多关键组件,但还有一些没有涉及到。图1-1 右边一侧有许多共享组件和工具,它们对于一个功能完整的 DBMS 而言,同样是十分重要的。目录和存储管理器在传输数据时被作为工具来调用,在我们的例子中也是这样。在证、分解以及查询优化过程中,查询处理器都会用到目录。同样,存储管理器也广泛应用于整个 DBMS 运行过程中动态分配和释放内存的场合。在图 1-1 中最右边列出的其余组件,独立运行于任何查询,它们使数据库保持稳定性和整体性。我们将在第 7 章讨论这些共享的组件和工具。