MSSQL-架構分析-從SQLServer2017釋出看SQLServer架構的演變

風移發表於2017-11-01

title: MSSQL – 架構分析 – 從SQL Server 2017釋出看SQL Server架構的演變

author: 風移

摘要

美國時間2017年10月2日,微軟正式釋出了最新一代可以執行在Linux平臺的資料庫SQL Server 2017。SQL Server 2017給使用者帶來了一系列的新功能特性的同時,也體現了微軟關於自家關係型資料庫平臺建設方面的最新設計與思考。這篇文章旨在介紹SQL Server 2017新特性,以及微軟是如何從架構層面的演進來快速實現Linux平臺的SQL Server 2017產品。

SQL Server 2017釋出

早在2016年,當微軟宣佈SQL Server將很快在Linux上執行時,這一訊息對使用者、權威人士以及SQL Server從業者來說都是一個巨大的驚喜。果然,微軟不負眾望,在美國時間2017年10月2日,正式釋出了最新一代可以執行在Linux平臺的資料庫SQL Server 2017。近年來隨著各類NoSQL資料庫產品和Hadoop生態的出現與流行,給了傳統關係型資料庫(RDBMS)帶來了巨大的挑戰。從微軟提供Linux版SQL Server這件事情,我們可以詭探出微軟大的戰略轉型:變得更加開放、包容和擁抱變化,而不是像以前一樣與自家的微軟系列生態系統緊密的捆綁在一起。微軟的這種良性轉變,對使用者和SQL Server資料庫從業者來說也是巨大的福音。因此,可以說SQL Server與Linux相愛了,SQL Server 2017就是他們愛的結晶。
01.png

SQL Server 2017新特性簡介

微軟對於新一代資料庫產品SQL Server 2017的釋出,植入了非常多的新特性和看點,重要包括:
對Linux平臺的支援:當然最大的特性是對Linux平臺的支援。
對容器類產品Docker的支援:對容器類產品的支援。
內建圖資料庫:將圖資料庫功能內建到SQL Server引擎中。
內建機器學習功能:對Python語言的支援,大大擴充套件了機器學習功能特性。
自適應查詢處理:全新的Batch Model查詢語句執行方式,邊執行便優化。

支援Linux平臺

SQL Server 2017對Linux平臺的支援,是它最大的看點和進步,說明微軟擁抱變化的決心初現成果。SQL Server 2017支援的Linux平臺包括:
RedHat Enterprise Linux (RHEL)
SUSE Enterprise Linux (SLES)
Ubuntu
02.png

支援容器化

SQL Server 2017除了支援這些常見的開源Linux平臺外,還支援將SQL Server服務跑在容器中,這一點對於需要將SQL Server服務進行容器化管理的使用者來講,非常便利。SQL Server支援的容器產品包括:
Windows Container:微軟自家親兒子,是不遺餘力的毫無疑問支援。
Linux Docker:目前最為火爆的容器技術,當然也是支援的。
03.png

內建圖資料庫

SQL Server 2017中內建了關於圖資料的查詢功能,使得圖資料的查詢變得簡單而高效。
04.png

內建機器學習

SQL Server 2017中提供了R語言和Python語言的支援,使用者可以利用列存技術和記憶體優化表儲存基礎資料,然後利用Python語言本身關於機器學習的天然優勢,來實現深置於資料庫系統內部的機器學習,實時分析,及時決策的目的。
05.png

自適應查詢處理

針對於SQL Server Batch Model Processing查詢語句,SQL Server 2017引入了自適應查詢處理機制,使得查詢更加高效。簡單的講就是一邊處理查詢一邊進行優化的策略,而不是傳統的根據統計資訊首先生成執行計劃。這樣可以應對很多因為統計資訊過時或者統計資訊片面導致的執行計劃不準確的,而影響查詢效能的場景。
06.png

SQL Server架構演進

