共用方式為


適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器中的 PgBouncer

適用範圍:適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器

適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器供應專案PgBouncer 作為內建聯機共享解決方案。 PgBouncer 是選擇性功能,您可以根據每一資料庫伺服器啟用。 在公用存取和私人存取網路中,一般用途和記憶體優化計算層都支援它。

PgBouncer 會在與 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器的資料庫伺服器相同的虛擬機上執行。 Postgres 會針對連線使用以進程為基礎的模型,因此維護許多閑置連線的成本很高。 當伺服器執行數千個以上的連線時,Postgres 會進入資源條件約束。 PgBouncer 的主要優點是改善資料庫伺服器的閑置連線和短期連線。

PgBouncer 會使用利用異步 I/O 的輕量型模型。 只有在需要時才使用Postgres連線,也就是在開啟的交易內或當查詢為使用中時。 此模型允許相應增加至 10,000 個連線,且額外負荷較低。

PgBouncer 會在資料庫伺服器上的埠 6432 上執行。 您可以將應用程式的資料庫聯機組態變更為使用相同的主機名,但將埠變更為6432以開始使用PgBouncer,並受益於改善的閑置連線調整。

適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器中的 PgBouncer 支援 Microsoft Entra 驗證

啟用和設定 PgBouncer

若要啟用 PgBouncer,請移至 Azure 入口網站 中的 [伺服器參數] 窗格,搜尋 PgBouncer,並將設定變更pgbouncer.enabledtrue。 不需要重新啟動伺服器。

您可以使用這些參數來設定 PgBouncer 設定。

注意

只有在伺服器參數設定為 truepgbouncer.enabled,才會在 [伺服器參數] 窗格中看到下列 PgBouncer 伺服器參數清單。 否則,他們故意隱藏。

參數名稱 描述 預設
pgbouncer.default_pool_size 將此參數值設定為每個使用者/資料庫配對的連線數目。 50
pgbouncer.ignore_startup_parameters 輸入 PgBouncer 可以忽略的參數逗號分隔清單。 例如,您可以讓 PgBouncer 忽略 extra_float_digits 參數。 允許某些參數;其他人都會引發錯誤。 需要這種能力,才能容忍過度輸入的 Java 資料庫 連線 性(JDBC),以無條件地在啟動封包中設定extra_float_digits=2。 如果您使用的連結函式庫報告錯誤,請使用這個選項, 例如 pq: unsupported startup parameter: extra_float_digits
pgbouncer.max_client_conn 將此參數值設定為您想要支援的 PgBouncer 用戶端連線數目上限。 5000
pgbouncer.max_prepared_statements 當此值設定為非零值 PgBouncer 時,會追蹤用戶端在交易和語句共用模式中傳送的具名備妥語句相關命令的通訊協定層級。 0
pgbouncer.min_pool_size 如果低於此數位,請新增更多伺服器連線至集區。 0
pgbouncer.pool_mode 將此參數值設定為 TRANSACTION 以進行交易共用(這是大部分工作負載的建議設定)。 交易
pgbouncer.query_wait_timeout 允許等候執行的時間上限(以秒為單位) 查詢。 如果查詢在該期間未指派給伺服器,用戶端就會中斷連線。 120
pgbouncer.server_idle_timeout 如果伺服器連線已閑置超過此多秒,則會卸除。 如果為 0,則會停用逾時。 600
pgbouncer.stats_users 允許在 pgBouncer 控制臺上連線並執行唯讀查詢的資料庫使用者逗號分隔清單。

如需 PgBouncer 組態的詳細資訊,請參閱 pgbouncer.ini檔

PgBouncer 的版本

目前,所有支援的引擎主要版本上部署的 PgBouncer 版本(11、12、13、14、15、15、16),適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器為 1.22.1

福利

