1. 程式人生 > >AlwaysOn 2016新特性和提升

AlwaysOn 2016新特性和提升

數據庫 SQL Server

AlwaysOn 2016新特性和提升


AlwaysOn可用性組作為SQL Server 2012的新特性被引入,它增強了數據庫鏡像和故障轉移集群技術,提供了高可用和災難恢復。


在SQL Server 2016中AlwaysOn有些特性的增強要求運行在Windows Server 2016上。然而,如果你仍然運行在Windows Server 2012 R2上,仍然有很多提升是可用的。


AlwaysOn 2016一些新特性和增強:

  • l 支持更多故障轉移目標

  • l 更好的日誌傳輸性能

  • l 可讀副本的負載均衡

  • l 支持DTC

  • l 數據庫級別的健康監控

  • l 支持組管理的服務賬號

  • l 基本可用性組

  • l 無域可用性組

  • l 分布式可用性組

  • l 支持加密數據庫

  • l 支持SSIS目錄

  • l BI增強


支持更多故障轉移目標

在AlwaysOn 2012和2014,允許最多只能配置2個副本作為自動故障轉移副本(包括當前主副本在內),2016允許配置3個。

自動故障轉移通常用於支持高可用,在故障轉移中同步數據流接近零數據丟失。

技術分享圖片


更好的日誌傳輸性能

隨著高速硬件SSD的普遍使用,提供了更大的吞吐量,這對於寫事務到輔助副本是很重要的。因此,微軟更新了AlwaysOn的數據同步過程,簡化了管道以便有更好的吞吐量和CPU上的更少壓力。性能瓶頸大多數可能發生在日誌捕獲(Log Capture)和重做(Redo)步驟。之前,日誌捕獲和重做步驟使用單線程處理日誌,而現在這些步驟使用多線程並行運行,極大提升了性能。


數據同步描述如下:

Transaction Occurs –> Log Flush –> Log Capture –> Send –> Log Received –> Log Cached –> Log Hardened –> Acknowledgement Sent –> Redo

技術分享圖片


可讀副本的負載均衡

AlwaysOn一個很棒的特性是能夠使用輔助副本用於只讀操作。在AlwaysOn 2016之前的版本,監聽器會定向只讀請求到第一個可用副本,即便你可能有多個輔助副本,並且你可能設置路由表優先將度請求定向到副本3或副本4,而不是副本2。現在AlwaysOn 2016的可讀副本以輪詢的形式暴露給監聽器。


1.配置輔助副本的只讀訪問

ALTER AVAILABILITY GROUP [ag]
MODIFY REPLICA ON N'SQL16N2' WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = READ_ONLY))
GO
ALTER AVAILABILITY GROUP [ag]
MODIFY REPLICA ON N'SQL16N3' WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = READ_ONLY))
GO


2.配置只讀路由URL

ALTER AVAILABILITY GROUP ag MODIFY REPLICA ON N'SQL16N2' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL16N2:1433'));
GO
ALTER AVAILABILITY GROUP ag MODIFY REPLICA ON N'SQL16N3' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL16N3:1433'));
GO


3.SQL Server 2016在只讀路由列表中引入了負載均衡列表

當SQL16N1為主副本角色時,創建只讀路由列表:

ALTER AVAILABILITY GROUP ag MODIFY REPLICA ON N'SQL16N1' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(('SQL16N3', 'SQL16N2'), 'SQL16N1')));


以上路由列表表示在SQL16N3和SQL16N2之間負載均衡只讀連接。我們有兩個嵌入列表:

List 1: 'SQL16N3', 'SQL16N2'

List 2: 'SQL16N1'


按如下方式工作:

1. 路由到第一個列表中的副本

SQL16N3和SQL16N2對只讀連接是可訪問的。第一個只讀連接被路由到SQL16N3,第二個只讀連接被路由到SQL16N2,第三個只讀連接被路由到SQL16N3,第四個只讀連接被路由到SQL16N2,等等,在第一個列表的兩個副本之間使用一個只讀連接的輪詢分發。

2. 如果任一副本不可用了,路由將繼續在第一個列表的副本中

如果SQL16N3或者SQL16N2對於只讀連接變為不可訪問,那麽只讀連接將只被路由到第一個列表的可訪問只讀副本。例如,如果SQL16N3不是synchronized狀態,或者ALLOW_CONNECTIONS被設為NO,那麽所有的只讀連接將會被路由到SQL16N2。只要只讀連接的其中一個服務器可用,那麽只讀連接就不會被路由到SQL16N1。

