WAL——Write-AHead Logging,預寫式日志
1.目的:
保證數據庫的可靠性
2.概述
Write-AHead Logging即WAL是一套保證數據完整性的標准。簡要地說,WAL中心概念是數據文件(這里涉及到表和索引)修改必須在這些動作被記錄之后,即 描述這些修改操作的日志記錄被刷到永久存儲中。如果我們遵循這個過程,我們不需要在每次事務提交時刷數據頁到磁盤,因我我們知道一旦發生崩潰,我們可以使用日志回復數據庫,任何還沒有被應用到數據頁面的改變可以根據其日志記錄重做(這是前滾恢復,也被稱為REDO) 。
因為WAL存儲在數據庫崩潰后的內容,日志文件系統不需要數據文件或者WAL文件的可靠存儲。事實上,日志預寫回降低性能,特別是日志文件會引起文件系統數據被刷到磁盤中。
3.WAL配置
這里有幾個WAL預寫配置參數影響數據庫性能。
1)檢查點checkpoint
檢查點是在事務序列中的點,這種點保證被更新的堆和索引數據文件的所有信息在該檢查點之前已被寫入。在檢查點時刻,所有臟數據頁被刷寫到磁盤,並且一個特殊的檢查點記錄將被寫入到日志文件(修改記錄之前已經被刷寫到WAL文件)。
簡單說,每次數據寫入磁盤之前,都需要先寫入WAL文件。檢查點就是周期檢查WAL日志的寫入情況,並打一個標記。標記之前的部分代表已經寫入磁盤,而未標記的部分表示還沒有寫入磁盤。未寫入磁盤的數據就是恢復的對象(REDO記錄)
2)檢查點觸發條件
服務器的檢查點進程常常自動地執行一個檢查點。
a)檢查點在每checkpoint_timeout秒開始
b)超過 max_wal_size時開始
一般默認的設置分別是 5 分鍾和 1 GB
如果從前一個檢查點,以來沒有WAL被寫入,則即使過了checkpoint_timeout新的檢查點也會被跳過( 如果正在使用WAL歸檔並且你想對文件被歸檔頻率設置一個較低的限制來約束 潛在的數據丟失,你應該調整archive_timeout 參數而不是檢查點參數)。也可以使用SQL命令 CHECKPOINT來強制一個檢查點。降低checkpoint_timeout和/或max_wal_size會導致檢查點更頻繁地發生。
檢查點的代價相對比較昂貴,首先是因為它們要求寫出所有當前為臟的緩沖區,正如以上討論的,第二個原因是它們會導致額外的WAL流量。因此比較明智的做法是將檢查點參數設置得足夠高,這樣檢查點就不會過於頻繁地發生。 你可以設置checkpoint_warning參數作為對於你的檢查點參數的一種簡單完整性檢查。
如果檢查點的發生時間間隔比checkpoint_warning秒還要接近,一個消息將會被發送到服務器日志來推薦你增加max_wal_size。如果你沒有把max_wal_size設置得足夠高,那么在進行如大型COPY傳輸等批量操作的時候可能會導致出現大量類似的警告消息。
3)checkpoint_completion_target(檢查點完成目標)
為了避免大批頁面寫入對I/O系統產生的沖擊,一個檢查點中對臟緩沖區的寫出操作被散布到一段時間上。這個時間段由checkpoint_completion_target控制,它用檢查點間隔的一個分數
默認值為0.5,PostgreSQL被期望能夠在下一個檢查點啟動之前的大約一半時間內完成每個檢查點。
在一個接近於正常操作期間最大I/O的系統上,你可能希望增加checkpoint_completion_target來降低檢查點的I/O負載。但這種做法的缺點是被延長的檢查點將會影響恢復時間,因為需要保留更多WAL段來用於可能的恢復操作。盡管checkpoint_completion_target可以被設置為高於1.0,但最好還是讓它小於1.0(也許最多0.9),因為檢查點還包含除了寫出臟緩沖區之外的其他一些動作。1.0的設置極有可能導致檢查點不能按時被完成,這可能由於所需的WAL段數量意外變化導致性能損失。
4)checkpoint_flush_after
在 Linux 和 POSIX 平台上,checkpoint_flush_after允許強制 OS 超過一個可配置的字節數后將檢查點寫入的頁面刷入磁盤。否則,這些頁面可能會被保留在 OS 的頁面緩存中,當檢查點結束發出fsync時就會導致大量刷寫形成延遲。這個設置通常有助於減小事務延遲,但是它也可能對性能帶來負面影響,尤其是對於超過shared_buffers但小於 OS 頁面緩存的負載來說更是如此
5)min_wal_size、max_wal_size
pg_wal目錄中的 WAL 段文件數量取決於min_wal_size、max_wal_size以及在之前的檢查點周期中產生的 WAL 數量。當舊的日志段文件不再被需要時,它們將被移除或者被再利用(也就是被重命名變成數列中未來的段)。如果由於日志輸出率的短期峰值導致超過max_wal_size,不需要的段文件將被移除直到系統回到這個限制以下。
低於該限制時,系統會再利用足夠的 WAL 文件來覆蓋直到下一個檢查點之前的需要。這種需要是基於之前的檢查點周期中使用的 WAL 文件數量的移動平均數估算出來的。
作者:昵稱PG-Two(人送外號-pg二姐),西安電子科技大學研究生畢業,負責數據庫pg后端開發應用,18年11月在合肥pg分享會上認識德哥,開始了與pg之旅~