透過搭配 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器使用內建的 PgBouncer 功能,您可以取得下列優點:

  • 簡化組態的便利性:因為 PgBouncer 與 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器整合,因此不需要個別安裝或複雜的安裝。 您可以直接從伺服器參數進行設定。

  • 受控服務的可靠性:PgBouncer 提供 Azure 受控服務的優點。 例如,Azure 會管理 PgBouncer 的更新。 自動更新不需要手動維護,並確保 PgBouncer 隨時掌握最新的功能和安全性修補程式。

  • 支援各種連線類型:適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器中的 PgBouncer 同時支援公用和私人連線。 您可以根據您的特定需求,使用它透過專用網建立安全連線,或從外部連線。

  • 故障轉移案例中的高可用性:如果在故障轉移期間將待命伺服器升級為主要角色,PgBouncer 會在新升級的待命上順暢地重新啟動。 您不需要對應用程式進行任何變更 連接字串。 這項功能有助於確保持續可用性,並將應用程式連線集區的中斷降到最低。

監視 PgBouncer

計量

適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器提供六個計量來監視 PgBouncer 連線共用:

Display name 計量識別碼 單位 description 維度 默認已啟用
作用中用戶端連線 (預覽) client_connections_active 計數 與 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器連線相關聯的用戶端 連線 DatabaseName No
等候用戶端連線 (預覽) client_connections_waiting 計數 正在等候 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器連線的用戶端 連線 DatabaseName No
作用中伺服器連線 (預覽) server_connections_active 計數 連線 用戶端連線所使用的彈性伺服器 適用於 PostgreSQL 的 Azure 資料庫 DatabaseName No
閒置的伺服器連線 (預覽) server_connections_idle 計數 連線,以 適用於 PostgreSQL 的 Azure 資料庫 閑置且準備好服務新用戶端連線的彈性伺服器 DatabaseName No
集區連線 總計 (預覽) total_pooled_connections 計數 目前集區聯機數目 DatabaseName No
線上集 區數目 (預覽) num_pools 計數 線上集區總數 DatabaseName No

若要深入瞭解,請參閱 PgBouncer 計量

管理員 主控台

PgBouncer 也提供稱為pgbouncer的內部資料庫。 當您連接到該資料庫時,您可以執行 SHOW 命令,以提供 PgBouncer 目前狀態的相關信息。

若要連線到 pgbouncer 資料庫:

  1. pgBouncer.stats_users 參數設定為現有使用者的名稱(例如 myUser),並套用變更。

  2. 以這個使用者身分 連線 至pgbouncer資料庫,並將連接埠設定為 6432

    psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=pgbouncer user=myUser password=myPassword sslmode=require"
    

線上到資料庫之後,請使用 SHOW 命令來檢視 PgBouncer 統計資料:

  • SHOW HELP:列出所有可用的 SHOW 命令。
  • SHOW POOLS:顯示每個集區處於每個狀態的連線數目。
  • SHOW DATABASES:顯示每個資料庫目前套用的連接限制。
  • SHOW STATS:顯示每個資料庫的要求和流量統計數據。

如需 PgBouncer SHOW 命令的詳細資訊,請參閱主控台 管理員

切換您的應用程式以使用 PgBouncer

若要開始使用 PgBouncer,請遵循下列步驟:

  1. 連線 至資料庫伺服器,但使用埠 6432,而不是一般埠 5432。 確認此連線是否正常運作。

    psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=postgres user=myUser password=myPassword sslmode=require"
    
  2. 在 QA 環境中針對 PgBouncer 測試您的應用程式,以確定您沒有任何相容性問題。 PgBouncer 專案提供相容性矩陣,我們建議 大部分的使用者交易共用

  3. 將您的生產應用程式變更為連線到埠 6432,而不是 5432。 監視可能指向相容性問題的任何應用程式端錯誤。

區域備援高可用性中的 PgBouncer