3. 如果第一個列表中的所有副本都不可訪問,將會路由到下一個列表

對於只讀連接,如果SQL16N3和SQL16N2變為不可訪問,那麽所有的只讀連接將只會被路由到下一個列表的副本,這裏就是SQL16N1。

4. 如果第一個列表中的任一副本可用,將會恢復路由到第一個列表

因為對於只讀連接,可訪問的第一個列表中的輔助副本有更高的優先級,後面的只讀連接將會恰當的連接到他們。


此外配置可用性組路由列表,你也必須確保客戶端的應用連接串當連接到AG監聽器時增加ApplicationIntent參數,值為ReadOnly。如果在客戶端應用連接串中沒有設置,那這個連接將自動定向到主副本。以下是只讀連接串的示例:

Server=tcp:AGListener,1433; Database=AdventureWorks;IntegratedSecurity=SSPI; ApplicationIntent=ReadOnly

也最好不要在相同的負載均衡組中混合同步和異步副本。


支持DTC

註:只有運行在Windows Server 2016或者升級了KB3090973補丁的Windows Server 2012 R2上

如果你的客戶端應用程序需要執行跨多個實例的事務,那麽就需要分布式事務協調器(DTC)。DTC是操作系統的一部分,當你的數據庫引擎執行跨多個實例的事務時,用於確保一致性。

USE AdventureWorks2012;
GO
BEGIN DISTRIBUTED TRANSACTION;
-- your tsql statement here
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION;
GO


你的應用程序不僅可以在多個SQL Server實例間執行事務,也可以在其他兼容DTC服務器中,像WebSphere或Oracle。


用於 AlwaysOn 可用性組和數據庫鏡像的跨數據庫事務和分布式事務。

https://msdn.microsoft.com/en-us/library/mt748186.aspx https://blogs.technet.microsoft.com/dataplatform/2016/01/25/sql-server-2016-dtc-support-in-availability-groups/

https://docs.microsoft.com/zh-cn/sql/database-engine/availability-groups/windows/transactions-always-on-availability-and-database-mirroring?view=sql-server-2017


為了能在AlwaysOn 2016中執行分布式事務,可用性組創建語句CREATE AVAILABILITY GROUP帶有WITH DTC_SUPPORT = PER_DB從句。

CREATE AVAILABILITY GROUP AGSQL2016
WITH (DTC_SUPPORT = PER_DB)
FOR DATABASE [Database1, Database2, Database3]
REPLICA ON
'SQLSRVTST1' WITH — substitute node name
(
ENDPOINT_URL = 'TCP://SQLSRVTST1.<domain>:7022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = AUTOMATIC
),
'SQLSRVTST2' WITH — substitute node name
(
ENDPOINT_URL = 'TCP://SQLSRVTST2.<domain>:7022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = AUTOMATIC
);
GO


數據庫級別的健康監控

在之前的AlwaysOn 2012和2014中,如果實例健康出現問題,將觸發故障轉移。如果有一個數據庫有問題,只要實例OK,可用性組就不會故障轉移。因此,如果你有一個數據庫掉線、異常或損壞,也不會觸發故障轉移。

在AlwaysOn 2016中,不論是一個實例有問題,還是一個或多個數據庫有問題,都會發生故障轉移。然而,這不是默認設置。在創建可用組配置向導,你可以選擇“Database Level Health Detection”復選框來指定。對應的創建可用性組的參數為DB_FAILOVER = ON

技術分享圖片

對於什麽情況下觸發數據庫故障轉移,你也可以調整FailureConditionLevel屬性設置。根據需要調整默認值。可以參考:https://msdn.microsoft.com/en-us/library/ff878667.aspx


支持組管理的服務賬號

在SQL Server 2012,微軟添加了組管理的服務賬號增強,以便服務賬號密碼可以更容易管理。你現在可以為你的SQL Server實例創建一個獨立的服務賬號,在AD中管理密碼、分配代理權限給每個服務器。這個特性對AlwaysOn AG是有用的,因為密碼和訪問特定資源像共享文件的權限,可以通過一個賬號管理,而不是每個實例獨立配置。在AlwaysOn AG中使用組管理的服務賬號比使用通常的域用戶賬號更加安全。

參考:

https://docs.microsoft.com/en-us/windows-server/security/group-managed-service-accounts/group-managed-service-accounts-overview

https://blogs.msdn.microsoft.com/markweberblog/2016/05/25/group-managed-service-accounts-gmsa-and-sql-server-2016/


