天天看點

Postgresql——WAL(Write-AHead Logging,預寫式日志)

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之旅~