天天看點

SQL Server底層架構技術對比

作者:肚臍眼女孩
背景

資料庫是資訊化的基石,支撐着整個業務系統,發揮着非常重要的作用,被喻為“IT的心髒”。是以,讓資料庫安全、穩定、高效地運作已經成為IT管理者必須要面對的問題。資料庫在底層架構層面需要滿足以下幾點建設要求:

安全和可靠:不能因為伺服器的軟硬體故障導緻資料丢失和業務中斷;

容災:多資料中心間的資料庫同步,某一個資料中心出現故障後,可以在另一個資料中心快速拉起業務;

讀寫分離(報表分離):把接口程式、報表程式、內建平台資料抽取、大資料運算等高消耗的查詢語句分離到備機執行,進而避免對主伺服器的性能消耗以及造成的阻塞和死鎖;

負載均衡:需要多台伺服器同時負載并發請求,降低單台伺服器的壓力,提升系統整體性能;

彈性擴充:通過增加伺服器的方式應對資料量或者通路量增加帶來的性能瓶頸。

基于共享存儲的雙機

兩台資料庫伺服器上的SQL Server共享儲存設備中的一份資料庫檔案,為了防止資料混亂,由主節點控制儲存設備,備節點的SQL Server服務處于停止狀态。當主節點出現故障後,備節點接管儲存設備、啟動SQL Server服務、初始化資料庫、接管虛拟IP等資源完成故障轉移,保障資料庫的可用性。SQL Server失敗轉移群集屬于這類技術。

SQL Server底層架構技術對比

資料安全:隻有一份資料,無法保障資料安全。

資料同步驗證:隻有一份資料,無法驗證。可用性:滿足。故障轉移時間:在故障轉移過程中,備節點需要啟動SQL Server服務、初始化資料庫,當資料庫個數多尤其是日志量大的時候,初始化資料庫的時間會變長,導緻切換時間變長,一般的切換時間在20秒以上。讀寫分離:隻有一個節點運作,無法實作。負載均衡:隻有一個節點運作,無法實作。

基于磁盤鏡像的雙機

兩台伺服器中的SQL Server獨立安裝,使用各自磁盤中的資料庫檔案,利用磁盤鏡像技術,主節點磁盤上的資料變化實時同步到備節點的磁盤中。為了防止資料混亂,備節點的SQL Server服務處于停止狀态。當主節點出現故障後,備節點啟動SQL Server服務、初始化資料庫、接管虛拟IP等資源完成故障轉移,保障資料庫的可用性。

SQL Server底層架構技術對比

資料安全:SQL Server層面有兩份資料庫檔案,可以保障資料安全。在大資料量寫入時突然掉電關機的極端情況下,寫入磁盤的SQL Server資料格式不完整導緻SQL Server出現邏輯錯誤,重新開機後資料庫出現質疑,因為兩份資料一模一樣,是以備節點上也會出現相同的現象。

資料同步驗證:備節點上的SQL Server服務是不能啟動的,無法随時進行資料驗證。要想驗證資料,需要對目前時間點做快照,然後啟動SQL Server服務,加載資料庫後進行驗證,驗證後停止SQL Server服務,移除快照,操作非常麻煩,否則就得進行節點切換來驗證,切換時對應用有影響。可用性:滿足。故障轉移時間:在故障轉移過程中,備節點需要啟動SQL Server服務、初始化資料庫,當資料庫個數多尤其是日志量大的時候,初始化資料庫的時間會變長,導緻切換時間變長,一般的切換時間在20秒以上。讀寫分離:隻有一個節點運作,無法實作。負載均衡:隻有一個節點運作,無法實作。

容災

和基于磁盤鏡像的雙機一樣,容災軟體也是利用磁盤鏡像技術,主節點磁盤上的資料變化實時或者準實時同步到容災節點的磁盤中,不同的是基于容災場景下功能的增強,例如傳輸過程中的壓縮和加密,利用快照功能做CDP(資料保護),有的容災軟體也帶有可用性的功能。

存儲雙活

和主機高可用一樣,為了防止儲存設備單點故障而出現的高可用技術,并演化為“雙活”,主要有通過存儲網關同時寫入兩個儲存設備或者儲存設備間資料複制兩種實作方式。和磁盤RAID一樣,存儲雙活對于上層應用來說是透明的,底層資料有兩份,但是對于SQL Server來說還是看到的是一份資料庫檔案。有人認為兩個SQL Server伺服器分别接到配置了雙活的兩個儲存設備上就能實作兩個SQL Server資料庫間的同步,這是一個非常大的誤區。

