FCI 如何保證數據的一致性和完整性?
FCI技術使用windows集群在Secondary節點上啟動sql server服務,並為Secondary節點提供數據和日誌磁碟。
假設節點 1 的作業系統崩潰,FCI 故障轉移啟動了節點 2,那麼數據一致性和完整性的保證是什麼?例如 - 可能是作業系統在處理 sql 數據和日誌文件時崩潰,從而導致損壞。
為了回答這個問題,讓我們看看當事務送出到數據庫時會發生什麼。
對 SQL Server 執行 DML 語句時,必鬚髮生一些事件。
- 事務被寫入磁碟上的事務日誌。
- 事務接下來被寫入記憶體中相應的數據頁,然後數據頁被標記為臟(即它不再與磁碟上的內容匹配)。
- 在下一個
CHECKPOINT
orLAZY WRITE
,臟頁將被寫回磁碟。由於這些執行的頻率,在將整個頁面寫回磁碟之前,單個數據頁面實際上可能會接收到多個更改。一旦事務在事務日誌中,它基本上就被送出了。這是過程中的關鍵點。如果 SQL Server 在對事務日誌進行更改之前崩潰,則 SQL Server 將永遠不會向客戶端確認事務成功。
如果 SQL Server 在更新事務日誌之後崩潰,並且在記憶體或磁碟中的頁面更新之前,事務仍然可以從事務日誌中恢復。一旦 SQL Server 服務在新的主節點上啟動,數據庫將進行恢復,並通過應用尚未寫入數據文件的事務日誌中的事務來前滾數據庫。
這取決於,因為有多個點可能會發生崩潰。
- SQL Server 程序可能會崩潰
- Windows 作業系統可能會崩潰
- VM 主機可能會崩潰
- SAN/磁碟控制器可能會崩潰
現在,如果 SQL Server 崩潰,Brendan McCaffrey 的回答會詳細概述該過程。
如果是 Windows 本身呢?Windows 的 NTFS 是一個日誌文件系統,所以它應該以一致的狀態寫入 SQL Server 告訴它的任何數據,對吧?不,它不能保證使用者數據(數據庫文件和事務日誌所在的數據)是完整的。它保證 NTFS內部資料結構是健壯的。因此,即使 NTFS 告訴 SQL Server 事務已寫入,如果同時發生崩潰,也可能不會。
如果虛擬機主機崩潰了怎麼辦?這更棘手。從 Windows 的角度來看,這有點像有人拉電源線。這裡最大的“但是”是 VM 系統隱藏了 IO,因此 Windows 認為它已經成功進行了寫入操作,但它仍然記憶體在 VM 主機上。現在主機崩潰了,我以為是寫的東西就消失了。(虛擬)磁碟上的實際狀態是什麼?沒有人可以告訴。這種失敗並不少見,比如 10 年前,當虛擬化技術還沒有那麼成熟時。
如果磁碟控制器崩潰怎麼辦?所有的賭注都取消了。沒有辦法知道控制器實際上在磁碟上寫了什麼,如果有的話。不能保證它有任何意義。我在 HP EVA 上看到過一些這樣的案例,但這些情況很少見。