10個常見的 PostgreSQL 錯誤及避坑指南

来源:https://www.cnblogs.com/88223100/archive/2023/02/23/10-common-postgresql-mistakes-and-how-to-avoid-them.html
-Advertisement-
Play Games

PostgreSQL 作為當下流行的資料庫,不少開發者因其開源、可靠、可擴展等特性把它應用到實際的生產環境中,幫助無數 PostgreSQL 廠商的 Percona 編製了一個最常見錯誤的列表。即使你認為自己已經正確地安裝配置 PostgreSQL,或許仍會發現此列表對於驗證你的安裝配置大有裨益。 ... ...





PostgreSQL 作為當下流行的資料庫,不少開發者因其開源、可靠、可擴展等特性把它應用到實際的生產環境中,幫助無數 PostgreSQL 廠商的 Percona 編製了一個最常見錯誤的列表。即使你認為自己已經正確地安裝配置 PostgreSQL,或許仍會發現此列表對於驗證你的安裝配置大有裨益。




原文鏈接:

https://www.infoworld.com/article/3681655/10-common-postgresql-mistakes-and-how-to-avoid-them.html

 

PostgreSQL 旨在應對廣泛的使用場景,但具有極大靈活性的同時也有不利的一面。使用時應註意不要犯本文所列舉的這些十分常見的設計、配置、調整或其他相關錯誤。
在安裝 PostgreSQL 時可能會忽略很多問題,其中某些問題也許因潛伏而未被髮現。隨著時間的推移,它們可能突然爆發並產生重大影響,使其成為大家關註的焦點,這種情況尤其糟糕。
無論是性能明顯下降,還是資源消耗或使用成本的急劇上升,在出現這些情況前儘早發現問題都很重要。而更好的做法是,實施時通過配置以適應所需的工作負載來避免這些問題。

錯誤1:運行預設配置
PostgreSQL 可以做到開箱即用,但其配置通常不能很好地滿足需求。預設配置沒有針對任何特定的工作負載進行調整,具有極大的局限性。這種過於保守的配置,目的在於允許 PostgreSQL 運行在任何環境下,並期望用戶根據自己的需要進行配置。
pgtune 工具提供了基於硬體資源和工作負載類型的配置子集,是根據工作負載需要配置 PostgreSQL 集群的良好起點。此外,還可能需要配置 autovacuum、日誌、檢查點和 WAL(預寫日誌)保留策略等變數。
為伺服器進行優化配置,以滿足全部近期需求,同時避免任何不必要的重啟操作,這一點非常重要。所以有必要看一下 pg_settings 系統視圖中所有具有 “postmaster” 上下文的 GUC。

SELECT name, setting, boot_val
FROM pg_settings
WHERE context = 'postmaster';
尤其在設置高可用(HA)群集時,這點更為重要,因為主伺服器的任何停機都會降低群集性能,並導致將備用伺服器提升為主伺服器角色。

錯誤2:未優化的資料庫設計和架構
關於這點怎麼強調都不為過。我曾親眼看到,僅僅因為未優化的資料庫設計和架構,用戶付出的成本是他們所需成本的五倍多。
這裡最好的建議之一是看看現在和近期的工作負載需求時什麼,而不是六個月到一年後可能需要什麼。向前看得太遠可能意味著你的表是為永遠無法實現的未來需求而設計的。這隻是其中的一個方面。
除此之外,過度依賴對象關係映射(ORM)也是性能不佳的主要原因之一。ORM 主要用於使用面向對象的編程語言將應用程式連接到資料庫,久而久之它們會逐漸簡化開發人員的工作。然而,瞭解 ORM 提供什麼功能以及它引入了什麼樣的性能影響至關重要。ORM 可能正在後臺執行多個查詢,不管是連接多個表、執行聚合,還是拆分查詢數據。總的來說,使用 ORM 時會引起更高的延遲和更低的事務吞吐量。
另外,改進資料庫架構還為了使數據更加結構化,以便對錶或索引進行最佳的讀寫操作。另一種有用的方法是對資料庫進行反規範化,因為這會降低 SQL 查詢的複雜性,減少相關的表連接,進而可以從更少的表中獲取數據。
簡單來說最終驅動高性能的,是對具體環境中的應用程式和工作負載執行三步過程,即“定義、測量、優化”。

