摘要
使SQL Server在Linux上运行涉及将所谓的平台抽象层(“PAL”)引入SQL Server。该层用于在一个位置对齐所有操作系统或平台特定代码,并允许其余代码库保持与操作系统无关。由于SQL Server在单一操作系统Windows上的悠久历史,它从不需要PAL。实际上,SQL Server数据库引擎代码库对Windows上流行的库提供了许多引用,以提供各种功能。在将SQL Server引入Linux时,我们为自己设置了严格的要求,以便将SQL Server RDBMS的全部功能,性能和规模价值带到Linux。这包括能够在Windows上的SQL Server上运行良好的应用程序在Linux上对SQL Server同样有效的能力。Drawbridge用SQL Server现有的平台层SQL Server操作系统(SOS)来创建我们称之为SQLPAL的东西。为了安全容器的目的,Drawbridge项目提供了底层操作系统和应用程序之间的抽象,SOS提供了强大的内存管理,线程调度和IO服务。创建SQLPAL使得现有的Windows依赖项可以在Linux上使用,借助Drawbridge设计的一部分,专注于操作系统抽象,同时将关键的OS服务留给SOS。我们还在更改SQL Server数据库引擎代码以绕过Windows库并直接调用SQLPAL以获得资源密集型功能。
支持Linux的要求
SQL Server是微软的旗舰数据库产品,其背后有近30年的发展历史。在较高的层次上,下面的列表代表了我们的要求,因为我们设计了使SQL Server RDBMS在多个平台上可用的解决方案:
为了使SQL Server支持多个平台,工程任务本质上是删除或抽象其在Windows上的依赖项。可以想象,经过数十年针对单个操作系统的开发,代码库中存在大量特定于操作系统的依赖关系。此外,代码库是巨大的。SQL Server中有数千万行代码。
SQL Server依赖于Windows开发中常用的各种库及其功能和语义,分为三类:
您可以将它们视为核心库函数,它们中的大多数与操作系统内核无关,只能在用户模式下执行。
虽然SQL Server依赖于Win32和Windows内核,但最复杂的依赖是多年来为了提供新功能而添加的Windows应用程序库。这里有些例子:
这些依赖关系是我们克服的最大挑战,以实现我们的目标,即在Windows和Linux上实现相同的价值和SQL Server之间的高度兼容性。例如,重新实现像SQLXML这样的东西需要花费大量的时间,并且存在不能提供与以前相同的语义的高风险,并且可能会破坏应用程序。完全删除这些依赖项的选项意味着我们还必须删除它们在Linux上从SQL Server提供的功能。如果依赖关系是边缘情况并且仅影响很少的客户可见特征,我们可以考虑它。事实证明,删除它们会导致我们不得不从Linux上的SQL Server中删除大量功能,这违反了我们关于跨操作系统的兼容性和价值的目标。
我们可以采取逐步实现这种重新实施的方法,一点一点地带来价值。虽然这是可能的,但它也会违背要求,因为这意味着Linux和Windows上的SQL Server之间会存在很大的差距。解决方案在于正确的平台抽象层。
跨多个操作系统支持的软件总是具有某种平台抽象层(PAL)的实现。PAL层负责从软件本身抽象底层操作系统及其库的调用和语义。接下来的几节将我们研究的一些技术作为构建PAL for SQL Server的解决方案。
SQL操作系统(SOS或SQLOS)
在SQL Server 2005发行版中,在SQL Server引擎和Windows之间创建了一个称为SQL操作系统(SOS)的平台层。该层负责用户模式线程调度,内存管理和同步(请参阅SQLOS以供参考)。创建SOS的一个关键原因是它允许向客户和支持(动态管理视图/ DMV和扩展事件/ XEvent的子集)提供集中的低级管理和诊断功能。该层允许我们通过非抢先运行并让SQL Server自己进行资源管理来最小化调度执行所涉及的系统调用数。虽然SOS提高了性能并极大地帮助了可支持性和调试,但它没有从上面描述的OS依赖性中提供适当的抽象层,即Windows语义通过SOS进行并暴露给数据库引擎。
在我们将从数据库引擎中完全删除底层操作系统依赖关系的场景中,最好的选择是将SOS扩展到适当的平台抽象层(PAL)。 所有对Windows API的调用都将通过SOS中的一组新等效API进行路由,并且将在SOS底部添加一个新的主机扩展层,以便与操作系统进行交互。虽然这会解决系统调用依赖性,但它对较高级库的依赖性没有帮助。
吊桥
Drawbridge是一个微软研究项目(见Drawbridge)供参考)专注于大幅减少在同一硬件上托管许多虚拟机时产生的虚拟化资源开销。该研究涉及两个想法。第一个想法是“picoprocess”,它包括一个空地址空间,一个代表picoprocess与主机操作系统交互的监视器进程,以及一个允许驱动程序在启动时填充地址空间并实现一个内核驱动程序的内核驱动程序。主机应用程序二进制接口(ABI),允许picoprocess与主机交互。第二个想法是用户模式库操作系统,有时也称为LibOS。Drawbridge提供了一个可用的Windows库操作系统,可用于在Windows主机上运行Windows程序。
我们的需求与Drawbridge研究的最初目标不一致。例如,picoprocess的想法不是将SQL Server移动到其他平台所需要的。然而,有一些突出的协同作用:
还有一些风险和回报权衡:
Technologies | SOS |
Library OS |
Host Extension |
Object Management |
√ |
√ |
√ |
Memory Management |
√ |
√ |
√ |
Threading/Scheduling |
√ |
√ |
√ |
Synchronization |
√ |
√ |
√ |
I/O (Disk, Network) |
√ |
√ |
√ |
认识 SQLPAL
经过调查,我们决定采用混合策略。我们将从Drawbridge合并SOS和Library OS来创建SQL PAL(SQL平台抽象层)。对于SQL Server不需要的库OS的区域,我们将删除它们。要合并这些体系结构,需要在堆栈的所有层中进行更改。
新架构由一组SOS直接API组成,这些API不通过任何Win32或NT系统调用。对于没有SOS直接API的代码,他们将通过托管的Windows API(如MSXML)或NTUM(NT用户模式API - 这是1500+ Win32和NT系统调用)。所有子系统(如存储,网络或资源管理)都将基于SOS,并将在SOS direct和NTUM API之间共享。
该架构提供了一些有趣的特性:
过程模型
下图显示了运行时地址空间的外观。主机扩展只是一个本机Linux应用程序。当主机扩展启动时,它会加载并初始化SQLPAL,然后SQLPAL会启动SQL Server。SQLPAL可以启动软件隔离的进程,这些进程只是在同一地址空间内运行的线程和分配的集合。我们将它用于SQLDumper之类的东西,SQLDumper是一个在SQL Server遇到问题时运行的应用程序,用于收集启发的崩溃转储。
需要重申的一点是,即使这可能看起来像很多层,但SQL Server和主机之间没有任何硬边界。
SQLPAL的演变
在项目开始时,SQL Server建立在SOS上,而Library OS是独立的。最终的目标是将合并的SOS和库操作系统作为SQL PAL的核心。对于公开预览,此合并尚未完全完成,但SQLPAL的核心已被SOS取代。例如,线程和内存已经使用SOS功能而不是原始的Drawbridge实现。
结果是在CTP1版本中运行了两个SOS实例:一个在SQL Server中,一个在SQLPAL中。这很好,因为SQL Server中的SOS实例仍在使用调用SQLPAL的Win32 API。已更改SOS代码的SQLPAL实例以调用主机扩展ABI(即本机Linux代码)而不是Win32。
现在我们正在努力从SQL Server中删除SOS实例。我们正在从SQLPAL公开SOS API。一旦完成,一切都将流经单个SQLPAL SOS实例。
参考:
https://cloudblogs.microsoft.com/sqlserver/2016/12/16/sql-server-on-linux-how-introduction/
https://blog.csdn.net/orchidcat/article/details/78434423
https://blog.csdn.net/qiansg123/article/details/80130733