SQL Server AlwaysOn中的脏读



我有一对SQL Server 2014数据库设置为同步AlwaysOn可用性组。

两台服务器都设置为Synchronous commit可用模式,会话超时为50秒。设置二级服务器为Read-intent only可读二级服务器。

如果我写入主磁盘,然后立即从从磁盘读取(通过ApplicationIntent=ReadOnly),我将始终读取脏数据(即写入前的状态)。如果我在写入和读取之间等待大约一秒钟,我就会得到正确的数据。

这是预期的行为吗?如果是这样,我能做些什么来确保从二级服务器读取的数据是最新的吗?

我希望将辅助服务器用作主要服务器的只读版本(以及故障转移),以减少主要服务器上的负载。

除非你使用无锁提示,否则你不可能得到脏读。

当您在AlwaysOn中启用只读辅助时..内部SQL使用rowversioning来存储该行的先前版本..

如果您使用的是同步提交模式,这将确保日志记录首先在辅助服务器上提交,然后在主服务器上提交。

您看到的是Data latency.

这篇白皮书讨论了这个场景,下面是相关的部分,可以帮助你更多地了解它

在辅助副本上运行的报告工作负载将导致一些数据延迟,通常是几秒到几分钟,具体取决于主工作负载和网络延迟。

即使将从副本配置为同步模式,数据延迟仍然存在。虽然同步副本在向主副本发送ACK之前,通过强化已提交事务的事务日志记录,可以确保在理想条件下(即RPO = 0)不会丢失数据,但它不能保证从副本上的REDO线程确实将相关的日志记录应用到数据库页面。

所以有一些数据延迟。您可能想知道,当您以异步模式配置二级副本时,这种数据延迟是否更有可能发生。这是一个更难回答的问题。如果主副本和从副本之间的网络无法跟上事务日志流量(即,如果没有足够的带宽),则异步副本可能会进一步落后,从而导致更高的数据延迟。

在同步副本的情况下,网络带宽不足不会导致从服务器上的数据延迟增加,但会减慢主工作负载的事务响应时间和吞吐量

最新更新