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

WAL——Write-AHead Logging,預寫式日誌

1.目的:

保證數據庫的可靠性數據庫

2.概述

Write-AHead Logging即WAL是一套保證數據完整性的標準。簡要地說,WAL中心概念是數據文件(這裏涉及到表和索引)修改必須在這些動做被記錄以後,即 描述這些修改操做的日誌記錄被刷到永久存儲中。若是咱們遵循這個過程,咱們不須要在每次事務提交時刷數據頁到磁盤,因我咱們知道一旦發生崩潰,咱們可使用日誌回覆數據庫,任何尚未被應用到數據頁面的改變能夠根據其日誌記錄重作(這是前滾恢復,也被稱爲REDO) 。後端

由於WAL存儲在數據庫崩潰後的內容,日誌文件系統不須要數據文件或者WAL文件的可靠存儲。事實上,日誌預寫回下降性能,特別是日誌文件會引發文件系統數據被刷到磁盤中。緩存

3.WAL配置

這裏有幾個WAL預寫配置參數影響數據庫性能。服務器

1)檢查點checkpointide

檢查點是在事務序列中的點,這種點保證被更新的堆和索引數據文件的全部信息在該檢查點以前已被寫入。在檢查點時刻,全部髒數據頁被刷寫到磁盤,而且一個特殊的檢查點記錄將被寫入到日誌文件(修改記錄以前已經被刷寫到WAL文件)。性能

簡單說,每次數據寫入磁盤以前,都須要先寫入WAL文件。檢查點就是週期檢查WAL日誌的寫入狀況,並打一個標記。標記以前的部分表明已經寫入磁盤,而未標記的部分表示尚未寫入磁盤。未寫入磁盤的數據就是恢復的對象(REDO記錄)日誌

2)檢查點觸發條件code

服務器的檢查點進程經常自動地執行一個檢查點。對象

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

相關文章
相關標籤/搜索