SQL Server底層架構技術對比

資料安全:底層有兩份資料,可以保障資料安全。對于上層的SQL Server還是一份資料,是以存儲雙活也無法解決在大量資料寫入時突然掉電關機導緻的資料庫質疑問題。

資料同步驗證:SQL Server層面還是一份資料,無法進行資料同步驗證。可用性:隻能保障資料檔案層面的可用性,SQL Server層面的可用性還需要借助其他技術實作。故障轉移時間:取決于SQL Server層面使用的高可用技術。讀寫分離:無法實作。負載均衡:無法實作。

虛拟化\超融合

虛拟化技術是一種資源管理技術,可實作實體層與邏輯層的分離,提高IT基礎設施管理效率和資源使用率。從SQL Server層面來看依然隻有一個節點。超融合是虛拟化技術的延伸,更多的展現在軟硬體一體化,不做過多的介紹,可以當作虛拟化來看待。

資料安全:存儲層面有兩份資料,可以保障資料安全。對于上層的SQL Server還是一份資料,是以也無法解決在大資料量寫入時突然掉電關機導緻的資料庫質疑問題。

資料同步驗證:從SQL Server層面上看隻有一個節點、一份資料庫檔案,無法在SQL Server層面進行資料驗證。可用性:虛拟化技術基本都有高可用功能,當實體伺服器發生故障的時候,受影響的虛拟機将在叢集中留有備用容量的其它實體伺服器上自動啟動。故障轉移時間:搭配進階HA功能的可以做到狀态和資料在主備機間實時同步,故障時快速切換。讀寫分離:SQL Server層面隻有一個節點,不能實作。負載均衡:SQL Server層面隻有一個節點,不能實作。

釋出訂閱

釋出訂閱是SQL Server提供的資料庫複制技術,可用作資料同步、冷備、讀寫分離等。分快照複制、事務複制、對等複制、合并複制幾種方式,這裡用經常使用的事務複制進行說明。事務複制是單向的主從複制,主要有以下特點:

    1. 資料同步是異步的,變更的資料幾秒鐘後才能同步到訂閱伺服器;
    2. 不是整庫的同步,需要對同步的對象(表、視圖、存儲過程、函數等)進行配置;
    3. 參與複制的表要有主鍵,而且不能有TRUNCATE TABLE操作;
    4. 對對象進行DROP操作時,要先從釋出訂閱中移除;
    5. 部署比較麻煩,易出錯。
SQL Server底層架構技術對比

資料安全:在SQL Server層面有兩份或者多份資料,但是資料同步是異步的,有幾秒鐘的延遲,而且不是整庫的同步,丢失資料的風險很高。

資料同步驗證:訂閱伺服器上的資料庫是可以查詢的,可以随時執行SQL語句進行驗證。可用性:沒有虛拟IP位址、自動故障切換等可用性的功能。讀寫分離&負載均衡:訂閱伺服器上的資料庫是可以查詢的,可以把高消耗的報表類的查詢分離到訂閱伺服器中,但是需要修改應用程式實作“讀寫”和“隻讀”兩種資料庫連接配接。負載均衡:需要借助負載均衡軟體或硬體。

AlwaysOn

AlwaysOn是SQL Server 從2012版本開始推出的多個執行個體間同步資料庫的技術,借助Windows失敗轉群集實作高可用,主副本出現故障後,自動切換到輔助副本。輔助副本中資料庫都是可以查詢的,可用來實作讀寫分離、負載均衡等功能。

AlwaysOn中每個副本的SQL Server服務獨立安裝,使用每個副本自己存儲媒體内的資料庫檔案。在主副本寫入資料時會産生日志,AlwaysOn捕獲并傳輸日志到其他副本,并通過REDO技術完成日志到資料的轉換,進而實作各副本中資料的一緻性。有同步送出和異步送出兩種同步方式,不同的副本可以使用不同的同步方式。

SQL Server底層架構技術對比

資料安全:在SQL Server層面有兩份或者多份資料,可以保障資料安全。AlwaysOn同步日志資料時有資料格式的校驗,不會同步不完整的日志,在大資料量寫入時突然掉電關機,主節點資料庫出現質疑時,輔助節點不會。

