SqlServer 2016新特性 —— automatic seeding (自动种子设定)究竟是什么

在 SQL Server 2012 和 2014 中,初始化 SQL Server Always On 可用性组中的次要副本的唯一方法是手动执行备份、复制和还原。SQL Server 2016 引入了用于自动初始化次要副本数据库的新功能“自动种子设定” 。 自动种子设定使用日志流传输,使用 VDI 备份并将备份传输到使用endpoints配置的次要副本的每个数据库。 此新特性可以在最初创建可用性组,或将数据库添加到可用性组时使用,并且可与传统可用性组或分布式可用性组一起使用。

 

一、 用前须知

1. 安全性

权限根据要初始化的副本类型有所不同:

  • 对于传统可用性组,必须给从副本上的AG授权,因为它已加入到可用性组。
 ALTER AVAILABILITY GROUP [<AGName>] GRANT CREATE ANY DATABASE;
  • 对于分布式可用性组从AG的主副本,无需额外的权限,因为它已是主副本。
  • 对于分布式可用性组从AG的从副本,必须使用以下命令。从AG的从副本将它通过自己的主副本(即从AG的主副本)进行自动种子设定。
ALTER AVAILABILITY GROUP [<2ndAGName>] GRANT CREATE ANY DATABASE;

2. 自动种子设定对主副本的性能和事务日志影响

在某些情况下,自动种子设定可能不是初始化次要副本的最优选择。 自动种子设定过程中,SQL Server 通过网络执行备份以进行初始化。 如果数据库非常大或者次要副本是远程副本,此过程会很缓慢。 在备份过程中,无法截断这些数据库的事务日志,因此,如果繁忙的数据库初始化过程耗时冗长,则可能导致事务日志大幅增加。 在将数据库添加到具有自动种子设定的可用性组之前,请先评估数据库大小、负载和副本之间的站点距离。

自动种子设定是单线程进程,最多可处理五个数据库。 单线程可能会影响性能,尤其是在可用性组具有多个数据库的情况下。在主实例中,SQL Server 对每个 LUN 使用一个线程来读取更改。 在从实例中,则对每个 LUN 使用一个线程来初始化数据库。

自动种子设定可以使用压缩(默认处于禁用状态)。启用压缩可减少网络带宽并可能减少自动种子设定的传输时间,但也会增大 CPU 使用率。若要在自动种子设定过程中使用压缩,请启用跟踪标志 9567 - 请参阅调整可用性组的压缩

3. 必备条件与磁盘布局

在 SQL Server 2016 中,自动种子设定要求数据和日志文件路径在参与可用性组的每个 SQL Server 实例上均相同。 在 2017 中,你可以使用不同的路径,但是 Microsoft 建议,当所有副本都承载于相同的平台(例如 Windows 或 Linux)时,使用相同的路径。 跨平台可用性组针对副本具有不同的路径。 有关详细信息,请参阅下表。

下表列出了自动种子设定支持的数据磁盘布局示例:

主实例
默认数据路径
辅助实例
默认数据路径
主实例
源文件位置
辅助实例
目标文件位置
c:\data\ /var/opt/mssql/data/ c:\data\ /var/opt/mssql/data/
c:\data\ /var/opt/mssql/data/ c:\data\group1\ /var/opt/mssql/data/group1/
c:\data\ d:\data\ c:\data\ d:\data\
c:\data\ d:\data\ c:\data\group1\ d:\data\group1\

其中主和从副本数据库位置不是实例的默认路径的,不受此更改影响。

主实例
默认数据路径
辅助实例
默认数据路径
主实例
文件位置
辅助实例
文件位置
c:\data\ c:\data\ d:\group1\ d:\group1\
c:\data\ c:\data\ d:\data\ d:\data\
c:\data\ c:\data\ d:\data\group1\ d:\data\group1\

如果混合使用主和从副本上的默认和非默认路径,SQL Server 2017 的行为将不同于之前的版本。

主实例
默认数据路径
辅助实例
默认数据路径
主实例
文件位置
SQL Server 2016
辅助实例
文件位置
SQL Server 2017
辅助实例
文件位置
c:\data\ d:\data\ c:\data\ c:\data\ d:\data\
c:\data\ d:\data\ c:\data\group1\ c:\data\group1\ d:\data\group1\

若要恢复到 SQL Server 2016 和之前版本的行为,请启用跟踪标志 9571。 有关如何启用跟踪标志的信息,请参阅 DBCC TRACEON (Transact-SQL)

二、 使用自动种子设定创建可用性组

1. 图形化界面

