AlwaysOn 2016 新特性和提升

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个。

自动故障转移通常用于支持高可用,在故障转移中同步数据流接近零数据丢失。

AlwaysOn 2016 新特性和提升

 

更好的日志传输性能

随着高速硬件SSD的普遍使用,提供了更大的吞吐量,这对于写事务到辅助副本是很重要的。因此,微软更新了AlwaysOn的数据同步过程,简化了管道以便有更好的吞吐量和CPU上的更少压力。性能瓶颈大多数可能发生在日志捕获(Log Capture)和重做(Redo)步骤。之前,日志捕获和重做步骤使用单线程处理日志,而现在这些步骤使用多线程并行运行,极大提升了性能。

 

数据同步描述如下:

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

AlwaysOn 2016 新特性和提升

 

可读副本的负载均衡

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

AlwaysOn 2016 新特性和提升

对于什么情况下触发数据库故障转移,你也可以调整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。

AlwaysOn 2016 新特性和提升

参考:

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可用性组提升了功能性、可扩展性、可管理性,并在高可用和灾难恢复上更加健壮。

上一篇:搭建sqlserver AlwaysOn


下一篇:SQL Server 2012实施与管理实战指南 (俞榕刚,朱桦) PDF扫描版[250M]