4

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

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

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

这是预期的行为吗?如果是这样,我能做些什么来确保从辅助设备读取的数据是最新的吗?

我想将辅助节点用作主节点的只读版本(以及故障转移),以减少主节点的负载。

4

1 回答 1

3

除非您使用无锁提示,否则您无法获得脏读。

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

进一步你使用同步提交模式,这确保日志记录首先在辅助服务器上提交,然后在主服务器上。

你看到的是数据延迟..

白皮书处理这种情况。以下是相关部分,有助于了解更多相关信息。

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

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

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

在同步副本的情况下,网络带宽不足不会导致辅助节点上的数据延迟较高,但会减慢主工作负载的事务响应时间和吞吐量

于 2016-09-19T13:36:40.643 回答