我有一个非常繁忙的系统(每秒 1000 多个批处理请求,平均 350 多个工作人员)构建在 sql server 2016 上。它是一个具有 3 个同步副本的可用性组。我想重定向对辅助设备的读取请求,但由于重做延迟(以及应用程序的工作方式),我担心获取的数据会过时。
我知道我可以从 sys.dm_hadr_database_replica_states 获得最后一个强化的 lsn 和最后一个重做的 lsn - 但是有什么方法可以等待重做赶上避免 while 循环?
谢谢!加布里埃尔
我有一个非常繁忙的系统(每秒 1000 多个批处理请求,平均 350 多个工作人员)构建在 sql server 2016 上。它是一个具有 3 个同步副本的可用性组。我想重定向对辅助设备的读取请求,但由于重做延迟(以及应用程序的工作方式),我担心获取的数据会过时。
我知道我可以从 sys.dm_hadr_database_replica_states 获得最后一个强化的 lsn 和最后一个重做的 lsn - 但是有什么方法可以等待重做赶上避免 while 循环?
谢谢!加布里埃尔
听起来你在这里有几个不同的问题:
是否可以修改查询以检查底层数据上的重做是否已完成,如果没有,则停止执行直到重做赶上?这似乎是一个非常危险的想法,因为当复制落后时,您将有越来越多的查询用完工作线程,等待复制赶上来。我可以很容易地看到工作线程耗尽在这里并导致线程池等待,因为它与阻塞导致的场景基本相同。
可以将查询重定向到最新的辅助服务器吗?是的,通过在您的应用和 SQL Server 之间使用负载平衡器。您可以在负载均衡器中构建逻辑以运行定期健康检查,当服务器未能通过负载检查时,它会从可用连接列表中删除,直到它能够再次通过健康检查。对于 web 服务器来说,这是一种非常常见的策略,但对于数据库服务器来说却很少见(因为构建起来需要做很多工作。)
可以更快地重做吗?是的,测试看看串行重做还是并行重做更适合您的工作负载,并确保您得到了您想要的。Microsoft 已经在博客中介绍了并行重做的陷阱,包括只有您 AG 中的第一个数据库(按数据库 ID)获得并行重做的 gem。