2016-09-19 64 views
3

我有一對設置爲同步AlwaysOn可用性組的SQL Server 2014數據庫。SQL Server中的髒讀AlwaysOn

兩臺服務器都設置爲Synchronous commit可用性模式,會話超時時間爲50秒。輔助設置爲可讀輔助設備Read-intent only

如果我寫入主服務器,然後立即從次服務器讀取(通過ApplicationIntent=ReadOnly),我一直讀取髒數據(即寫入前的狀態)。如果我在寫作和閱讀之間等待大約一秒鐘,我會得到正確的數據。

這是預期的行爲?如果是這樣,我能做些什麼來確保從中學讀取是最新的?

我想使用輔助節點作爲主節點的只讀版本(以及故障切換),以減少主節點的負載。

+0

可能的更好的交易響應時間和吞吐量對於http:/ /dba.stackexchange.com/ – Liam

+0

這不是「髒讀」,它只是延遲。請閱讀此處:https://blogs.msdn.microsoft.com/sqlserverstorageengine/2011/12/22/alwayson-readable-secondary-and-data-latency/ – dean

+1

請參閱http://dba.stackexchange.com/questions/84420/does-synchronous-commit-availability-mode-ensure-consistency-between-replicas。簡而言之:是的,這是預料之中的,如果您無法容忍*任何延遲,請從小學讀取。你可以想像得出你自己的機制來確保你的閱讀是最新的(帶有觸發器或類似的時間戳表),但在大多數情況下,這會比它的價值更麻煩。在任何情況下,都不要在一個工作負載中盲目混合副本,以期達到同步。 –

回答

2

沒有辦法,你可以得到髒讀,除非您使用無鎖提示..

當您啓用閱讀AlwaysOn..Internally SQL只有二級採用rowversioning存儲前行的版本..

進一步使用同步提交模式下,這確保日誌記錄首先在二次承諾,然後在主..

你看到的是數據延遲..

whitePaper DEA與此scenario..Below LS是有關部分,其可以幫助您瞭解更多關於它..

在輔助副本上運行的報告工作量會招致一些數據延遲,通常是幾秒鐘的時間,這取決於主要工作負載分鐘和網絡延遲。

即使將輔助副本配置爲同步模式,也會存在數據延遲。雖然在向主節點發送ACK之前,通過強化已提交事務的事務日誌記錄來確保同步副本有助於在理想條件(即RPO = 0)下保證沒有數據丟失,但並不保證REDO線程在輔助副本上確實將關聯的日誌記錄應用於數據庫頁面。

所以有一些數據延遲。您可能想知道,如果在異步模式下配置輔助副本時,此數據延遲是否更有可能。這是一個更難以回答的問題。如果主副本和輔助副本之間的網絡無法跟上事務日誌流量(即,如果沒有足夠的帶寬),則異步副本可能會進一步落後,從而導致更高的數據延遲。

在同步複製的情況下,不足的網絡帶寬不會導致更高的數據延遲在次級但它可以減緩用於主工作量