按照以往微軟對SQL Server資料庫產品的釋出節奏,一般情況下是兩年一個大版本更新迭代,比如SQL Server 2012,2014和2016。但是,SQL Server 2017的釋出僅僅只用了一年時間,而且實現了Linux版本SQL Server的巨大轉變,並且所有功能和Windows版本對齊。很多使用者和從業者對這一點都非常好奇,微軟到底是如何做到這一點的?要回答這個問題,我們從SQL Server底層的架構演進來分析這個問題的答案。總結來看,到SQL Server 2017的出現,微軟對資料庫底層架構的演進經歷了以下幾個階段:
使用Windows對SQL Server系統進行資源管理:這個階段沒有一個特定的名稱叫法,這個階段的SQL Server服務無法突破Windows核心對資源的限制。
SQL OS階段:為了使得SQL Server資料庫擁有更好的效能,SQL OS(也叫SOS)出現了。
Drawbridge的出現:研究性專案,用於實現應用的沙盒(Sandbox),最開始不是為SQL Server專門設計的,但在SQL Server 2017中扮演中非常重要的角色。
SQL PAL的出現:SQL Server 2017整合了SQL OS和Drawbridge,進行底層封裝,形成了SQL PAL層。

SQL Server 2005之前

追述到SQL Server 2005版本之前(SQL Server 2000及更早版本),SQL Server服務是以一個使用者態程式執行在Windows作業系統中,這個服務程式與其他普通的程式沒有任何差異,它依賴於作業系統核心對底層硬體資源進行管理和互動,SQL Server服務本身沒有對系統資源的管理能力。具體的架構圖大致如下所示:
07.png

這個架構最大的缺點是SQL Server服務本身無法突破Windows核心對系統資源使用的限制,換話句話說SQL Server無法榨乾系統硬體資源,加之缺乏對作業系統資源的控制能力,只能依賴於作業系統核心對底層硬體資源進行排程,因此SQL Server服務很難最大限度充分利用系統所有硬體資源,阻礙了SQL Server系統效能的進一步提升。

SQL OS

為了解決上面的問題和獲取更好的效能,微軟花了很大的力氣來抽象一箇中間層對系統硬體資源進行排程和管理,併發布在SQL Server 2005版本中,也因此SQL Server 2005版本經歷了長達5年的時間才得以面世。這個對硬體資源進行集中排程和管理的中間層叫著SQL OS(也叫著SOS)。SQL OS的主要職責包括:Processor Scheduling,Memory Management,Network,Disk I/O使得SQL Server效能最大化(可以使得SQL Server使用者程式最大限度的充分利用作業系統硬體資源)。SQL Server 2005引入了SQL OS後的底層架構圖如下所示:
08.png

SQL Server 2005賦予了SQL OS非常全面的資源管理功能,涉及到資料庫系統核心功能的方方面面,具體包括:
Deadlock Monitor:死鎖監控
Resource Monitor:資源監控
Lazy Writer:延遲寫,將隨機I/O寫,轉化為順序I/O寫
Scheduler Monitor:排程器監控
Buffer Pool:快取池
Memory Manager:記憶體管理
Scheduling:排程
Synchronization Service:同步服務
Lock Manager:鎖管理器
I/O:I/O資源管理
詳細架構如下圖SQLOS API部分所示:
09.png

有了SQL OS層次的抽象,得以在資料庫內部實現對系統資源的集中管理,擺脫系統核心對SQL Server資源使用的限制,使得SQL Server服務隊系統資源有了很強的控制能力,SQL Server 2005效能有了大幅的提升,成了微軟關係型資料庫歷史上劃時代的版本,也為SQL Server 2017能夠提供跨平臺能力提供了可能性,可以毫不誇張的說,沒有SQL OS的出現,微軟不可能在如此短的時間內實現Linux版的SQL Server。

Drawbridge

