xlog(WAL)堆積問題總體排查思路
問題描述
xlog(WAL)堆積,明顯超過預期大小,導致磁盤空間使用率上漲,甚至打滿磁盤,影響實例運行。
可能影響
- 占用更多的磁盤空間;
- 可能會打滿磁盤,影響實例運行。
解決步驟
- 首先檢查WAL和歸檔相關參數,核實參數是否符合預期;
連接到WAL日志堆積的節點,執行以下SQL:
select current_setting('wal_keep_segments') as wal_keep_segments,(select count(1) from pg_ls_dir('./pg_wal/')) as wal_count;
WAL相關參數中,wal_keep_segments為保留WAL日志文件的數量,通常實際統計的WAL日志文件數量比wal_keep_segments稍多,相差幾百內都屬于正常范圍,明顯超出則確定WAL日志有堆積;
- 檢查WAL日志增長量是否符合預期;
登錄WAL日志堆積的節點所在服務器,進入pg_wal目錄,執行以下shell命令,按緯度統計WAL數量;
統計每小時日志數量
ls -lrt |egrep [0-9A-Z]{16}|awk '{print $6" "$7" "$8}'|awk -F: '{print $1}'|sort |uniq -c
統計每天日志數量
ls -lrt |egrep [0-9A-Z]{16}|awk '{print $6" "$7}'|awk -F: '{print $1}'|sort |uniq -c
- 檢查復制槽狀態,是否有active=false的復制槽;
連接到WAL日志堆積的節點,執行以下SQL:
select * from pg_replication_slots where active=false;
如果有active=false的復制槽,那么就會導致WAL堆積,需要核實并解決復制槽問題;
- 如果不是復制槽問題,可以繼續檢查歸檔配置是否正確;
連接到WAL日志堆積的節點,執行以下SQL:
show archive_status_control;
如果參數查詢結果為break,那么WAL日志文件不會被正常刪除,需要核實并更正參數為continue;
- 檢查歸檔執行狀態是否正常;
登錄WAL日志堆積的節點所在服務器,檢查archiver進程狀態是否正常,進程顯示的last 歸檔的文件是否在更新。
ps -fe|grep archiver
查詢結果顯示為archiver process failed on xxx,則說明歸檔敗了,需要進一步排查歸檔失敗原因;
也可以執行以下SQL查詢歸檔執行狀:
select * from pg_stat_get_archiver();
其中failed_count>0表示有歸檔失敗。
- 檢查歸檔速度是否正常;
如果歸檔正常,那需要檢查歸檔速度是否正常,歸檔速度是否能趕上WAL日志生成的速度,如果歸檔速度比生成的慢,那么WAL日志會逐漸堆積起來,可以從減少WAL日志生成量和加快WAL日志文件歸檔兩個方面入手進行優化;
- 檢查是否有長事務/長時間執行未結束的SQL;
連接到WAL日志堆積的節點,執行以下SQL:
select pid,client_addr,state_change,query_start,state_change,EXTRACT(EPOCH FROM (now()-query_start)),query,state,usename,application_name from pg_stat_activity where EXTRACT(EPOCH FROM (now()-query_start))>600 and state!='idle';
如果有長時間執行未結束的SQL或事務,需要核實后清理掉,避免影響WAL日志文件的清理。
- 如果影響業務,需要快速恢復,可以先手動清理,再定位原因;
登錄WAL日志堆積的節點所在服務器,進入pg_wal/archive_status目錄,執行以下shell命令,修改*.ready 的擴展名稱*.done
find *.ready | sed 's/.ready$//'| xargs -I {} mv {}.ready {}.done
或
ls -lrt | grep .ready | awk -F' ' '{print $NF}' | xargs -i rename ready done ./{}
如果提示有太多的bash: /usr/bin/find: Argument list too long,則需要分批修改,具體前綴可以 top看一下 Arichve 進程當前在處理哪個WAL,然后取其前綴就行,例如:
find 00000001000005[1-9]*.ready | sed 's/.ready$//'| xargs -I {} mv {}.ready {}.done
find 00000001000005[A-F]*.ready | sed 's/.ready$//'| xargs -I {} mv {}.ready {}.done
復制槽狀態為false導致xlog(WAL)堆積問題
問題描述
復制槽狀態為false,導致xlog(WAL)堆積。
連接到WAL日志堆積的節點,執行以下SQL,返回結果有active=false的復制槽:
select * from pg_replication_slots where active=false;
可能影響
- 占用更多的磁盤空間;
- 可能會打滿磁盤,影響實例運行。
解決步驟
- 需要先核實復制槽哪個應用哪些場景下使用的,并評估是否可以刪除;
- 如果可以刪除,需要評估并給出刪除方案,由于使用場景不明確,不建議直接執行以下刪除命令;
select pg_drop_replication_slot('xxx');
- 參考刪除方案執行。
歸檔失敗導致xlog(WAL)堆積問題
問題描述
歸檔失敗,導致xlog(WAL)堆積。
檢查archiver進程狀態,顯示查詢結果顯示為archiver process failed on xxx。
ps -fe|grep archiver
或執行以下SQL查詢歸檔執行狀態,failed_count>0且持續增長,表示歸檔失敗。
select * from pg_stat_get_archiver();
可能影響
- 占用更多的磁盤空間;
- 可能會打滿磁盤,影響實例運行。
解決步驟
- 檢查備份介質是否可以正常訪問,正常上傳文件,檢查上傳文件速度是否正常;
- 常見問題如:
1)環境變更,部分服務器上備份介質客戶端未安裝或配置錯誤,導致備份介質不能訪問;解決辦法:可通過手動執行訪問介質命令進行驗證,命令需要和備份任務中命令保持一致,避免因命令不同導致驗證結果不準確;如有問題需檢查環境并進行修復;
2)備份介質環境原因,介質環境故障、空間打滿、網絡中斷等原因,導致服務器不能訪問備份介質;
解決辦法:可通過檢查備份介質環境,包括是否可訪問,是否有足夠的空閑資源,訪問和上傳文件速度是否正常;如有問題需修復備份介質環境;
3)可能由于備份任務自身原因導致,例如備份任務有bug,導致備份失敗,如核實有此問題,及時反饋TeleDB產品團隊進行核實修復。