【IT168 专稿】如果你正在建立新的数据库管理系统或只是想编写出更好的数据库应用程序,你需要明白操作系统和数据库管理的可扩展架构。
多核服务器、NewSQL、云计算和高级分析都需要可扩展的数据库架构。可以通过向数据库加载插件的方法来添加功能,比如添加新的类型,正如我们能够使用加载项扩展Web浏览器。但是现在我们看到插件获得了多种用途的动力。如果你正在创建一个新的数据库管理系统(DBMS)或只想编写出更好的数据库应用程序,你需要明白操作系统和数据库管理的可扩展性架构。
对内核、微内核以及数据库架构的研究,是发掘现代处理器功能的很好的出发点。
处理器工作模式
处理器支持多种工作模式从而在执行时分离系统服务和应用代码。这么设计的目的是为了保护诸如系统软件在内的例程。你不会希望错误的应用代码覆盖操作系统(OS)的某部分。覆盖内存或数据可能会导致崩溃。
上世纪60年代的IBM系统360主机是一个可以分离系统状态和用户状态的处理器。前者用于当程序执行SVC时所提供OS服务的代码;后者指出应用怎样进行正常的工作。
IBM OS/360是在一个在主内存时代设计出来的,那时候拥有512K内存的机器已经是高端的设备了。为了保证操作系统的能力,IBM开发了一个可扩展的系统架构。它支持临时的SVC:内存中临时程序的小规模(2K)专用模块。
所熟知的PDP11系列小型机提供多处理器模式(监管、用户和内核模式);它同样为指令和数据提供了内存空间。Intel Xeon处理器(事实上是386以来的所有Intel处理器)也有三个处理器模式。一个程序可以在真实状态、保护模式或SMM模式中运行。这些处理器架构使我们在编写程序时因为某些关键操作从一个模式切换到另一个模式,例如调用在内核模式中执行的中断服务。一个模式通过并进关联转换转换保持和恢复CPU的状态。表1显示了处理器模式。
▲表1
内存管理机和多处理模式对编程词汇加入了“关联转换(context switch)”一词。在受保护的内存环境中,context指包括可执行代码的虚拟地址空间。例如调用内核模式功能或预占任务的各种活动,将会用来启动关联转换来存储先前执行任务的状态信息和恢复新代码的状态信息。
关联转换是现代系统的组成部分,也是多任务操作的必不可少的部分。对于现在的处理器和操作系统,有更广泛的意义。你能够使用寄存器、任务、线程或进程的关联转换。现在许多处理器为任务状态信息数据分割的转换提供硬件支持。
内核的演变
内核和微内核成为操作系统的核心。因为处理器具有多操作模式或环状系统,内核和微内核可以在特许的状态(监管或内核模式)下运行。
微内核之所以能够发展,其部分原因是单片操作系统的内核逐步变得大而笨重,从而使它们难以维持。实际上它似乎需要对于新的文件系统、协议栈和在内核及内核地址空间之外的设备驱动提供支持。微内核使得操作系统架构开发特权服务——例如网络服务、文件系统服务和显示服务——提供没有建立在内核之上的必要的服务。无需重启,也能够开启和停止,这就易于开发和测试,如果服务器故障,数据也不会损坏。
微内核和单内核哪个是优先选择的架构已经产生分歧,MINIX的Dr. Andrew S. Tanenbaum赞同微内核,而Linus Torvalds在2006年 "Hybrid kernel, not NT" 后选择单内核架构。
Toryalds认为地址空间分离不易于共享数据结构,引入也过于复杂:“微内核不易于编写,正因这个问题使其更难维持。”
OS开发者之间的不同意见,还延伸到管理程序和虚拟社区。Xen和VMWare是微内核架构的例子,而MokaFive和BareMetal却基于单片模式。
${PageNumber}SQL数据库服务
在著名的Tanenbaum-Torvalds讨论之前,SQL数据库社区已经在权衡单片数据库架构同客户-服务器数据处理。后者提出关闭数据库共享,集中主机处理分布式和专用服务。DBMS架构师也同意分离数据库内核与服务、插件或扩展。
随着时间的推移,我们看到SQL平台在Swiss Army Knife的发展。例如,对于数据库引擎核心,做一个副本更加有意义。
当你安装了SQL的高端产品,它采用了分层架构,这个架构在启动时产生一系列服务。在DBMS的服务层包括存储管理、网络接入、锁定管理、复制、安全、查询、缓存管理、内存管理、OLAP服务等等。
对于一个诸如Oracle数据库的产品,内核是服务进程的核心。网络通信映射到层称为TNS,其目的是支持异构连接。一个Oracle服务启动一个TNS监听器使用客户端-服务器协议处理数据库请求。监听器连接到终点(端口号)HTTP、FTP和XML DB请求。监听器将请求转发到其他共享服务器或专用服务器进程。内核使用后台进程,例如进程监视器、系统监视器、日志写入和数据库写入。它还在后台使用例如I/O和并行查询等从进程进行工作。
Oracle内核架构的一个好处是可以提供高级记录。对于调试和调优查询,它可以帮助你查询在执行过程中从内核到其他进程发生了什么。
线程和进程
Oracle数据库架构的线程和进程的不同依赖于Oracle是运行于UNIX还是Windows平台。在UNIX平台上,Oracle数据库使用进程以实现后台任务。操作系统每个会话会产生一个连接数据库进程。客户端进程,例如sqlplus,连接到TNS监听器(tnslsnr),在$ORACLE_HOME/bin/oracle的数据库内核程序中执行fork()和exec()。创建服务进程或非正式进程。
在Windows平台上,对每个Oracle数据实例或SID有一个相应的进程(.exe)。每个后台任务是单个进程内的线程。所有的后台、服务和客户进程都是主Oracle数据库进程的线程并且所有线程共享资源。
Sybase Adaptive Service Everywhere(ASE),连接到数据库等同于分派引擎。在15.7版本之前,Sybase ASE在单独的进程中执行引擎。从ASE15.7开始,Sybase提供线程内核同每个引擎成为一个进程的线程并且引擎通过共享内存来通信。引擎仅仅执行用户任务,而不执行I/O。Sybase在Windows平台上为ASE也使用基于线程的模型。
不断演变的数据库内核
在过去的三十年,SQL平台已经在数据库市场获得了很大的份额。在计算机和软件社区想要建立较好的捕捉器。这并不奇怪,我们已经看到新的架构、新的SQL内核、NoSQL、NewSQL和内存数据库平台的发展。
MySQL的源码基础可以追溯到15年以前。几个因素(现代CPU架构、云计算的发展和Web应用程序)促成重构MySQL为一个轻量级的SQL DBMS。
MySQL的精简版本Drizzle由微内核架构和插件构成。为建立Drizzle,开发者要将代码从MySQL内核迁移到插件中。MySQL找到诸如InnoDB的可插拔的存储引擎。Drizzle将插件扩展到存储引擎、验证、复制、功能引擎、字符串函数、目录函数、模式字典、IPV6、数学运算、多线程调度和其他功能。当Drizzle启动时会载入四十余项默认插件。
另一个有趣的事情是Monet这个主内存数据库内核的发展。Monet来源于Troll,Troll是一个发展了三十年的关系型内核。MonetDB第4版在2004年成为开源的。MonetDB是一个列存储数据库内核,与传统的SQL数据库是不同的。尽管列存储与传统分析和商业智能相关,MonetDB支持ACID。MonetDB有一个代数数据库内核,使它能够灵活的支持包括SQL和XQuery在内的多种查询语言。它基于一个分层架构,提供多个接口以供扩展。提供数学函数、字符串和时间数据类型连接到库的支持。MonetDB现在正在研究并且最近已经发展起来的一个有趣的项目是DataCell,DataCell是一个通过MonetDB所建立的提供过程数据流传感器的项目。
另一个创新来自于McObject的嵌入式数据库eXtremeDB。McObject提供的eXtremeDB-KM,在内核模式进行部署来操作相同的地址空间作为操作系统。这就使得数据结构可以访问内核进程,削减了应用程序所需要的关联转换的开销。
数据库插件
可扩展的数据库管理程序,支持插件、提供给开发者满足应用需要的操作数据库的能力。例如我们可以使用可插入索引和存储引擎。我们也可以载入插件扩展SQL语言,但这是将来文章的主题。
除了Drizzle,我们还了解到其他几个NewSQL平台,代表了关系型数据库的重构。插件和重构给了我们一个提醒,数据库并不是静态技术的例子。