MSSQL · 架構分析 · 從SQL Server 2017發布看SQL Server架構的演變
摘要
美國時間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就是他們愛的結晶。
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
[1]:SQL Server 2017對Linux平台的支持
支持容器化
SQL Server 2017除了支持這些常見的開源Linux平台外,還支持將SQL Server服務跑在容器中,這一點對於需要將SQL Server服務進行容器化管理的用戶來講,非常便利。SQL Server支持的容器產品包括:
Windows Container:微軟自家親兒子,是不遺餘力的毫無疑問支持。
Linux Docker:目前最為火爆的容器技術,當然也是支持的。
內置圖數據庫
SQL Server 2017中內置了關於圖數據的查詢功能,使得圖數據的查詢變得簡單而高效。
2:SQL Server 2017內置圖數據庫的功能
內置機器學習
SQL Server 2017中提供了R語言和Python語言的支持,用戶可以利用列存技術和內存優化表存儲基礎數據,然後利用Python語言本身關於機器學習的天然優勢,來實現深置於數據庫係統內部的機器學習,實時分析,及時決策的目的。
[1]:SQL Server 2017提供機器學習功能
自適應查詢處理
針對於SQL Server Batch Model Processing查詢語句,SQL Server 2017引入了自適應查詢處理機製,使得查詢更加高效。簡單的講就是一邊處理查詢一邊進行優化的策略,而不是傳統的根據統計信息首先生成執行計劃。這樣可以應對很多因為統計信息過時或者統計信息片麵導致的執行計劃不準確的,而影響查詢性能的場景。
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服務本身沒有對係統資源的管理能力。具體的架構圖大致如下所示:
3:SQL Server 2005之前的底層架構圖
這個架構最大的缺點是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後的底層架構圖如下所示:
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部分所示:
有了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的大量應用。
3:引入Drawbridge後的係統架構
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也同樣被修複掉了,具備良好的可維護性。
以上架構圖是比較宏觀的層麵展示,以下是SQL PAL功能更為詳細的描述架構圖:
[1]:SQL PAL詳細架構圖
從這張圖,我們可以清晰的看到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來看,不論是性能和性價比,都有小幅提升,如下截圖:
[1]: SQL Server 2017 TPC-H性能比較
附帶TPC官網公布的性能數據截圖:
微軟內部測試
以下展示微軟內部測試實例,在擁有一台12 TB內存,480個邏輯CPUs的機器上,處理30 TB,2500億條數據的8個字段的3種類型複雜統計匯總查詢,耗時僅用18秒。由此可見,性能還是相當強勁的,截圖留戀:
總結
本篇文章介紹了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章節。
最後更新:2017-10-21 09:04:22