使用SQL Server Management Studio(SSMS,版本17或更高版本)创建可用性组,你将看到自动种子设定为默认选项。

选择初始数据同步

2. T-SQL创建

  • 创建终结点

每台服务器需要一个终结点。 以下脚本创建将 TCP 端口 5022 用于侦听器的终结点。 设置 <endpoint_name> 和 LISTENER_PORT 以匹配你的环境并在两个服务器上运行该脚本:

CREATE ENDPOINT [<endpoint_name>] 
    STATE=STARTED
    AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
    FOR DATA_MIRRORING (
        ROLE = ALL, 
        AUTHENTICATION = WINDOWS NEGOTIATE, 
        ENCRYPTION = REQUIRED ALGORITHM AES
        )
GO
  • 创建可用性组

下面的脚本将创建可用性组。在 SQL Server 的主实例上运行。

CREATE AVAILABILITY GROUP [<availability_group_name>]
    FOR DATABASE db1
    REPLICA ON'<*primary_server*>'
    WITH (ENDPOINT_URL = N'TCP://<primary_server>.<fully_qualified_domain_name>:5022', 
        FAILOVER_MODE = AUTOMATIC, 
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, 
        BACKUP_PRIORITY = 50, 
        SECONDARY_ROLE(ALLOW_CONNECTIONS = NO), 
        SEEDING_MODE = AUTOMATIC),
    N'<secondary_server>' WITH (ENDPOINT_URL = N'TCP://<secondary_server>.<fully_qualified_domain_name>:5022', 
        FAILOVER_MODE = AUTOMATIC, 
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, 
        BACKUP_PRIORITY = 50, 
        SECONDARY_ROLE(ALLOW_CONNECTIONS = NO), 
        SEEDING_MODE = AUTOMATIC);
GO
  • 将辅助服务器实例加入到可用性组,并向可用性组授予创建数据库的权限

在 SQL Server 从实例上运行

ALTER AVAILABILITY GROUP [<availability_group_name>] JOIN
GO  
ALTER AVAILABILITY GROUP [<availability_group_name>] GRANT CREATE ANY DATABASE
GO
  • SQL Server 将在辅助服务器上自动创建数据库副本

如果数据库较大,则可能需要一些时间才能完成数据库同步。 如果数据库在为自动种子设定配置的可用性组中,你可以查询 sys.dm_hadr_automatic_seeding 系统视图来监视种子设定进度。 对于处于为自动种子设定配置的可用性组中的每个数据库,以下查询都返回一行。

SELECT start_time,
    ag.name,
    db.database_name,
    current_state,
    performed_seeding,
    failure_state,
    failure_state_desc
FROM sys.dm_hadr_automatic_seeding autos 
    JOIN sys.availability_databases_cluster db 
        ON autos.ag_db_id = db.group_database_id
    JOIN sys.availability_groups ag 
        ON autos.ag_id = ag.group_id

3. 验证自动种子设定

如果创建成功,则将在从副本上自动创建具有下列任一状态的数据库:

  • 已同步(从副本配置为同步模式,且数据已同步)。
  • 正在同步(从副本配置为异步模式,或为同步模式但尚未与主副本完全同步)。

三、 其他主要管理操作

1. 在指定从实例上禁用自动种子设定

在从实例上运行

ALTER AVAILABILITY GROUP [<availability_group_name>] 
    DENY CREATE ANY DATABASE
GO

2. 在现有可用性组上启用自动种子设定

在主实例上运行

ALTER AVAILABILITY GROUP [<availability_group_name>] 
    MODIFY REPLICA ON '<secondary_node>' 
    WITH (SEEDING_MODE = AUTOMATIC)
GO

3. 全局禁用自动种子设定

在主实例上运行

ALTER AVAILABILITY GROUP [<availability_group_name>] 
    MODIFY REPLICA ON '<secondary_node>'   
    WITH (SEEDING_MODE = MANUAL)
GO

四、 监控与诊断自动种子设定

1. 使用系统动态管理视图

  • sys.dm_hadr_automatic_seeding

在主副本上,查询 sys.dm_hadr_automatic_seeding 以检查自动种子设定过程的状态。 对于每个种子设定过程,该视图都将返回一行。 例如:

SELECT start_time, 
    completion_time, 
    is_source, 
    current_state, 
    failure_state, 
    failure_state_desc, 
    error_code 
FROM sys.dm_hadr_automatic_seeding;
  • sys.dm_hadr_physical_seeding_stats

在主副本上,查询 sys.dm_hadr_physical_seeding_stats 以查看当前运行的每个种子设定过程的物理统计信息。 种子设定正在运行时,以下查询将返回多行:

