排查:Primary上的修改无法在Secondary体现

客户端进程在primary上修改成功,但是在Secondary上却无法看到修改结果。这个case假设你的可用性组有同步的健康问题。很多情况下这个情况会在几分钟之后自动解决。

如果几分之后依然看不到,那么可能在同步的工作流上有瓶颈问题。这个瓶颈会因为是不是同步提交的而不同。

Commit Mode

Possible Bottleneck

Explanation

Synchronous Commit

  • Primary上长运行事务
  • secondary上的redo线程

每个在primary上成功的更新,都同步到了secondary或者日志记录已经为固话刷新。因此瓶颈应该在redo线程上,如果一旦redo跟上,secondary上的读取负荷都是快照隔离级别的。

Asynchronous Commit

  • Primary上长运行事务
  • 网络延迟或者吞吐量
  • secondary中的日志固话
  • secondary上的redo

因为一部提交一旦事务被写入到磁盘就会被通知,瓶颈可能在这个点之后任意位置出现。

1.通常原因

导致primary修改后没有反映到secondary上原因:
1.长运行活动事务
2.高网络延迟,网络吞吐量低导致,Primary的日志堆高
3.有一个Report负荷堵塞了Redo线程
4.因为资源争用导致redo落后

2. 长运行活动事务

primary的长运行事务阻止了从secondary上读取。

原因:
所有secondary上的读负荷都是快照隔离级别的。在快照隔离下,只读客户端只能看到secondary的可用数据库中在redone log中最早的活动事务开始点之前的数据。如果事务几个小时没有提交,事务会block所有只读查询可以看到新的更新数据。

诊断和解决:
在primary,使用dbcc opentran查看最老的活动事务,查看是否可以回滚。一旦最老的事务被回滚并且同步到secondary,在secondary上的读负荷就能之后更新的数据了。

3. 高网络延迟,网络吞吐量低导致,Primary的日志堆高

高网络延迟或者低吞吐量会阻止日志被发送到secondary。

原因:
如果未响应信息发送超过最大允许值,primary会激活flow control,不再发送信息到secondary。直到有些信息有了反馈。这种状态会严重影响数据丢失能力,甚至超过RPO。

诊断和解决:
如果DMV的log_send_queue_size很大,表示log被堵塞在primary上。如果值除以log_send_rate可以初略的评估多久之后才能赶上primary。

也可以检查 SQL Server:Availability Replica > Flow Control Time (ms/sec)和 SQL Server:Availability Replica > Flow control/sec。这2个值相乘可以得到每秒至少花多少时间来等待flow control。flow control等待时间越长,速度越慢。

以下是有用的网络延迟和吞吐的诊断值。也可以使用windows工具,比如ping, Resource Monitor 来评估网络使用率。

·  DMV log_send_queue_size

·  DMV log_send_rate

·  Performance counter SQL Server:Database > Log Bytes Flushed/sec

·  Performance counter SQL Server:Database Mirroring > Send/Receive Ack Time

·  Performance counter SQL Server:Availability Replica > Bytes Sent to Replica/sec

·  Performance counter SQL Server:Availability Replica > Bytes Sent to Transport/sec

·  Performance counter SQL Server:Availability Replica > Flow Control Time (ms/sec)

·  Performance counter SQL Server:Availability Replica > Flow Control/sec

·  Performance counter SQL Server:Availability Replica > Resent Messages/sec

4. 有一个Report负荷堵塞了Redo线程

Redo线程在secondary副本被一个只读长运行语句堵塞。

原因:
在secondary副本,只读查询获得Sch-s锁,这些sch-s锁会堵塞redo线程获得sch-m锁执行DDL修改。被堵塞的redo线程不能应用log记录,直到被释放。一旦被释放,可以执行redo。并且允许执行随后的undo和failover过程执行。

诊断和解决:
当redo线程被堵塞,扩展时间会生产,sqlserver.lock_redo_blocked。另外你可以查询sys.dm_exec_request,查看那个会话堵塞了redo。

select session_id, command, blocking_session_id, wait_time, wait_type, wait_resource

from sys.dm_exec_requests where command = 'DB STARTUP'

可以通过kill会话,强制释放锁。

5. 因为资源争用导致redo落后

大报表行为降低了secondary的性能,导致redo线程被落下

原因:
当应用log记录,redo线程读取log记录,并且应用这些log访问数据page。Page访问可能造成IO瓶颈,如果page不在内存中。如果还有IO密集型的负荷,照成IO资源争用,会降低redo线程的性能。

诊断和解决:
你可以通过DMV查看被落下了多少,通过对比last_redone_lsn和last_received_lsn

select recovery_lsn, truncation_lsn, last_hardened_lsn, last_received_lsn,

last_redone_lsn, last_redone_time

from sys.dm_hadr_database_replica_states

