首页 > 数据库 >sqlserver AlwaysOn同步流程与延迟

sqlserver AlwaysOn同步流程与延迟

时间:2023-04-18 13:38:15浏览次数:54  
标签:AlwaysOn log sqlserver ADD hadr EVENT block 延迟


sqlserver AlwaysOn同步流程与延迟_sql

区分异步同步提交的关键就在 Log Hardened 这一步,主副本是否需要确认辅助副本已经完成日志固化后才能提交事务。

异步提交模式

主副本无须确认该辅助副本是否已经完成日志固化,就可以提交事务。但是,辅助数据库的更新可能会滞后于主数据库,如果发生故障转移,可能会导致某些数据丢失。

同步提交模式

主副本必须确认辅助副本已经完成日志固化才可以提交事务,这样就保证从库不会有数据丢失,但是这种保障的代价是主数据库上的事务提交会有滞后时间。另外注意,同步模式保证的是从库不会有数据丢失,而不是保证主从同步没有延迟!!

仅配置模式

SQL Server 2017 CU1 的新功能,适用于不在WSFC上的可用性组。仅配置模式下的副本不包含用户数据,副本主数据库存储可用性组配置元数据。

通过扩展事件跟踪,我们可以知道日志块移动的每个步骤,并且可以确切地知道事务延迟来自何处。

sqlserver AlwaysOn同步流程与延迟_主数据_02