在區域備援高可用性 (HA) 伺服器中,主伺服器會執行 PgBouncer。 您可以透過埠 6432 連線到主伺服器上的 PgBouncer。 故障轉移之後,PgBouncer 會在新升級的待命上重新啟動,而該待命現在是主伺服器。 因此,在故障轉移之後,您的應用程式 連接字串 維持不變。

搭配其他連線集區使用 PgBouncer

在某些情況下,您可能已經有應用程式端連線集區,或已在應用程式端設定 PgBouncer(例如 Azure Kubernetes Service sidecar)。 在這些情況下,內建的 PgBouncer 功能仍然很有用,因為它提供閑置連線調整的優點。

在資料庫伺服器上使用應用程式端集區與 PgBouncer 可能很有説明。 在這裡,應用程式端集區帶來了減少初始連線延遲的優點(因為初始化連線的往返速度要快得多),而資料庫端 PgBouncer 提供閑置的連線調整。

限制

  • 高載伺服器計算層目前不支援 PgBouncer 功能。 如果您將計算層從一般用途或記憶體優化變更為「高載」,就會失去內建的 PgBouncer 功能。

  • 每當在調整作業、HA 故障轉移或重新啟動期間重新啟動伺服器時,PgBouncer 和 VM 也會重新啟動。 您接著必須重新建立現有的連線。

  • 入口網站不會顯示所有 PgBouncer 參數。 啟用 PgBouncer 並儲存參數之後,您必須關閉 [伺服器參數 ] 窗格(例如,選取 [概觀],然後返回 [伺服器參數 ] 窗格。

  • 您無法搭配備妥的語句使用語句集區模式。 目前版本的 PgBouncer 新增了對交易模式內備妥語句的支援。 此支援可透過 max_prepared_statements 參數啟用和設定。 將此參數設定在預設值0上方,將會開啟對備妥語句的支援。 此支援僅適用於通訊協定層級備妥語句。 對於大部分的程式設計語言,這表示我們在用戶端上使用 libpq式 PQprepare ,傳送 PgBouncer 可以攔截的通訊協定層級命令,而不是發出類似於 PREPARE proc AS 的動態 SQL 命令,這會傳送 PgBouncer 無法正確解譯的文字。 若要檢查所選集區模式的其他限制,請參閱 PgBouncer 檔

  • 如果 PgBouncer 部署為功能,它就會變成潛在的單一失敗點。 如果 PgBouncer 功能已關閉,它可能會中斷整個資料庫連線集區,並導致應用程式的停機時間。 若要減輕單一失敗點,您可以在負載平衡器後方設定多個 PgBouncer 實例,以在 Azure VM 上取得高可用性。

  • PgBouncer 是使用單個線程架構的輕量型應用程式。 此設計非常適合大部分的應用程式工作負載。 但在建立大量短期連線的應用程式中,此設計可能會影響 pgBouncer 效能,並限制調整應用程式的能力。 您可能需要嘗試下列其中一種方法:

    • 將連線負載分散到 Azure VM 上的多個 PgBouncer 實例。
    • 請考慮替代解決方案,包括 Azure VM 上的多線程解決方案,例如 PgCat

重要

內建 PgBouncer 功能的參數pgbouncer.client_tls_sslmode已被取代 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器。

透過將伺服器參數ON設定require_secure_transport為 來強制執行連線至 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器的 TLS/SSL 時,會自動強制執行 TLS/SSL 以連線到內建 PgBouncer 功能。 當您建立新的 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例並啟用內建的 PgBouncer 功能時,預設會開啟此設定。 如需詳細資訊,請參閱 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器與私人存取的網路概觀。

對於想要簡化管理、內建高可用性、與容器化應用程式輕鬆連線的客戶,以及使用最熱門的組態參數的能力,內建的 PgBouncer 功能是不錯的選擇。 對於想要多線程延展性、完全控制所有參數和偵錯體驗的客戶,在 Azure VM 上設定 PgBouncer 可能是替代方案。

下一步