SELECT * FROM sys.dm_hadr_physical_seeding_stats;
  • total_disk_io_wait_time_ms 列和 total_network_wait_time_ms 列可用于确定自动种子设定过程中的性能瓶颈 。 这两列还显示在 hadr_physical_seeding_progress 扩展事件中 。
  • total_disk_io_wait_time_ms 表示在磁盘上等待时备份/还原线程所花费的时间。 该值从种子设定操作开始时逐渐累积。 如果磁盘还未准备好读取或写入备份流,则备份/还原线程转换为睡眠状态,并通过每秒唤醒一次来检查磁盘是否准备就绪。
  • total_network_wait_time_ms 在主要副本和次要副本中具有不同的涵义。 在主要副本中,该计数器表示网络流控制时间。 在次要副本中,该计数器表示还原线程等待可用消息写入磁盘的时间。

2. 使用错误日志诊断

将数据库添加到为自动种子设定配置的可用性组时,SQL Server 将通过可用性组终结点执行 VDI 备份。 完成备份并同步次要副本后查看 SQL Server 错误日志了解相关信息。

可在 SQL Server 日志中看到开始和完成自动种子设定:

SQL Server 日志

3. 使用扩展事件诊断

自动种子设定具有新的扩展事件,用于在初始化过程中跟踪状态更改、故障和性能统计信息。例如,此脚本会创建用于捕获自动种子设定相关事件的扩展事件会话:

CREATE EVENT SESSION [AlwaysOn_autoseed] ON SERVER 
    ADD EVENT sqlserver.hadr_automatic_seeding_state_transition,
    ADD EVENT sqlserver.hadr_automatic_seeding_timeout,
    ADD EVENT sqlserver.hadr_db_manager_seeding_request_msg,
    ADD EVENT sqlserver.hadr_physical_seeding_backup_state_change,
    ADD EVENT sqlserver.hadr_physical_seeding_failure,
    ADD EVENT sqlserver.hadr_physical_seeding_forwarder_state_change,
    ADD EVENT sqlserver.hadr_physical_seeding_forwarder_target_state_change,
    ADD EVENT sqlserver.hadr_physical_seeding_progress,
    ADD EVENT sqlserver.hadr_physical_seeding_restore_state_change,
    ADD EVENT sqlserver.hadr_physical_seeding_submit_callback
    ADD TARGET package0.event_file(
        SET filename=N'autoseed.xel',
            max_file_size=(5),
            max_rollover_files=(4)
        )
WITH (
    MAX_MEMORY=4096 KB,
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
    MAX_DISPATCH_LATENCY=30 SECONDS,
    MAX_EVENT_SIZE=0 KB,
    MEMORY_PARTITION_MODE=NONE,
    TRACK_CAUSALITY=OFF,
    STARTUP_STATE=ON
    )
GO 

ALTER EVENT SESSION AlwaysOn_autoseed ON SERVER STATE=START
GO 

下表列出了与自动种子设定相关的扩展事件:

名称 说明
hadr_db_manager_seeding_request_msg 种子设定请求消息。
hadr_physical_seeding_backup_state_change 物理种子设定备份端状态更改。
hadr_physical_seeding_restore_state_change 物理种子设定还原端状态更改。
hadr_physical_seeding_forwarder_state_change 物理种子设定转发器端状态更改。
hadr_physical_seeding_forwarder_target_state_change 物理种子设定转发器目标端状态更改。
hadr_physical_seeding_submit_callback 物理种子设定提交回调事件。
hadr_physical_seeding_failure 物理种子设定失败事件。
hadr_physical_seeding_progress 物理种子设定进度事件。
hadr_physical_seeding_schedule_long_task_failure 物理种子设定计划长任务失败事件。
hadr_automatic_seeding_start 在提交自动种子设定操作时发生。
hadr_automatic_seeding_state_transition 在自动种子设定操作更改状态时发生。
hadr_automatic_seeding_success 在自动种子设定操作成功时发生。
hadr_automatic_seeding_failure 在自动种子设定操作失败时发生。
hadr_automatic_seeding_timeout 在自动种子设定操作超时时发生。

参考

https://docs.microsoft.com/zh-cn/sql/database-engine/availability-groups/windows/automatic-seeding-secondary-replicas?view=sql-server-ver15

https://docs.microsoft.com/zh-cn/sql/database-engine/availability-groups/windows/automatically-initialize-always-on-availability-group?view=sql-server-ver15

发布了295 篇原创文章 · 获赞 35 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Hehuyi_In/article/details/105027612