pg_basebackup熱備如何保證數據一致性
所謂熱備就是在數據庫不停機的情況下對數據做備份,不影響數據業務,在備份過程中數據不斷的改變,PG是如何保證即使數據改變了也能不影響備份呢,這里WAL LOG起了很重要的作用,使用一份基礎數據加上一些增量數據能實現這個過程。

PG的備份使用了基礎文件加上WAL LOG來保證數據的一致性,基礎文件是寫入到磁盤的已經固化下來的數據,這通過在備份前做一次checkpoint來保證內存中的臟數據全部刷新到磁盤中,而WAL LOG保存的是在備份過程中改變的數據,這樣,利用基礎文件+WAL 日志可以將數據庫推到一個數據一致的時間點。
1、 開始備份,設置force_page_writes=true
2、 做一次checkpoint將臟數據刷新到磁盤
3、 開始拷貝數據,同時開始用流復制的方式復制備份過程中產生的WAL日志
以上基礎文件+WAL文件看似完美,但實際上不是這樣的,因為操作系統不能保證PG的數據頁完整的寫入到磁盤中。
在PG服務器上,內存中的臟頁是持續的寫入到磁盤中的,寫入過程中一般是以頁為單位來操作,如果在內存數據刷盤得時候正好去拷貝數據,很有可能拷貝到半頁數據,PG默認每個page的大小為8K,一般情況下,PG數據頁是以page為單位寫入的,但在斷電,操作系統崩潰或者熱操作(熱備)時,極有可能導致部分數據快只寫到4K(操作系統一般是以4K為單位寫磁盤),這些“部分寫”的頁面包含新舊數據的混合,在崩潰后的恢復期間,由于頁已經是損壞的頁,無法恢復,而在WAL日志里面存儲的記錄變化信息不夠完整,也無法恢復該頁,導致數據庫啟動失敗。
1、 用戶DML操作,比如update數據
2、 數據從磁盤讀入到內存,并在內存中做了修改,產生臟數據
3、 內存中臟數據刷新到磁盤文件,同時,用戶備份操作開始拷貝數據
4、 由于寫文件(刷盤)和讀文件(拷貝)同時進行,導致拷貝的文件出現半頁寫的不完整數據。
PG用force_page_write解決這個問題,它的原理是在checkpoint之后對所有數據頁面的第一次寫的時候將整個數據頁同時寫入到xlog中。
備注:設置full_page_writes=on后,checkpoint后對每個頁中數據的第一次修改都會將整個頁全部保存到WAL日志中,如果修改的數據比較零散,可能導致WAL日志大量增加,給系統磁盤帶來很大壓力。
在沒有半頁寫的情況下,WAL日志中保存的整頁數據是沒用的,不會覆蓋到數據文件中,例如:
1、 開始恢復
2、 Checksum檢查數據頁,沒有發現半寫情況
3、 使用WAL日志恢復備份過程中產生的增量數據
4、 恢復完成
異常出現后,redo操作時通過checksum發現“半寫”的數據頁,并將xlog中保存的完整頁覆蓋當前損壞的數據頁,然后再繼續做redo,就可以恢復整個數據庫。
1、 開始恢復
2、 Checksum檢查數據頁,發現有半頁寫的壞數據
3、 使用WAL中保存的整頁數據來修復半頁寫數據頁
4、 WAL日志恢復半頁寫壞數據
5、 使用WAL日志恢復備份過程中產生的增量數據
6、 恢復完成
Pg_basebackup過程中應用了full_page_write這項技術,在主要流程中,開始調用了do_pg_start_backup()函數,接著開始拷貝數據,在結束的時候調用了do_pg_stop_backup()函數do_pg_start_backup()函數首先設置了full_page_write=on(對應的參數是XlogCtrl->Insert.forcePageWrites= true)然后做了一次checkpoint,
do_pg_stop_backup()函數是對do_pg_start_backup()函數修改過的一些參數做恢復操作,也就是說在備份過程中保持full_page_write=on。
因為full_page_write需要在xlog中記錄數據頁,會寫更多xlog文件,不僅有數據變化信息,還有數據頁本身信息,這樣會增加額外的IO和磁盤消耗,把full_page_write這個選項關閉會提高數據庫執行速度以及減少xlog數量,但是可能導致系統崩潰或者掉電之后的數據庫損壞。 如果有減小部分頁面寫入風險的硬件支持(比如電池供電的磁盤控制器), 或者文件系統支持(能夠保證page寫入原子性),可以把風險降低到一個可以接受的范圍, 那么可以考慮關閉這個選項,其他情況下建議打開這個選擇。
數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。