如果redo线程被真的落下了,就需要研究secondary上的性能问题,是否有IO争用问题。可以通过Resource Governor 来限制其他会话的资源使用

[AlwaysOn Availability Groups]排查:Primary上的修改无法在Secondary体现相关推荐

  1. [AlwaysOn Availability Groups]排查:AG超过RTO

    排查:AG超过RTO 自动故障转移或者手动转移之后,没有数据都是,你可能会发现切换时间超过了你的RTO.或者当你评估切换时间同步提交secondary副本,发现超过了你的RTO. 1. 通常原因 通常 ...

  2. [AlwaysOn Availability Groups] 健康模型 Part 2 ——扩展

    [AlwaysOn Availability Groups] 健康模型 Part 2 --扩展 健康模型扩展 第一部分已经介绍了AlwayOn健康模型的概述.现在是创建一个自己的PBM策略,然后设置为 ...

  3. [AlwaysOn Availability Groups]健康模型 Part 1——概述

    [AlwaysOn Availability Groups]健康模型 Part 1--概述 健康模型概述 在成功部署AG之后,跟踪和维护健康状况是很重要的. 1.AG健康模型概述 AG的健康模型是基于 ...

  4. [AlwaysOn Availability Groups]CLUSTER.LOG(AG)

    CLUSTER.LOG(AG) 作为故障转移资源,在SQL Server和windows故障转移集群服务的资源DLL(hadrres.dll)之间有额外的内部交流,DLL无法被SQL Server监控 ...

  5. [AlwaysOn Availability Groups]AlwaysOn健康诊断日志

    AlwaysOn健康诊断日志 为了监控primary可用副本的健康状况,SQL Server资源DLL使用SQL Server2012的过程sp_server_diagnostics. SQL Ser ...

  6. 阿里技术:如何快速排查线上故障?

    阿里技术:如何快速排查线上故障? 以下文章来源于阿里技术 ,作者小峯 阿里技术 阿里巴巴官方技术号,关于阿里的技术创新均呈现于此. 有哪些常见的线上故障?如何快速定位问题?本文详细总结工作中的经验,从 ...

  7. Git/码云上多人协作,创建分支,上传修改

    1.为项目创建分支 可直接在网页上进行管理操作 2.克隆一个项目 git clone https://gitee.com/xxxxx/xxx.git 3.创建本地分支 cd 进入目录文件夹 git c ...

  8. git/码云上关于项目的一些操作:初始化、克隆、上传修改等

    1.本地初始化一个项目 git config --global user.name "your_name" git config --global user.email " ...

  9. Java黑皮书课后题第3章:*3.34(几何:线段上的点)编程练习题3.32显示了如何测试一个点是否在一个无限长的直线上。修改3.32测试一个点是否在一个线段上。编写程序,输入三个点坐标,显示在否线段

    *3.34(几何:线段上的点)编程练习题3.32显示了如何测试一个点是否在一个无限长的直线上.修改3.32测试一个点是否在一个线段上.编写程序,输入三个点p0 p1 p2坐标,显示p2在否线段p0p1 ...

最新文章

  1. 独立服务器和虚拟服务器的区别,BlueHost虚拟主机与独立服务器的主要区别
  2. Celery 使用(一)
  3. Oracle分析函数-rank() over(partition by...order by...)
  4. ASP.NET Core Blazor Webassembly 之 渐进式应用(PWA)
  5. [转载] Java笔试题集锦
  6. .Net Core项目 Encoding不全问题
  7. 某互联网公司广告平台技术架构
  8. 查询linux安装了哪种中文,linux 安装 中文字体
  9. 网易云音乐评论加密解析
  10. 好用的 Sketch 插件 - 收藏集 - 掘金
  11. python学习群发邮件
  12. Python ------ return返回值等
  13. 全国高校中文档--json
  14. 第14.4节 使用IE浏览器获取网站访问的http信息
  15. Microsoft Office无法验证此应用程序的许可证怎么解决
  16. 18、基于STM32的自动浇花系统
  17. 电商的1000+篇文章总结
  18. 创建学生信息管理数据库
  19. Fragment has not been attached yet 解决方法及源码详解
  20. maven中profile的使用详解

热门文章

  1. 搜索Idiot就出现特朗普图片,算法无罪!
  2. 深度丨2018年AI依然要面临解决的的5大技术难题
  3. 2021年14项世界互联网领先科技成果发布
  4. AI产业链全景图!【物联网智商精选】
  5. 关于《重启人工智能》11条建议的思考
  6. 两种超级智能,哪一个对人类未来影响更为深远?
  7. 中国团队新型类脑芯片登上《自然》封面
  8. 2018世界人工智能蓝皮书:看中国到底有多强!【附下载】| 智东西内参
  9. 做木匠、开烘焙店、写科幻小说,那些选择转行的开发者们…
  10. 内卷时代,互联网人相亲有多难?|漫画