Storage

低級儲存要求是什麼?

  • December 23, 2013

通常,數據庫引擎會滿足一些請求,並且任何修改都必須保持持久性(您稱之為持久性)。如何確保/假設持久性?對硬體/作業系統有哪些要求?

特別,

伺服器什麼時候刷新?作業系統刷新命令是否會傳播到某個中間緩衝區而不傳播到 HDD 板?今天,許多儲存製造商和介面都支持亂序寫入緩衝區。影響是什麼?:你應該採取任何行動來抵消它嗎?磁碟上的 ram 緩衝區是否重要?是否需要任何 UPS(以及哪些)來支持 RAM 緩衝區?

如果我有自己的“數據庫”——將數據儲存在普通文件中,我應該保證什麼?我認為 DB 做得最好。什麼是最好的,以便我可以做同樣的事情來保證數據不會失去?有簡單的程序嗎?有沒有教授安全儲存的課程?

您沒有提到數據庫平台,我可以提供有關 SQL Server 的見解。

SQL Server 使用稱為 WAL 的概念來確保持久性。提前寫日誌。這意味著在將所有更改應用於數據文件之前,首先將所有更改寫入日誌。

當需要更改行時。相應的數據(可能還有索引)頁面從磁碟獲取到緩衝池(在記憶體中)。

在記憶體中,頁面被更新,然後頁面被標記為臟。完畢。但是當你停電時會發生什麼?記憶體是不是清零了?

為什麼頁面沒有立即寫入磁碟?因為這可能會導致主要的磁碟爭用。想像一下,您有一個包含幾百行的頁面。如果每行更新都將頁面寫入磁碟,則會創建大量磁碟 IO。

因此使用了不同的機制。不再需要每次在該頁面上發生單個更新時將數據頁面寫入磁碟的機制。

每當更新一行時,首先將更改連同撤消更改的資訊寫入日誌文件。完成後,發出更改的客戶端會收到一個確認,即更改實際上已寫入磁碟(已硬化),並且客戶端可以繼續執行下一條語句。

這樣,當您斷電時,數據庫伺服器再次啟動後,可以從日誌文件中讀取所有已完成(已送出)的更改並仍然應用,並且可以撤消所有未完成或回滾的更改。

最終,如果所有那些臟的和掛在記憶體中的數據頁都應用於數據文件,那會很好嗎?對於初學者,您不希望在伺服器重新啟動後需要重新應用日誌文件的天數更改。因此,臟數據頁偶爾會刷新到數據文件中。這稱為檢查點。檢查點發生的時間間隔基於重新啟動後恢復數據庫所需的時間。(讀取日誌文件中的所有更改並將其應用於數據文件所需的時間。但要理解的關鍵是數據頁以及它們是否寫入磁碟對於持久性並不重要。

回到日誌文件。為了確保一旦 SQL Server 向 OS 發出日誌文件寫入 IO 請求並且 OS 回复 IO 已處理的確認,它實際上確實被硬化到磁碟而不是在 OS 記憶體中徘徊,日誌文件是用以下標誌:FILE_FLAG_WRITE_THROUGH。這告訴作業系統不要記憶體任何要寫入此文件的寫入 IO。

- 更新

原子性是通過您的更改都包含在事務中來實現的。(隱式或顯式)。因此,當您更新一條記錄時,您至少有 3 條日誌記錄:

  1. 開始傳輸
  2. 更新記錄 X
  3. 送出翻譯

為簡單起見,假設這 3 條記錄在 3 個單獨的 IO 中發送到磁碟。持久性規則規定客戶端只有在 1、2 和 3 被硬化到磁碟時才能獲得確認。

原子性規則規定要麼應用完整的事務,要麼不應用事務的任何步驟。所以在上面的例子中,如果你在 IO #2 被硬化到磁碟之後發生了故障。重新啟動後,數據庫伺服器將查看事務日誌。事務日誌中未應用到數據文件且具有最終 COMMIT TRAN 記錄的所有事務記錄都將應用於數據文件。但是,對於上述事務,數據庫伺服器不會在日誌文件中找到 COMMIT TRAN 記錄。你現在可能不得不情景。

  1. SQL Server 在數據文件中查找 UPDATE RECORD X 是否已應用於數據文件。(一種可能性可能是您在生成日誌記錄 2 之後和崩潰之前有一個檢查點。)在這種情況下,由於數據庫伺服器找不到送出記錄,它假定整個事務大部分都被回滾. 它將撤消更改。由於您的客戶端應用程序從未收到事務已送出的確認。你現在回到了一致的狀態。應用程序必須重試事務。
  2. SQL Server 查看數據文件,發現該事務的任何內容都沒有應用於數據文件。它只會忽略這些日誌記錄。

–END 更新

大多數處理 IO 的現代硬體都具有處理斷電的機制。例如控制器卡記憶體由電池備份,SAN 具有相同的原理。唯一要記住的是,即使它們確實具有這些機制,如果您的任何硬體允許您繼續操作,即使電池不存在或出現故障,您也可以實施適當的錯誤事件監控並採取相應的措施。

事務日誌管理器以保證的順序將 IO 發送到作業系統。一旦硬體設備告訴作業系統 IO 已得到處理,這實際上意味著從那一刻起 IO 要麼在電池支持的記憶體中,要麼實際上在磁碟上。換句話說:IO 在斷電後是可重現的。出於優化目的,IO 硬體設備可能會以不同的順序將 IO 寫入物理磁碟。但這對我們來說不再重要。

實施 SAN 級別鏡像時,IO 排序是一個值得關注的問題。但這是另一個話題。

你自己的數據庫是什麼意思?您打算開發自己的 RDBMS?您至少需要以下 3 個核心概念:

  1. 僅當將日誌記錄寫入可以完全重現更改的磁碟或將更改本身寫入磁碟時,才向客戶端應用程序確認事務實際上已送出。(如果你不想實現 WAL 之類的東西)
  2. 為了強化寫入文件,在文件初始化時實現 FILE_FLAG_WRITE_THROUGH 標誌。確保 Windows 作業系統不記憶體。
  3. 使用具有電池備份記憶體的硬體。並監控電池問題

可以在SQL Server I/O 白皮書中找到詳細的 SQL Server 資訊。

有關酸的更多資訊。原子性、一致性、隔離性和持久

引用自:https://dba.stackexchange.com/questions/55459