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