錯誤3:沒有針對工作負載調整資料庫
根據工作負載調整資料庫,需要深入瞭解要存儲的數據量、應用程式的性質,以及要執行的查詢類型。可以隨時修改配置併進行基準測試,直到對高負載下的資源使用滿意為止。
例如,考慮是否可以將整個資料庫放入電腦的可用記憶體中。如果是,那麼顯然希望增加資料庫的 shared_buffers 值。類似地,瞭解工作負載是如何正確配置檢查點和 autovacuum 進程的關鍵。例如,與滿足事務處理性能委員會 C 類基準的混合線上事務處理工作負載相比,為 append-only 類型工作負載進行的這些配置將非常不同。
有很多有用的工具提供了查看查詢性能的功能。關於更多查看查詢性能的說明,可以瀏覽我的博客文章,其中討論了一些可選的開源工具。還可以看下我在 YouTube 上的演示。
在 Percona,我們的兩個工具可以極大地幫助理解查詢性能狀況:
lPMM - Percona監控和管理,是一個免費的、完全開源的項目,提供了一個帶有詳細系統統計和查詢分析的圖形界面。可隨意試用適合MySQL、MongoDB或PostgreSQL的PMM演示程式。
lpg_stat_monitor - 這是pg_stat_statements的增強版本,可以藉此更詳細地瞭解查詢性能狀況、實際的查詢計劃和帶有參數值的查詢文本。可以從我們的下載頁獲得它在Linux上的可用包,也可以從PostgreSQL社區的yum存儲庫獲得RPM包。

錯誤4:連接管理不當
乍一看連接配置似乎沒問題,但是我見過太大的 max_connections 值導致記憶體不足錯誤的情況,所以配置 max_connection 還需要註意一下。
配置 max_connections 時必須考慮內核數、可用記憶體量和存儲類型。誰都不希望讓可能永遠不會使用的連接致使伺服器資源過載,況且還要為每個連接分配內核資源。PostgreSQL 內核文檔有更多詳細信息。
當客戶端執行花費很少時間的查詢時,連接池能顯著提高性能,因為在這種類型的工作負載中,生成連接的開銷相對變得很大。

錯誤5:Vacuum 工作異常
希望 autovacuum 沒有被禁用。我們已經在許多生產環境中看到,用戶完全禁用了 autovacuum,這通常是由於一些潛在的問題所導致。如果 autovacuum 在具體環境中不起作用,那麼只可能有以下三個原因:
1.vacuum 過程沒有被觸發,或者至少沒有像應該的那樣頻繁。
2.Vacuuming 太慢。
3.vacuum 沒有清理沒用的舊版本數據。
其中 1 和 2 都與配置選項直接相關。可以通過查詢 pg_settings 系統視圖來查看vacuum相關選項。

SELECT name
, short_desc
, setting
, unit
, CASE
WHEN context = 'postmaster' THEN 'restart'
WHEN context = 'sighup'     THEN 'reload'
ELSE context
END "server requires"
FROM pg_settings
WHERE name LIKE '%vacuum%';
通過調整 autovacuum_work_mem 和並行工作線程的數量,可以潛在提高速度。vacuum 過程的觸發可以通過配置比例因數或閾值來調節。
當 vacuum 過程沒有清理沒用的舊版本數據時,表明有某種東西阻礙了獲取關鍵資源,罪魁禍首可能是以下一項或多項:
長時間運行的查詢或事務;
複製環境中的備用伺服器啟用了 hot_Standby_feedback 選項;
大於所需的 vacuum_defer_cleanup_age 值;
保持 xmin 值的複製槽阻止了 vacuum 清理沒用的舊版本數據。
如果想手動管理表的 vacuum 過程,那麼請遵循帕累托定律(即80/20法則)。將集群調整到適合 80% 的表的最佳配置,然後專門針對剩下 20% 的表進行調整。記住,可以通過在 create 或 alter 語句中指定相關的存儲選項,來為特定表禁用 autovacuum 或 toast.autovacuum。