資料同步驗證:每個節點上的SQL Server服務都是開啟的,資料都是可供使用的,可以随時執行SQL語句進行驗證。可用性:AlwaysOn不支援對執行個體級别的對象同步,例如登入賬号、作業、連結伺服器、系統資料庫對象,需要人工維護,靠人工的方式保障每個副本的一緻性是很困難的。在實踐過程中發現,輔助副本切換成主副本時,因為賬号不對、密碼不對、權限不對、資料庫映射關系不對、作業不對、系統對象不對等各種原因導緻業務系統無法正常使用的情況非常普遍。故障轉移時間:副本轉移時不需要經過資料庫初始化的過程,切換速度快,少于10秒。讀寫分離:輔助副本的資料庫是可以查詢的,可以把高消耗的報表類的查詢分離到輔助副本中。在AlwaysOn下實作讀寫分離,應用程式建立資料庫連接配接時使用的資料庫連接配接字元串中加上“ApplicationIntent=ReadOnly”關鍵詞,AlwaysOn把該連接配接建立到輔助副本。重要的前提是該連接配接裡面所有的SQL語句都必須是隻讀的,如果有更新的SQL語句,就會報錯。也就是說AlwaysOn的讀寫分離是連接配接級的,不是語句級的。很多人認為隻要在資料庫連接配接串中加好這個關鍵詞,不需要改動應用程式就能實作讀寫分離,這是個非常大的誤區。要修改應用程式實作“讀寫”和“隻讀”兩種資料庫連接配接。這個改造過程對于自己研發的産品來說是容易的,如果是購買的第三方産品,難度就可想而知了。負載均衡:SQL Server 從2016版本開始實作了負載均衡,前提是應用程式先實作讀寫分離。AlwaysOn的負載均衡政策是靜态的輪詢機制,不管副本壓力如何,都按照順序輪詢在每個副本中建連接配接。AlwaysOn的排程是連接配接級的,不是語句級的,連接配接建立後,不管該副本壓力如何,連接配接内的語句都要在該副本中執行。

Moebius

Moebius采用“share nothing”架構,每個節點的SQL Server服務獨立安裝,使用每個伺服器自己存儲媒體内的資料庫檔案。不基于共享儲存設備,也不基于磁盤鏡像等功能,通過SQL Server的日志同步技術實作各節點中資料的一緻性。在主節點寫入資料時會産生日志,Moebius捕獲并傳輸日志到其他節點,并通過REDO技術完成日志到資料的轉換。是以每個節點的SQL Server服務都是啟動的,資料都是“活”的。

Moebius的排程引擎支援連接配接級和SQL語句級兩種排程方式,通過規則的配置,在不改動或者少改動應用程式的前提下,透明的完成讀寫分離、負載均衡。

SQL Server底層架構技術對比

資料安全:在SQL Server層面有兩份或者多份資料,可以保障資料安全。Moebius同步日志資料時有資料格式的校驗,不會同步不完整的日志,在大資料量寫入時突然掉電關機,主節點資料庫出現質疑時,輔助節點不會。

資料同步驗證:每個節點上的SQL Server服務都是開啟的,資料都是可供使用的,可以随時執行SQL語句進行驗證。可用性:支援資料庫和執行個體級對象(登入賬号、作業、連結伺服器、系統庫對象等)的同步,滿足真正的高可用。故障轉移時間:節點轉移時不需要經過資料庫初始化的過程,切換速度快,少于10秒。讀寫分離:每個節點上的SQL Server服務都是開啟的,資料都是可供使用的。Moebius的排程引擎支援語句級的解析,隻需要修改應用程式的資料庫連接配接串讓應用程式連接配接到Moebius叢集的端口,在Moebius中配置基于語句特征的相關規則就可以在不修改或者少修改應用程式的前提下實作讀寫分離。Moebius支援SQL語句、登入名、用戶端主機名、應用程式名等多個次元進行規則的配置。負載均衡:Moebius是基于節點壓力狀況的動态負載均衡政策,排程引擎定期緩存每個節點的負載情況(CPU使用率、IO性能名額、請求數等),應用程式執行查詢語句時,排程引擎選擇到壓力較小的節點執行。

總結

從根本上說是通用技術和SQL Server專用技術的比較,如果要實作資料安全和可用性等基本需求,通用技術就能可以做到,如果要實作讀寫分離、負載均衡等進階别的需求,就需要充分利用SQL Server特性而開發的專用技術。并不是說通用技術不好,隻是滿足的場景不同而已,我們要根據實際的場景選擇合适的方案。

SQL Server底層架構技術對比

繼續閱讀