PostgreSQL 可觀測性最佳實踐

Mondo 科學 更新 2024-01-31

軟體簡報

PostgreSQL 是乙個開源的關聯式資料庫管理系統 (RDBMS),它提供了許多可觀測性選項來確保資料庫的穩定性和可靠性。

可觀察性

可觀測性是指監控和記錄資料庫狀態和操作,以便在系統出現問題時可以快速診斷和修復問題。

可觀測性雲提供簡單高效的PostgreSQL可觀測性解決方案,幫助客戶快速定位和解決資料庫相關問題。

DataKit是Observation Cloud自研的開源、一體化資料採集代理,提供全平台作業系統支援和全面的資料採集能力,覆蓋主機、容器、中介軟體、鏈路、日誌、安全等多種場景。 通過它攝取 PostgreSQL 資料只需兩個步驟:

步驟 1:安裝 DataKit 資料採集器。

步驟二:通過DataKit內建的PostgreSQL外掛程式採集資料。

配置舉例:

[[inputs.postgresql]] address = "postgres://postgres@localhost/test?sslmode=disable" interval = "60s" [[inputs.postgresql.relations]] relation_regex = "test*" schemas = ["public"] relkind = ["r", "p"] [inputs.postgresql.log] files = ["/var/log/pgsql/*.log""] pipeline = "postgresql.p"
PostgreSQL的監控指標範圍很廣,您可以使用SQL命令檢視系統變數、系統功能、系統檢視等資訊。 Observational Cloud 已將這些 SQL 語句寫入開箱即用的內建指標集。

1.pg_stat_database (datakit postgresql)

示例語句:

postgres=# select * from pg_stat_database where datname='postgres';-[record 1 ]-datid | 14486datname | postgresnumbackends | 2xact_commit | 1406600xact_rollback | 20720blks_read | 1558blks_hit | 48043798tup_returned | 289085449tup_fetched | 21237763tup_inserted | 174tup_updated | 5tup_deleted | 41conflicts | 0temp_files | 0temp_bytes | 0deadlocks | 0checksum_failures |checksum_last_failure |blk_read_time | 0blk_write_time | 0session_time | 1030041341.636active_time | 1740209.944idle_in_transaction_time | 879253.682sessions | 15950sessions_abandoned | 2sessions_fatal | 0sessions_killed | 4stats_reset | 2023-04-06 11:04:11.693074+08
通過pg stat資料庫,基本可以了解資料庫的整體執行情況。

當 tup 返回值遠大於獲取的 tup 時,說明資料庫在歷史上執行的很多 SQL 語句都是全表掃瞄,並且有很多 SQL 語句不遵循索引。

當 tup 更新非常高時,說明資料庫已經頻繁更新,這時需要注意真空相關指標和長事務,如果不及時進行垃圾處理,會導致資料膨脹更嚴重,在一定程度上會響應表查詢效率。

當臨時檔案的值較大時,意味著有大量的排序雜湊或聚合操作,通過增加工作記憶體可以減少臨時檔案的生成,這些操作的效能也會大大提高。

2.pg_stat_user_tables (datakit postgresql_stat)

示例語句:

select * from pg_stat_user_tables where relname='test';-[record 1 ]-relid | 16455schemaname | publicrelname | testseq_scan | 1seq_tup_read | 0idx_scan | 0idx_tup_fetch | 0n_tup_ins | 7n_tup_upd | 0n_tup_del | 0n_tup_hot_upd | 0n_live_tup | 7n_dead_tup | 0n_mod_since_analyze | 7n_ins_since_vacuum | 7last_vacuum |last_autovacuum |last_analyze |last_autoanalyze |vacuum_count | 0autovacuum_count | 0analyze_count | 0autoanalyze_count | 0
您可以使用 pg stat 使用者表來了解當前資料庫中哪些表經常被掃瞄,哪些表經常被更改。

3.pg_stat_user_indexes (datakit postgresql_index)

示例語句:

select * from pg_stat_user_indexes where relname='test';-[record 1 ]-relid | 16455indexrelid | 16460schemaname | publicrelname | testindexrelname | test_pkeyidx_scan | 0idx_tup_read | 0idx_tup_fetch | 0
通過 pg stat 使用者索引,您可以檢視對應索引的使用情況,幫助我們確定哪些索引當前未被使用,並刪除這些無效的冗餘索引。

4.pg_statio_user_tables (datakit postgresql_statio)

示例語句:

select * from pg_statio_user_tables where relname='test';-[record 1 ]-relid | 16455schemaname | publicrelname | testheap_blks_read | 1heap_blks_hit | 6idx_blks_read | 2idx_blks_hit | 8toast_blks_read | 0toast_blks_hit | 0tidx_blks_read | 0tidx_blks_hit | 0
如果通過查詢 pg statio 使用者表,heap blks read 和 idx blks read 較高,則共享緩衝區較小,需要頻繁從磁碟或頁面快取讀取到共享緩衝區。

5.pg_stat_bgwriter (datakit postgresql_bgwriter)

示例語句:

select * from pg_stat_bgwriter;-[record 1 ]-checkpoints_timed | 14438checkpoints_req | 14checkpoint_write_time | 64064checkpoint_sync_time | 83buffers_checkpoint | 656buffers_clean | 0maxwritten_clean | 0buffers_backend | 220buffers_backend_fsync | 0buffers_alloc | 4674stats_reset | 2023-04-06 11:00:39.227749+08
通過查詢 pg stat bgwriter,您可以檢視後端寫入程序活動的統計資訊。 BGPower、Checkpointer 和 Backend 都可以將髒資料寫回儲存。 通常,我們希望大部分髒資料由 bgwriter 寫回儲存,少量髒資料由 checkpoint 寫入,後端寫入的資料較少。 這是因為後端寫入資料的成本非常高,但似乎並非如此,後端寫入的百分比很高。

6.pg_stat_replication (datakit postgresql_replication)

示例語句:

select * from pg_stat_replication;-[record 1 ]-pid | 1492usesysid | 12849usename | guanceapplication_name | walreceiverclient_addr | 192.168.0.187client_hostname |client_port | 41760backend_start | 2023-05-12 16:41:09.54947+08backend_xmin |state | streamingsent_lsn | 2/100001b0write_lsn | 2/100001b0flush_lsn | 2/100001b0replay_lsn | 2/100001b0write_lag |flush_lag |replay_lag |sync_priority | 0sync_state | async
PG Stat Replication 僅以主從 Schema 顯示相關資料,您可以根據對 PG Stat Replication 表的查詢檢視當前複製模式、複製配置資訊和複製站點資訊。

例如,同步狀態可以分為:

async:表示備用資料庫處於非同步同步模式。

潛在:表示備用資料庫當前處於非同步同步模式,如果當前同步備用資料庫出現故障,則可以將非同步備用資料庫公升級為同步備用資料庫。

sync :表示當前備庫處於同步模式。

Quorum:表示備用資料庫是 QuorumStandbys 的候選項。

PostgreSQL 有 3 種型別的日誌,分別是:

PG xlog 和 PG clog 通常位於 PostgreSQL 安裝目錄的資料夾中。

pg log 的預設路徑位於 postgresql 安裝目錄中pg_log,實際路徑可以在postgresql.conf檔案。

1.pg_log

該日誌一般記錄伺服器和資料庫的狀態,如各種錯誤資訊、定位慢查詢SQL、資料庫啟動和關閉資訊、頻繁檢查點等告警資訊等。 日誌有csv 格式和log。建議使用CSV 格式,因為它通常按大小和時間自動拆分,畢竟,檢視乙個巨大的日誌檔案比檢視不同時間段的多個日誌要困難得多。

清理原理:可以使用pg log清理和刪除,壓縮包裝或轉移,同時合併不,它沒有資料庫的正常執行。

2.pg_xlog

該日誌是PostgreSQL的WAL資訊,是一些事務日誌資訊。 這些日誌(如“00000001000000000000000000008e”)包含最近失敗的資料的映象,可用於定期回滾恢復 (PITR)、複製流式處理和存檔。

當存檔或流複製中發生異常時,將持續生成事務日誌,這可能會導致磁碟空間被填滿,最終資料庫將掛起或無法啟動。 在這種情況下,可以先關閉歸檔或流式複製功能,將PG XLOG日誌備份到其他地方,但不要刪除,然後刪除之前的PG XLOG,等到有一定的空間後再嘗試啟動PostgreSQL。

清理原則:這些日誌非常重要,它記錄了資料庫中發生的各種事務的資訊它不能被隨意刪除或者移動這些日誌檔案,否則您的資料庫將包含它們它無法恢復風險。

什麼是沃爾?

PostgreSQL在將快取資料刷寫到磁碟之前寫入日誌,這是PostgreSQL WAL(Write-ahead Log)方法,即預寫日誌方法。

3.pg_clog

pg clog 檔案也是乙個事務日誌檔案,但與 pg xlog 不同的是,它記錄了事務的元資料,它告訴我們哪些事務已完成,哪些沒有完成。

清理原則:但是,此日誌檔案通常非常小重要性它也相當高它不能被隨意刪除或更改有關它的資訊。

可以通過配置檔案來完成postgresql.conf設定它。

主要引數:

logging_collector = on/off

預設情況下,是否將日誌重定向到檔案處於關閉狀態。

log_directory =pg_log

日誌檔案目錄預設為pgdata的相對路徑,即pgdata的相對路徑,即pg log,也可以改為絕對路徑。 日誌檔案可能非常大,建議將日誌重定向到其他目錄或分割槽。 將此配置修改到另乙個目錄時,必須先建立該目錄並修改許可權,以便 Postgres 使用者具有對該目錄的寫入許可權。

log_filename =postgresql-%y-%m-%d*%h%m%s.log

預設情況下,可以對日誌檔案進行命名。

log_rotation_age = 1d

單個日誌檔案的生存期,預設為 1 天,當日誌檔案大小未達到日誌輪換大小時,每天只生成乙個日誌檔案。

log_rotation_size = 10mb

單個日誌檔案的大小,如果時間不超過日誌輪換年齡,乙個日誌檔案最多只能10M,否則會生成乙個新的日誌檔案。

log_truncate_on_rotation = off

當日誌檔案已存在時,如果關閉,則新生成的日誌將追加到檔案末尾,如果開啟,則將覆蓋原始日誌。

log_lock_waits = off

控制當會話等待時間超過死鎖超時並被鎖定時是否生成日誌訊息。 在確定鎖定等待是否會影響效能時很有用,預設值為關閉。

log_statement =none# none, ddl, mod, all

控制記錄哪些 SQL 語句。 none,ddl 記錄所有資料定義命令,例如 create、alter 和 drop 語句。 mod 記錄了所有 DDL 語句,以及 insert、update 等資料修改語句。 ALL 記錄所有已執行的語句,此配置設定為 ALL 以跟蹤在整個資料庫中執行的 SQL 語句。

log_duration = off

記錄每條SQL語句完成執行所花費的時間,並將此配置設定為on,以統計哪些SQL語句耗時較長。

log_min_duration_statement = -1

1 表示記錄已關閉。 0表示記錄所有語句的執行時間,如果值為0(毫秒),則記錄語句的執行時間大於該值。 您可以使用此配置來跟蹤耗時且可能存在效能問題的 SQL 語句。 雖然也可以使用日誌語句和日誌持續時間來統計 SQL 語句和耗時,但 SQL 語句和耗時統計可能彼此不同,或者在不同的檔案中,但日誌最小持續時間語句會在同一行中記錄 SQL 語句和耗時,更易於閱讀。

log_connections = off

是否記錄連線日誌。

log_disconnections = off

是否記錄連線斷開日誌。

log_line_prefix =%m %p %u %d %r

日誌輸出格式(%m、%p實際含義在配置檔案中說明),可根據您的需求進行設定(可記錄時間、使用者名稱、資料庫名稱、客戶端IP和埠,方便定位問題)。

log_timezone =asia/shanghai

日誌時區應與伺服器的時區相同,以便於問題定位。

Observation Cloud 內建了 PostgreSQL 場景檢視,可以直接使用,使用者也可以自定義和修改任何需要的指標檢視。

登入 Observation Cloud 控制台 - 場景 - 儀錶盤 - 建立儀錶盤 - 系統檢視,搜尋 postgresql 並新增。

如果要基於此自定義圖表,可以參考 Observation Cloud 文件:視覺化圖表。

相關問題答案

    哪些阿迪達斯跑鞋最好買?三種高價效比的型號

    阿迪達斯跑鞋冒險 尋找最好的寶藏鞋!嘿,夥計們!今天我們就要探索乙個神秘而刺激的世界 阿迪達斯跑鞋王國!您知道嗎?在這個充滿運動魅力的王國裡,有無數讓人熠熠生輝的 寶鞋 它們不僅物超所值,而且還讓您的跑步之旅更輕鬆 更愉快!經過不懈的努力,我們終於找到了三款最值得大家的阿迪達斯跑鞋!它們是,阿迪達斯...

    茶吧機哪個牌子價格最高?雙12是最推薦的型號庫存

    雙好東西,茶吧機作為一種現代化的茶具,受到了越來越多茶藝愛好者的喜愛。在這個快節奏的社會中,人們對美好生活的需求與日俱增,而茶吧機已成為滿足這一需求的理想選擇。茶吧機集開水 煮茶 保溫等多種功能於一體,既方便又實用。無論是在家中 在辦公室還是在商業場所,您都可以輕鬆享受一杯醇厚的茶。茶吧機的出現不僅...

    哪個是最好的雅詩蘭黛棕色小瓶子?三種高價效比的型號

    親愛的美女們,今天我們就來聊聊乙個知名品牌 雅詩蘭黛!尤其是他們的明星產品 小棕瓶系列。您是否經常為選擇哪乙個而苦惱?別著急,我就為你揭開三款高價效比 瓶 的寶藏!哪個是最好的雅詩蘭黛棕色小瓶子?三大價效比推薦 雅詩蘭黛多效精華霜ml 瓶小樣品 雅詩蘭黛SOS閃光修護精華ml 雅詩蘭黛小棕瓶特別修護...

    《勇士無敵3》玩家最愛的遠端士兵,但價效比最低的幻影射手!

    在 魔法門之英雄無敵 中,最受歡迎的遠端單位是幻影射手。雖然這個單位在戰役中只能通過英雄 格魯 獲得,但其強大的輸出能力還是給一些老玩家留下了深刻的印象。命中屬性,幻影射手無疑是級及以下射手單位中的第一,即使算上近戰單位,幻影射手也只屈從於具有 值的 食人魔 和可以連擊的 十字軍 考慮到 食人魔 和...

    在安全方面,哪個汽車品牌最好?

    汽車安全一直是消費者關注的焦點之一。隨著技術的不斷進步和汽車工業的發展,越來越多的汽車品牌開始關注車輛的安全效能。本文將比較幾個主要汽車品牌,以找出哪些品牌在安全性方面表現最好。一 A品牌的安全效能。A品牌是一家知名的汽車製造商,在安全方面一直處於領先地位。該品牌的車輛配備了先進的安全技術,如主動制...