基本可用性組

AlwaysOn基本可用性組在SQL Server 2016標準版中可用。功能與數據庫鏡像一樣,而數據庫鏡像已經被廢棄,會在將來的版本中被移除。基本可用性組提供了單個數據庫的故障轉移,在組內只可以有兩個副本,數據同步可以是同步或異步模式,在輔助副本不提供只讀訪問和備份支持。創建基本可用性組,可以使用CREATE

AVAILABILITY GROUP語句帶有WITH BASIC從句。
CREATE AVAILABILITY GROUP BAGSQL2016
WITH (AUTOMATED_BACKUP_PREFERENCE = PRIMARY,
BASIC,
DB_FAILOVER = OFF,
DTC_SUPPORT = NONE)
FOR DATABASE [Database1, Database2, Database3]
REPLICA ON
'SQLSRVTST1' WITH -- substitute node name
(
ENDPOINT_URL = ‘TCP://SQLSRVTST1.<domain>.com:5022’,
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
SECONDARY_ROLE (ALLOW_CONNECTIONS = NO)
),
'SQLSRVTST2' WITH -- substitute node name
(
ENDPOINT_URL = ‘TCP://SQLSRVTST2.<domain>.com:5022’,
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
SECONDARY_ROLE (ALLOW_CONNECTIONS = NO)
)
GO

參考:

https://blogs.technet.microsoft.com/msftpietervanhove/2017/03/14/top-5-questions-about-basic-availability-groups/


無域可用性組

註:只可運行在Windows Server 2016上

大多數公司運行在單一域環境,而有些公司運行在多個域環境,可以部署跨多個域的可用性組,以便多臺服務器可以作為DR副本。而有些組織根本沒有運行在域環境。

Windows Server 2016中,WSFC不需要集群節點在相同的域,或者根本不需要域(可以在工作組)。SQL Server 2016現在可以在以下環境部署AlwaysOn可用性組:

  • l 所有節點在單一域

  • l 節點在多個完全信任的域

  • l 節點在多個不信任的域

  • l 節點不在域中

通過去掉集群的域約束,提升了靈活性。參考:https://blogs.msdn.microsoft.com/clustering/2015/08/17/workgroup-and-multi-domain-clusters-in-windows-server-2016/


分布式可用性組

分布式可用性組,可將AlwaysOn AG跨兩個不同的WSFC,來擴展AG。

分布式 AG 也是另一種遷移到新配置或升級 SQL Server 的方法。 因為分布式 AG 在不同體系結構上支持不同的基礎 AG,例如,可以從在 Windows Server 2012 R2 上運行的 SQL Server 2016 更改為在 Windows Sever 2016 上運行的 SQL Server 2017。

技術分享圖片

參考:

https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/distributed-availability-groups


支持加密數據庫

在之前版本AlwaysOn允許加密數據庫,然而他們不能通過新建可用性組添加,並且如果切換到輔助副本他們不能被訪問。在SQL Server 2016,可以通過向導添加加密數據庫,並且在故障轉移後可以訪問。這是因為,在創建可用性組時,向導對於每個副本執行了sp_control_dbmasterkey_password,並且使用每個實例的數據庫主秘鑰創建了憑據。在故障轉移後SQL Server會搜索正確的憑據,知道可以解密數據庫主秘鑰。


關於添加加密數據庫到AlwaysOn可用性組有些限制。參考:https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/encrypted-databases-with-always-on-availability-groups-sql-server?view=sql-server-2017


支持SSIS目錄

在SQL Server 2016,你可以像其它數據庫一樣,為了增強高可用和災難恢復,添加SSIS目錄(SSISDB)和它的內容(項目、包等)到AlwaysOn可用性組。


對於添加SSISDB到AlwaysOn可用性組有些特定的先決條件和配置,參考:https://docs.microsoft.com/en-us/sql/integration-services/catalog/ssis-catalog?view=sql-server-2017#always-on-for-ssis-catalog-ssisdb


BI增強

使用AlwaysOn可用性組,數據庫倉庫負載指向一個或者多個可讀輔助副本,而主副本用於支持關鍵業務應用。報表和數據分析是資源密集型應用,因此負載指向非生產服務器可以提高整體性能。另一個增強點是,微軟優化了數據同步進程,在數據倉庫數據同步延時非常低,以致近實時分析成為現實。


結論

最新版的AlwaysOn可用性組提升了功能性、可擴展性、可管理性,並在高可用和災難恢復上更加健壯。


AlwaysOn 2016新特性和提升