錯誤6:惡意連接和長時間運行的事務
PostgreSQL 集群可能會受到很多因素的影響,而惡意連接就是其中之一。除了占用可能被其他應用程式使用的連接槽外,惡意連接和長時間運行的事務占用關鍵資源,這可能會對整個系統造成嚴重破壞。看一個較小程度的影響:在啟用了 hot_standby_feedback 的複製環境中,備用伺服器上的長時間事務可能會阻止主伺服器上的 vacuum 完成其工作。
試想一個有問題的應用程式,它打開一個事務,然後停止響應。程式可能會持有鎖,或者只是阻止 vacuum 清理舊版本數據,因為這些數據在此事務中仍然可見。如果該應用程式打開了大量此類事務怎麼辦?
通常情況下,可以通過將 idle_in_transaction_session_timeout 配置為針對查詢調整的值來消除此類事務。當然每次修改參數時,都要記住應用程式的行為。
除了調整 idle_in_transaction_session_timeout 之外,還要監控 pg_stat_activity 系統視圖以查看任何長時間運行的查詢,或等待客戶端相關事件的時間超過預期時間的會話。註意時間戳、等待事件和狀態列。

backend_start | 2022-10-25 09:25:07.934633+00
xact_start | 2022-10-25 09:25:11.238065+00
query_start | 2022-10-25 09:25:11.238065+00
state_change | 2022-10-25 09:25:11.238381+00
wait_event_type | Client
wait_event | ClientRead
state | idle in transaction
此外,準備事務(尤其是孤立的準備事務)也可能持有關鍵系統資源(如鎖或xmin值等)。我建議為準備事務設置一個命名法來定義它們的存在期限。比如,一個最長存在時間為 5 分鐘的準備事務可以創建為 PREPARE TRANSACTION 'foo_prepared 5m'。

SELECT gid
, prepared
, REGEXP_REPLACE(gid, '.* ', '') AS age
FROM pg_prepared_xacts
WHERE prepared + CAST(regexp_replace(gid, '.* ', '') AS INTERVAL) < NOW();
這為應用程式提供了一種定義其準備事務的期限的方案。繼而使用 cronjob 或計劃作業,就可以監控或回滾任何在其預期期限之後仍保持活動狀態的準備事務。

錯誤7:索引過度或索引不足
對錶進行過度索引究竟有沒有問題呢?必須要瞭解 PostgreSQL 如何管理索引,才能使 PostgreSQL 實例獲得最佳性能。
PostgreSQL 中有多種類型的索引,每種都有不同的使用場景和開銷。B 樹是最常用的索引類型,也用於主鍵。在過去的幾個主要版本中,B樹索引中出現了許多與性能相關(或剝離)的改進。這裡是我的一篇博文,討論了 PostgreSQL 14 中的重覆版本變動。
當對錶執行索引掃描時,對於每個匹配的行,索引會回表訪問以獲取數據和可見性信息,以便只選擇當前事務可見的版本的數據。過度索引將導致更多的索引更新,因此會消耗更多資源而得不到預期的好處。
同樣,索引不足將導致更多的表掃描,這可能導致更多的 I/O 操作,從而導致性能下降。
創建索引時不僅要考慮表上的索引數量,還要考慮這些索引在所針對的查詢上如何進行優化。理想情況下,希望每次查詢只掃描一個索引,但有一些限制。儘管 B 樹索引支持所有運算符的索引掃描,但 GiST 和 SP GiST 索引僅支持某些運算符。有關詳細信息,請參閱文檔。
以下簡單的檢查項,可以幫助驗證是否為系統進行了最佳索引設置:
確保配置正確(例如,為相關硬體調整了隨機頁訪問成本)。
檢查統計數據是否最新,或者至少檢查運行analyze或vacuum命令的表上是否有索引。確保統計數據最新或接近最新,以便查詢計劃更有可能選擇索引掃描。
創建正確類型的索引(B樹、哈希或其他類型)。
在正確的列上使用索引。不要忘記,在索引中包含查詢所需列可以避免回表訪問,即所謂索引覆蓋。並非所有索引類型都允許索引覆蓋,因此使用時請檢查文檔。
去除不必要的索引。請參閱pg_statio_user_indexes,瞭解有關索引和塊命中的更多信息。
瞭解索引覆蓋對重覆數據消除、重覆版本變動和僅索引掃描等功能的影響。

