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

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


更好的日志传输性能

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

原文地址:http://blog.51cto.com/ultrasql/2119456

时间: 2024-11-05 22:37:44

AlwaysOn 2016新特性和提升的相关文章

SQL Server -&gt;&gt; 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表)

原文:SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表) 作为SQL Server 2016(CTP3.x)的另一个新特性,Temporal Table(历史表)记录了表历史上任何时间点所有的数据改动.Temporal Table其实早在ANSI SQL 2011就提出了,而SAP HANA, DB2和Oracle早已在它们的产品中加入/实现了这一特性.所以说微软其实是落后了几个竞争对手.既然在CTP3.0中加入了,相信

SQL Server 2016新特性:DROP IF EXISTS

原文:SQL Server 2016新特性:DROP IF EXISTS ?? 在我们写T-SQL要删除某个对象(表.存储过程等)时,一般会习惯先用IF语句判断该对象是否存在,然后DROP,比如: 旧版本: IF OBJECT_ID('dbo.PERSON','U') IS NOT NULL DROP TABLE PERSON IF EXISTS (SELECT * FROM sys.objects where name = 'PERSON') DROP TABLE PERSON SQL Ser

SQL Server 2016新特性:列存储索引新特性

行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可以在创建表的时候创建,也可以在之后的alter table语句上创建.之前内存优化表不支持列存储索引. 聚集的列存储索引可以有多个非聚集行存储索引,之前列存储索引不支持非聚集索引. 支持在聚集列存储索引上加入主键和外键约束,约束使用btree索引. 列聚集索引有一个压缩延迟选项,让事务复合收到的影响最小. 兼容级别为120,130的数据库性能: 列存储索

SQL Server -&gt;&gt; SQL Server 2016新特性之 --- Query Store

前言 SQL Server 2016引入新的查询语句性能监控.调试和优化工具/功能 -- Query Store.以前我们发现一条查询语句性能突然下降,我们要去找出问题的所在往往需要通过调用一些DMV(比如sys.dm_exec_query_stats, sys.dm_exec_sql_text和sys.dm_exec_query_plan)来获取查询计划的一些信息,比如XML格式的执行计划,查询语句的代码,执行了多少次以及一些资源和时间的的使用消耗情况.然后根据这些信息来判断这条语句是否存在性

SQL Server -&gt;&gt; SQL Server 2016新特性之 -- Dynamic Data Masking

Dynamic Data Masking是为了防止敏感数据暴露给未经授权的用户,以一种最小开销和维护成本的形式.Dynamic Data Masking用于表的字段,相当于盖住字段数据的一部分.比如一些像邮件或者工资这样敏感的数据,涉及PII的,我们可以运用这个功能.运用这个功能的步骤,首先先定义一组人(database role)可以拥有看数据的权限,然后GRANT UNMASK权限给这个角色组.微软提供了4种类型的masking给我们选择:default,email,random和custo

SQL Server 2016新特性:Live Query Statistics

SSMS可以提供可以查看正在执行的计划.live query plan可以查看一个查询的执行过程,从一个查询计划操作到另外一个查询计划操作.live query plan提供了整体的查询运行进度和操作级别的执行统计信息,比如产生的行数,执行的时间,操作进度等等.因为这些数据是实时的,不需要等待查询完成,这些统计信息对调试查询性能问题很有用.这个特性从SQL Server 2016开始,但是在2014上也可以运行了. Remark 到SQL Server 2016,有2个方法开启Statistic

SQL Server 2016新特性:In-Memory OLTP

存储格式修改 在2014,2016中修改了内存优化表的存储格式,新的格式是序列的并且the database is restarted once during database recovery. ALTER TABLE日志优化,并且可以并发运行 当你在内存优化表执行ALTER TABLE,只有元数据的修改会被写入日志.这样减少了大量的日志.并且很多ALTER TABLE是并行的,这样可以减少语句运行的时间 但是如果包含LOB,就不能并行运行 统计信息 优化表的统计信息可以自动更新.另外可以通过

SQL Server 2016新特性:数据库级别配置

新的  ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL) 用来配置数据库级别配置. 这个语句可以配置每个数据库的配置: 清理过程cache 设置MAXDOP参数,可以配置primary和secondary 设置查询优化器的评估模式 启动和关闭数据库级别的参数嗅探 启动和关闭数据库级别的查询优化补丁 启动和关闭数据库级别的identity cache 语法: ALTER DATABASE SCOPED CONFIGURATION { {  [ F

SQL Server 2016新特性:Temporal Table

什么是系统版本的Temporal Table 系统版本的Temporal Table是可以保存历史修改数据并且可以简单的指定时间分析的用户表. 这个Temporal Table就是系统版本的Temporal Table因为每行的有效期由系统托管的. 每个Temporal Table有2个显示定义的列,类型是datetime2.这些用来表示有效期.这个列用来标记这个行是不是在期间内可用. 除了上面的period列,l临时表也包含了引用到其他表,系统使用这个表来保存行修改删除前的行版本.这个附加表可