通常,延迟来自三个部分:

  • 主库日志固化的持续时间:它等于Log_flush_start(步骤2)和Log_flush_complete(步骤3)的时间之和。
  • 从库日志固化的持续时间:它等于Log_flush_start(步骤10)和Log_flush_complete(步骤11)的时间之和。
  • 网络传送的持续时间 :primary:hadr_log_block_send_complete-> secondary:hadr_transport_receive_log_block_message(步骤6-7)和(secondary:hadr_lsn_send_complete-> primary:hadr_receive_harden_lsn_message(步骤12-13)的时间之和 

扩展事件创建脚本如下:

/* Note: this trace could generate very large amount of data very quickly, depends on the actual transaction rate. On a busy server it can grow several GB per minute, so do not run the script too long to avoid the impact to the production server.  */

CREATE EVENT SESSION [AlwaysOn_Data_Movement_Tracing] ON SERVER  ADD EVENT sqlserver.file_write_completed, ADD EVENT sqlserver.file_write_enqueued, ADD EVENT sqlserver.hadr_apply_log_block, ADD EVENT sqlserver.hadr_apply_vlfheader, ADD EVENT sqlserver.hadr_capture_compressed_log_cache, ADD EVENT sqlserver.hadr_capture_filestream_wait, ADD EVENT sqlserver.hadr_capture_log_block, ADD EVENT sqlserver.hadr_capture_vlfheader, ADD EVENT sqlserver.hadr_db_commit_mgr_harden, ADD EVENT sqlserver.hadr_db_commit_mgr_harden_still_waiting, ADD EVENT sqlserver.hadr_db_commit_mgr_update_harden, ADD EVENT sqlserver.hadr_filestream_processed_block, ADD EVENT sqlserver.hadr_log_block_compression, ADD EVENT sqlserver.hadr_log_block_decompression, ADD EVENT sqlserver.hadr_log_block_group_commit , ADD EVENT sqlserver.hadr_log_block_send_complete, ADD EVENT sqlserver.hadr_lsn_send_complete, ADD EVENT sqlserver.hadr_receive_harden_lsn_message, ADD EVENT sqlserver.hadr_send_harden_lsn_message, ADD EVENT sqlserver.hadr_transport_flow_control_action, ADD EVENT sqlserver.hadr_transport_receive_log_block_message, ADD EVENT sqlserver.log_block_pushed_to_logpool, ADD EVENT sqlserver.log_flush_complete , ADD EVENT sqlserver.log_flush_start, ADD EVENT sqlserver.recovery_unit_harden_log_timestamps  ADD TARGET package0.event_file(SET filename=N'c:\mslog\AlwaysOn_Data_Movement_Tracing.xel',max_file_size=(500),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

下面是捕获的xevent截图

主库:

sqlserver AlwaysOn同步流程与延迟_主数据_03

从库:

sqlserver AlwaysOn同步流程与延迟_sqlserver_04

您可能会注意到hadr_receive_harden_lsn_message的log_block_id(146028889512)与其他(146028889488)不同。这是因为返回ID始终是强化日志块的下一个即时ID,我们可以使用hadr_db_commit_mgr_update_harden xevent来关联xevent。

sqlserver AlwaysOn同步流程与延迟_服务器_05

通过上面的xevent日志,可以获得事务提交的详细时间延迟:

From

To 

Latency

Network: Primary->Second 

Primary: hadr_log_block_send_complete 2018-03-06 16:56:28.2174613  

Secondary: hadr_transport_receive_log_block_message 2018-03-06 16:56:32.1241242 

3.907 seconds 

Network: Secondary->Primary 

Secondary:hadr_lsn_send_complete 2018-03-06 16:56:32.7863432 

Primary:hadr_receive_harden_lsn_message 2018-03-06 16:56:33.3732126  

0.587 seconds 

LogHarden(Primary) 

log_flush_start 2018-03-06 16:56:28.2168580 

log_flush_complete 2018-03-06 16:56:28.8785928  

0.663 seconds 

Log Harden(Secondary) 

Log_flush_start 2018-03-06 16:56:32.1242499 

Log_flush_complete 2018-03-06 16:56:32.7861231  

0.663 seconds 

为了获得总的事务延迟,我们不能简单地将它们汇总起来,因为主数据库上的日志刷新和网络传输是并行进行的。假设网络需要4.494秒,但主要日志硬化完成(log_flush_complete:2018-03-06 16:56:28.8785928)远早于主要数据库从副本获得确认(hadr_receive_harden_lsn_message:2018-03-06 16:56:33.3732126)。幸运的是,我们不需要手动确定要使用哪个时间戳来计算事务的总提交时间。我们可以使用两个hadr_log_block_group_commit xevents之间的时间差来知道提交时间。

例如,在上面的日志中: 

  • 主库hadr_log_block_group_commit:2018-03-06 16:56:28.2167393 
  • 主库hadr_log_block_group_commit:2018-03-06 16:56:33.3732847 
  • 提交的总时间=两个时间之差= 5.157秒 

该数字等于网络传输时间加上辅助节点上的日志固化时间。这是有道理的,因为辅助数据库必须等待网络等待可用的日志块,然后再进行日志固化,它无法像主数据库中那样并行固化日志。 

查看从库hadr_log_block_group_commit事件,可以看到该事件有个processing_time列,该列正是我们所讨论的事务的提交时间:  

sqlserver AlwaysOn同步流程与延迟_sql_06

顺便说一下,您可能会注意到在主要Xevents中发生了“ hadr_db_commit_mgr_harden_still_waiting” xevent。当主库正在等待来自从库确认消息时,此事件每2秒(硬编码2秒)发生一次。如果确认在2秒内返回,您将不会看到此xevent。 

参考

Monitor Performance for AlwaysOn Availability Groups | Microsoft Learn

Troubleshooting data movement latency between synchronous-commit AlwaysOn Availability Groups | Microsoft Learn

AlwaysOn: Readable Secondary and data latency | Microsoft Learn

标签:AlwaysOn,log,sqlserver,ADD,hadr,EVENT,block,延迟
From: https://blog.51cto.com/u_13631369/6203169

相关文章

  • sqlserver关于缺少索引的建议是怎么来的?
    看sqlserver执行计划的时候有时会看到这样一行小绿字:它会告诉你当前sql应该在哪些列上建索引(还有include列),建完之后能提升多少性能。对于特别复杂的sql,这个建议有时还是很方便的。那么这些数据是从哪查出来的?sqlserver有四个索引缺失相关的视图:sys.dm_db_missing_index_detailssys.......
  • sqlserver 域独立可用性组
    一、历史版本及改进传统可用性组要求所有服务器必须加入相同ActiveDirectory域,加入不同的域、甚至加入受信任的域均不起作用,所有服务器必须都是相同WSFC的节点。下图显示了这一配置:WindowsServer2012R2引入了与ActiveDirectory分离的群集。它是WSFC的一种特殊形式,WSFC使......
  • sqlserver 从等待状态判断系统资源瓶颈
    一、相关视图2005、2008提供了以下三个视图供获取连接详细信息:DMV用处参考Sys.dm_exec_requests返回有关在SQLServer中执行的每个请求的信息,包括当前的等待状态sys.dm_exec_requests(Transact-SQL)-SQLServer|MicrosoftLearnSys.dm_exec_sessions对于每个通过身份验证的会......
  • sqlserver 分布式可用性组(一)—— 概要
    一、分布式可用性组简介分布式可用性组(DistributedAvailabilityGroup)是SQLServer2016中的新功能,它可跨两个单独的可用性组。两个可用性组无需处于同一位置:它们可以跨物理机、虚拟机;跨内网、云上;跨有域、无域;甚至跨平台(如Linux、Windows)。只要两个可用性组可以进行通信,就可以......
  • sqlserver 移动用户及系统数据库文件位置方法
    查了下文档即使到2019版本,sqlserver移动数据库文件位置依然是要停机的,注意待移动文件大小,估计好停机时间。 sqlserver 移动数据库文件位置分为两大类:用户数据库系统数据库系统数据库又可分为再分为:除master及resource以外的系统数据库(model,msdb,tempdb)master数据库resource数据库......
  • SqlServer 从执行计划缓存发现问题sql
    注意以下sql都较复杂,在数据库中执行时间可能较长,不要执行过于频繁。一、隐式转换sql版本1--找到含有隐式转换且会导致indexseek变为indexscan的语句–findalltheplansandquerywhicharebeingcomparedwithwrongdatatypeinqueriesandthuscasuingtheconversio......
  • 查询sqlserver列名,行数及表说明
    查询sqlserver表名,行数及表说明SELECTD.NAMETABLE_NAME,B.ROWSTABLE_ROWS,F.VALUETABLE_COMMENTFROMSYSOBJECTSDLEFTJOINSYS.EXTENDED_PROPERTIESFOND.ID=F.MAJOR_IDANDF.MINOR_ID=0LEFTJOINSYSINDEXESBOND.ID=B.IDANDB......
  • SQL Server 透明数据加密TDE for AlwaysOn
     上篇留下了一个问题,如何将已启用TDE的数据库加入AG?实际上TDEforAlwaysOn分两种情况:对已在AG中的数据库启用TDE已启用TDE的数据库加入AG(更复杂)注意如果在数据库镜像、日志传送、AlwaysOn中使用TDE,则主从数据库都将被加密,不必显式启用辅助数据库加密,事务日志在它们之间发送时将被......
  • sqlserver 如何查看备份还原进度及历史备份信息
    有时需要给业务方备份还原数据库,如果库比较大,可能时不时会被问“怎么样啦?”,“还剩多少哇?”,如果看不到监控备份还原的进度就很悲催,答不上来...SQLServer主要有三种方法备份还原进度:利用SSMS备份还原,查看进度条(还原的不准)利用SQL的stats关键字指定每完成百分之几显示利用动态性能视......
  • 如何利用sqlserver重置Administrator用户密码
    原文是sqlserver2005的,测试windows2016+sqlserver2017时此功能已经不可用,不过还是记录下重置方法。原理是通过sqlserver的OLE选项创建一个用户并将其添加至Administrator组,随后便可用该用户登录服务器修改administrator用户密码。OLE相当于给你一个cmd环境,让你可以输入cmd命令......