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

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

    clip_image002

     

    更好的日志传输性能

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

    数据同步描述如下:

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

    clip_image004

     

    可读副本的负载均衡

    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

    clip_image006

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

    clip_image008

    参考:

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

  • 相关阅读:
    Redis:五、Redis持久化
    Redis:四、jedis连接redis服务器
    Redis:三、Key和Value
    php 拆分的 string里包含“2”或“1”符号(“”或者“”)
    清除float浮动
    js 判断数据类型
    form表单里target属性(在新窗口打开页面)
    think PHP5实现文件下载
    echarts自定义提示框内容
    Chrome浏览器不支持小于12px的字体大小
  • 原文地址:https://www.cnblogs.com/proxyz/p/14008333.html
Copyright © 2020-2023  润新知