微軟研究院在2011年9月建立了一個全新的研究性專案,名稱叫Drawbridge,目的是提供應用程式新的虛擬化資源隔離解決方案,減少虛擬資源的使用,使得在同一個硬體主機上,可以執行更多的虛擬機器(類似於Docker產品對硬體資源的管理)。Drawbridge其中一個非常重要的元件Library OS僅依靠約50個底層核心應用二進位制介面(ABI:Application Binary Interface)實現了一千多個常用的Windows API,同時還具備了為其他元件提供宿主的能力,比如:MSXML和CLR等元件。 在Windows 10版本中存在著Drawbridge的大量應用。
10.png

SQL PAL

SQL Server資料庫團隊基於Drawbridge專案與SQL OS兩者進行了必要的重寫和充分的融合,形成了新一代資料庫底層抽象和封裝,叫SQL PAL (Platform Abstract Layer),同時將上層邏輯程式碼移植到SQL PAL之上。如此,微軟只需要確保SQL PAL層可以在Windows平臺和Linux平臺執行良好即可。這樣SQL Server即使執行在Linux平臺,也無需修改SQL Server本身的程式碼,SQL Server自己本身與平臺無關。能做到這一點完全是由Drawbridge中的ABI(Application Binary Interface)來達到目的的,這些ABI我們叫著Host Extension,所以為了支援SQL Server 2017的跨平臺特性,微軟只需要實現基於Windows平臺的Host Extension和Linux平臺的Host Extension,這樣做最大的好處是:
大大縮短開發週期:微軟無需對SQL Server本身做任何的程式碼修改就可以將SQL Server移植到Linux平臺。
產品功能一貫性:對SQL Server新功能、新特性的支援,無需對兩個平臺進行重複開發,Windows平臺支援了,Linux平臺也就支援了,保持了產品功能的一致性。
良好的後期維護性:假如SQL Server存在某個Bug,只需要修復SQL Server本身,那麼Windows平臺,Linux平臺上相應的Bug也同樣被修復掉了,具備良好的可維護性。
11.png

以上架構圖是比較巨集觀的層面展示,以下是SQL PAL功能更為詳細的描述架構圖:
12.png

從這張圖,我們可以清晰的看到SQL PAL層次對於Host Extension的呼叫,以及構建在這層次之上的SQL Server服務,包括:資料庫引擎、整合服務、分析服務和報表服務。

SQL PAL效能影響

提到SQL PAL對SQL Server 2017資料庫服務的影響,很多使用者最為擔憂的應該就是效能的影響了。請不要擔心,根據TPC-H測試來看,SQL Server 2017相對於SQL Server 2016來看,效能不但沒有任何損失,反而效能不降反升。

TPC-H效能測試

從TPC-H測試資料總結來看,相對於SQL Server 2016來看,不論是效能和價效比,都有小幅提升,如下截圖:
13.png

附帶TPC官網公佈的效能資料截圖:
14.png

微軟內部測試

以下展示微軟內部測試例項,在擁有一臺12 TB記憶體,480個邏輯CPUs的機器上,處理30 TB,2500億條資料的8個欄位的3種型別複雜統計彙總查詢,耗時僅用18秒。由此可見,效能還是相當強勁的,截圖留戀:
15.png

總結

本篇文章介紹了SQL Server 2017支援Linux平臺,支援容器化,內建圖資料庫,內建機器學習和自適應查詢處理的功能新特性;同時從底層架構演進的層面分析了微軟能夠在短時間內實現Linux版SQL Server 2017的根本原因是SQL PAL架構中間層的出現,而SQL PAL是站在SQL OS和Drawbridge的肩膀之上的。由此可見,微軟對SQL Server支援Linux平臺在SQL Server 2005版本中已經開始佈局,應該說還是非常具有遠見的。

備註

[1]:圖片來自於微軟Lindsey Allen的培訓“SQL Server 2017 – Power your entire data estate from on-premises to cloud”截圖。
[2]:圖片來自於吳曉晨在雲棲大會上關於“SQL Server 2017”的分享。
[3]:圖片來自於“Everything you need to know about SQL Server 2017”截圖。
[4]:截圖來自於《Inside Microsoft SQL Server 2005_ The Storage Engine, 2005 Edition》Components of the SQL Server Engine章節。


相關文章