錯誤8:備份和 HA 不足
HA 的作用不僅是保持服務的正常運行,還要確保服務在定義的驗收標準內進行響應,並滿足 RPO(恢復點目標)和 RTO(恢復時間目標)目標。要達到系統正常運行時間要求的9的個數(正常使用時間與總時間之比),請參閱此wiki頁面以計算百分比。
為了滿足 RPO 和 RTO,必須考慮許多因素,包括計劃內停機時間、任何自動或手動操作及其頻率和持續時間,當然還有與計劃外停機相關的成本。
擁有準確和及時的備份,以及有效恢復備份的能力,在定義 RPO 和 RTO 這兩個參數方面起著關鍵作用,其中涉及數據備份的頻率是多少,怎樣管理 WAL 文件,如何驗證備份和 WAL 文件等諸多問題。
根據工作負載和可用的維護時間視窗,通常應至少每七天進行一次備份。除此之外,還應該定期測試恢復過程,以便確認這些備份是有效的。事實上,只有應用程式能夠恢復併進行處理,備份才算成功。不應信任未經測試的備份。

錯誤9:錯誤管理擴展模塊
PostgreSQL 自帶 50 多個擴展模塊,而後還有個人或組織提供的第三方擴展模塊。PostgreSQL 內核提供了一些常用的擴展模塊,如 pg_stat_statements,此外還有一些著名的擴展模塊,例如 PostGIS,它們不是內核的一部分。
首先應該確保所部署的任何一組擴展模塊都能夠一起工作,而不會相互影響。此外還有性能方面的考慮。有些擴展模塊只是簡單的 SQL 擴展,而另一些擴展模塊帶有共用對象或 DLL,這會消耗更多資源並影響整體性能,一定要瞭解這些擴展模塊將消耗哪些資源。
更重要的是,任何預載入的擴展模塊都會成為伺服器的一部分。無論是否通過發出 CREATEEXTENSION… 語句創建了 SQL 介面,這些預載入擴展模塊都將在後臺工作。例如,無論是否創建了 SQL 介面,將 pg_stat_statements 添加到共用預載入庫中都會導致性能下降。這裡的總體經驗是仔細考慮是否真的需要這些擴展模塊。
下麵是一些很有用的關於對擴展模塊的查詢。
可以查詢系統視圖pg_extension以獲取有關已安裝擴展模塊的信息。
SELECT * FROM pg_extension;
類似地,可以找出系統上所有可用的擴展模塊。
SELECT * FROM pg_available_extensions();
還可以查詢所擁有的擴展模塊的可用版本。
SELECT * FROM pg_available_extension_versions();

錯誤10:忽略支持工具
除 PostgreSQL 集群本身以外,還應該考慮需要哪些其他支持工具以改善 PostgreSQL 的使用體驗,因此有必要瞭解可用的工具。由於舊版本存在嚴重問題,人們對某些工具存有誤解,所以應看下新版本、各個社區的活躍性以及發佈的頻率。
例如,讓我們回顧一下 PostgreSQL 生態系統中用於連接池和負載均衡的幾個工具:PgBouncer、HAProxy 和 Pgpoo II。
HAProxy 是一個負載均衡器。請註意,與各種操作系統發行版一起打包的 HAProxy 版本很舊。如 CentOS 7 中版本為 1.5,CentOS 8 中版本為 1.8,而 HAProxy 的最新版本是 2.6。作為參考,HAProxy 2.4 有 1687 個新提交代碼。雖然使用操作系統發行版提供的包更容易,但這些包可能太舊了。
PgBouncer 是一款輕量級連接池。雖然它是單線程的,但如果運行多個 PgBouncer 實例並監聽同一埠,則支持 SO_REUSEPORT 選項的內核可能會允許負載均衡。需要檢查內核文檔,看看它是否支持負載均衡或輪詢,也許根本不支持。使用 systemd 模板,可以以非常簡單和優雅的方式運行多個 PgBouncer 實例。只需創建文件 /etc/systemd/system/[email protected],並使用 systemctl start pgbouncer@1、systemctl start pgbouncer@2 等命令運行任意數量的 PgBouncer 實例。
Pgpool II 在過去幾年中取得了很大進步,添加了很多功能,包括監控和仲裁,所以它提供的不僅僅是連接池。
要選擇那種工具呢?PgBouncer、HAProxy、Pgpool II,還是 PgBouncer 和 HAProxy?答案取決於多種因素,例如要使用 HAProxy,需要考慮是否配置流複製,是否要為讀取和寫入設置單獨的埠等。最後的選擇將取決於具體的使用場景(在某些情況下還有誤用案例!)。
多種原因使 PostgreSQL 成為了一個非常流行的開源資料庫。它被設計為易於使用和可擴展,以滿足廣泛的用戶需求。然而,這種靈活性同時也意味著在使用它時必須審視用法,併在安裝時就考慮有針對性地進行相應的配置。這樣會使應用程式的性能更好,更能使用戶怡然自得,而且從長遠看,還可以節省大量成本。



作者 | Hamid Akhtar       編譯 | 王雪迎

本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/10-common-postgresql-mistakes-and-how-to-avoid-them.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # MySQL調優 ## 資料庫優化常見方案 1. 優化shema,sql語句+索引2. 加緩存,memcached,redis3. 主從複製,讀寫分離4. 垂直拆分5. 水平拆分 為了知道怎麼優化SQL,必須先清楚SQL的生命周期 ## SQL生命周期 1. 應用伺服器連接資料庫伺服器,建立一個T ...
  • 閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。 摘要:Spark Streaming是一種構建在Spark上的實時計算框架,擴展了Spark處理大規模流式數據的能力。本文介 ...
  • SQL中的排序 使用關鍵字:ORDER BY ORDER BY 欄位名後使用ASC升序表示;使用DESC表示降序。 ORDER BY 後面可以使用列的別名進行排序(列的別名只能在ORDER BY中使用,不能再HWERE後使用) WHERE需要再FROM後,ORDER BY前聲明!! 多級排序,ORD ...
  • 1.1 技術發展 redis是用來解決性能問題的資料庫 技術的分類: 解決功能性問題:Java、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN 解決擴展性問題:Struts、Spring、SpringMVC、Hibernate、Mybatis 解決性能問題:NoSQL、Ja ...
  • 研發背景 公司安全部目前針對內部系統的網路訪問日誌的安全審計,大部分都是T+1時效,每日當天,啟動Python編寫的定時任務,完成昨日的日誌審計和檢測,定時任務運行完成後,統一進行企業微信告警推送。這種方案在目前的網路環境和人員規模下,呈現兩個痛點,一是面對日益頻繁的網路攻擊、釣魚鏈接,T+1的定時 ...
  • 摘要:本文就使用springboot結合mybatis plus在項目中實現對GaussDB(DWS)的增刪改查操作。 本文分享自華為雲社區《基於SpringBoot實現操作GaussDB(DWS)的項目實戰【玩轉PB級數倉GaussDB(DWS)】》,作者:清雨小竹。 GaussDB(DWS) 數 ...
  • PS:本教程破解工具均收集於網路,請勿商用,僅供個人學習使用,如有侵權,請聯繫作者刪除。若條件允許,希望大家購買正版 ! 話不多說,直接上乾貨教程!!! 第一步:Get Navicat premium 15安裝包和激活工具 Navicat Premium 15 永久激活工具(親測可用) 第二步:開始 ...
  • EE模塊是搜索系統中改善生態、探索商品的重要鏈路,其目標是緩解數據馬太效應導致模型對商品排序豐富性、探索性不足,帶來的系統非最優解問題。以下分別從模型迭代、線上實驗指標、離線評估體系介紹相應模塊的優化。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...