適用於 PostgreSQL 的 Azure 資料庫彈性伺服器實例提供PgBouncer作為內建連線池解決方案。 PgBouncer 是選用功能,您可以單獨為每個資料庫伺服器啟用。 在公用存取和私人存取網路中,一般用途和記憶體最佳化計算層都支援該功能。
PgBouncer 運行在與你 適用於 PostgreSQL 的 Azure 資料庫 靈活伺服器實例資料庫伺服器相同的虛擬機器(VM)上。 Postgres 會針對連線使用流程型模型,因此維護許多閒置連線的成本就會很昂貴。 伺服器執行數千個以上的連線時,Postgres 就會發生資源約束。 PgBouncer 的主要優點是可改善資料庫伺服器上的閒置連線和短期連線。
PgBouncer 會使用輕量型模型,並利用該模型的非同步 I/O。 它只在需要時使用 Postgres 連線——也就是在開啟的交易中或查詢正在進行時。 此模型允許相應增加至 10,000 個連線,且具有較低的額外負荷。
在所有支援的主要版本引擎上,適用於 PostgreSQL 的 Azure 資料庫 部署的 PgBouncer 版本為 1.25.1。 PgBouncer 會在資料庫伺服器上的連接埠 6432 上執行。 您可以將應用程式的資料庫連線組態變更為使用相同的主機名稱,但將連接埠變更為 6432 以開始使用 PgBouncer,並從改善的閒置連線調整獲益。
適用於 PostgreSQL 的 Azure 資料庫 的 PgBouncer 支援 Microsoft Entra 認證(Azure AD)。
啟用及設定 PgBouncer
PgBouncer 在頻繁連線變換可能會降低效能的交易式應用程式中特別有用。 預設在 6432 埠啟用,你可以用和 PostgreSQL 伺服器相同的主機名稱連接,但埠號是 6432,而不是預設的 5432。
要啟用 PgBouncer,請到 Azure 入口網站的 Server 參數,搜尋 PgBouncer,並將 pgbouncer.enabled 設定改為 true。 不需要重新啟動伺服器。
您可以使用這些參數來設定 PgBouncer。
備註
只有當 伺服器參數設定為 pgbouncer.enabled 時,[伺服器參數]true 窗格才會顯示下列 PgBouncer 伺服器參數清單。 否則,參數為故意隱藏起來。
| 參數名稱 | Description | 預設 |
|---|---|---|
pgbouncer.default_pool_size |
允許每個使用者/資料庫配對的伺服器連線數目。 | 50 |
pgbouncer.ignore_startup_parameters |
PgBouncer 可以忽略的參數逗號分隔清單,因為這些參數將由管理員處理。 | |
pgbouncer.max_client_conn |
允許的用戶端連線數目上限。 | 5000 |
pgbouncer.max_prepared_statements |
當此值設為非零值時,PgBouncer 會在交易和陳述式共用模式下,追蹤客戶端所傳送的協議層級具名準備語句相關命令。 | 0 |
pgbouncer.min_pool_size |
如果低於此數字,請新增更多伺服器連線至集區。 | 0 |
pgbouncer.pool_mode |
指定其他用戶端可以重複使用伺服器連線的時機。 | 交易 |
pgbouncer.query_wait_timeout |
允許查詢等候執行的時間上限 (以秒為單位)。 如果查詢未在該期間指派給伺服器,用戶端就會中斷連線。 | 120 |
pgbouncer.server_idle_timeout |
如果伺服器連線已閒置超過這麼多秒,即會將其卸除。 如果為 0,則會停用逾時。 | 600 |
pgbouncer.stats_users |
允許在 pgBouncer 控制台上連線並執行唯讀查詢的資料庫使用者逗號分隔清單。 |
如需 PgBouncer 組態的詳細資訊,請參閱 pgbouncer.ini 文件。
優點
透過在 適用於 PostgreSQL 的 Azure 資料庫 靈活伺服器實例中使用內建的 PgBouncer 功能,您可以獲得以下好處:
簡化配置的便利性:由於 PgBouncer 已整合於您適用於 PostgreSQL 的 Azure 資料庫靈活的伺服器實例中,您不需要獨立安裝或複雜的設定。 您可以直接從伺服器參數對其進行設定。
託管服務的可靠性:PgBouncer 提供Azure託管服務的優勢。 例如,Azure 管理 PgBouncer 的更新。 自動更新讓您不再需要手動維護,並確保 PgBouncer 隨時維持在最新狀態,提供最新的功能和安全性修補程式。
支援多種連線類型:PgBouncer in 適用於 PostgreSQL 的 Azure 資料庫 提供公共與私人連線支援。 您可以根據特定需求,用其建立私人網路或從外部連線的安全連線。
容錯移轉案例中的高可用性:如果在容錯移轉期間將待命伺服器升級為主要角色,PgBouncer 會在新升級的待命上流暢地重新啟動。 你不需要對應用程式的 連接字串 做任何更改。 這項功能有助於確保持續可用性,並將應用程式連線集區的中斷降到最低。
監視 PgBouncer
Metrics
您可以使用 PgBouncer 計量以監視 PgBouncer 程序的效能,包含使用者連線、閒置連線、集區連線總計和連線集區數目的詳細資料。 每個計量都會以 1 分鐘的間隔發出,而且可保留最多 93 天的歷程記錄。 客戶可以設定計量的警示,也可以存取新的計量維度以按資料庫名稱分割和篩選計量資料。
如何啟用 PgBouncer 計量
- 若要監視 PgBouncer 計量,請確定已透過伺服器參數啟用
pgbouncer.enabled功能,並啟用 metrics 參數metrics.pgbouncer_diagnostics。 - 這些參數是動態,不需要執行個體重新啟動。
- PgBouncer 指標預設為停用。
PgBouncer 指標清單
| 顯示名稱 | 計量識別碼 | 單位 | Description | 尺寸 | 預設為啟用 |
|---|---|---|---|---|---|
| 主動用戶端連線 | client_connections_active |
Count | 與 適用於 PostgreSQL 的 Azure 資料庫 靈活伺服器連線相關聯的客戶端連線。 | DatabaseName | 否 |
| 等待用戶端連線 | client_connections_waiting |
Count | 正在等候 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器提供服務的用戶端連線。 | DatabaseName | 否 |
| 主動伺服器連線 | server_connections_active |
Count | 正在由用戶端連線使用中的 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器連線。 | DatabaseName | 否 |
| 閒置伺服器連線 | server_connections_idle |
Count | 處於閒置狀態、且已準備好為新的用戶端連線提供服務的 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器連線。 | DatabaseName | 否 |
| 集區式連線總數目 | total_pooled_connections |
Count | 目前集區式連線的數目。 | DatabaseName | 否 |
| 連線集區的總數目 | num_pools |
Count | 連線集區的總數目。 | DatabaseName | 否 |
使用 PgBouncer 指標的考量
- 使用 DatabaseName 維度的 PgBouncer 計量有 30 個資料庫限制。
- 在「可高載」SKU 上,限制為 10 個具有 DatabaseName 維度的資料庫。
- DatabaseName 維度限制會套用在 OID 資料行上,以反映資料庫建立的順序。
欲了解更多資訊,請參閱 PgBouncer 指標。
日誌
適用於 PostgreSQL 的 Azure 資料庫 Flexible Server 提供 PgBouncer 日誌,協助你稽核連線池活動並排解連線中斷、認證失敗或池池耗盡等問題。 PgBouncer 日誌包含認證失敗、連線生命週期事件、錯誤及伺服器狀態變更等細節。 這些細節有助於識別連線瓶頸與行為異常。
啟用日誌
啟用日誌診斷設定,自動發送 PgBouncer 日誌。 Log Analytics 支援兩種結構類型:Azure 診斷 以及 資源特定。 欲了解更多資訊,請參閱Azure 資源記錄的通用和服務專屬架構。
Azure 診斷架構
- 日誌會出現在表格中
AzureDiagnostics。 - 使用篩選功能:
Category == "PostgreSQLFlexPGBouncer"。
- 日誌會出現在表格中
資源特定結構描述
- 日誌會出現在表格中
PGSQLPgBouncer。 - 查詢更容易,格式結構化。
- 日誌會出現在表格中
範例 KQL 查詢
Azure 診斷架構:
AzureDiagnostics
| where Category == "PostgreSQLFlexPGBouncer"
| where LogicalServerName_s =~ "your-server-name"
| order by TimeGenerated desc
資源特定結構描述:
PGSQLPgBouncer
| where _ResourceId =~ "your-server-name"
| order by TimeGenerated desc
備註
欄位名稱和結構格式可能會因所用架構(合併型與 Resource-Specific型)略有差異。
管理主控台
PgBouncer 也提內部資料庫,其稱為 pgbouncer。 連線至資料庫之後,您可以執行 SHOW 命令,以提供關於 PgBouncer 目前狀態的資訊。
若要連線至 pgbouncer 資料庫:
將
pgBouncer.stats_users參數設定為現有使用者的名稱 (例如myUser),並套用變更。以這個使用者身分連線至
pgbouncer資料庫,並將連接埠設為6432:psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=pgbouncer user=myUser password=<password> sslmode=require"
連接資料庫後,請使用 SHOW 指令查看 PgBouncer 統計資料:
-
SHOW HELP:列出所有可用的SHOW命令。 -
SHOW POOLS:顯示每個集區中每個狀態的連線數目。 -
SHOW DATABASES:顯示每個資料庫目前套用的連線限制。 -
SHOW STATS:針對每個資料庫顯示要求和流量的統計資料。
如需 PgBouncer SHOW 命令的詳細資訊,請參閱管理主控台。
將您的應用程式切換為使用 PgBouncer
若要開始使用 PgBouncer,請遵循下列步驟:
連線到您的資料庫伺服器,但使用連接埠 6432,而不是一般連接埠 5432。 確認此連線是否正常運作。
psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=postgres user=myUser password=<password> sslmode=require"在 QA 環境中針對 PgBouncer 測試您的應用程式,確保您沒有任何相容性問題。 PgBouncer 專案提供相容性矩陣,針對大部分的使用者,我們的建議是使用交易集區。
將您的生產應用程式變更為連線至連接埠 6432,而不是 5432。 監視可能指向相容性問題的任何應用程式端錯誤。
區域備援高可用性中的 PgBouncer
在區域備援高可用性 (HA) 的伺服器中,主要伺服器會執行 PgBouncer。 您可以透過連接埠 6432 連線至主要伺服器上的 PgBouncer。 在容錯移轉之後,系統會在新提升的待命伺服器上重新啟動 PgBouncer,而該伺服器現在是主要伺服器。 因此,在故障轉移後,你的應用程式連線字串會保持不變。
具有彈性叢集的 PgBouncer
PgBouncer 也適用於彈性叢集。 彈性叢集中的每個節點都有自己的 PgBouncer 實例。 啟用後,6432 埠會路由到彈性叢集協調節點上的 PgBouncer。 此外,埠 8432 會路由到叢集中工作節點上運行的 PgBouncer 實例。
局限性
- PgBouncer 功能目前不支援 Burstable 伺服器運算層級。 如果您將計算層從「一般用途」或「記憶體最佳化」變更為「可高載」,您將失去內建的 PgBouncer 功能。
- 每當伺服器在擴展操作、HA 故障轉移或重啟時重新啟動,系統也會同時重啟 PgBouncer 和虛擬機。 接著你需要重新建立現有的連結。
- 入口網站不會顯示所有 PgBouncer 參數。 啟用 PgBouncer 並儲存參數後,你需要關閉 伺服器參數 窗格(例如選擇 概覽),然後回到 伺服器參數 面板查看所有參數。
- 您無法搭配備妥陳述式使用陳述式集區模式。 目前版本的 PgBouncer 新增了在交易模式下的預備語句支援。 此支援可透過 max_prepared_statements 參數啟用與設定。 將此參數設於預設值 0 以上,即可啟用對預備語句的支援。 此支援僅適用於通訊協定層級的備妥陳述式。 對大多數程式語言而言,這種支援意味著應用程式在用戶端使用 libpq 函式 PQprem ,發送協定層級指令,PgBouncer 能攔截,而非發出類似 PREPARE proc AS 的動態 SQL 指令,後者會傳送 PgBouncer 無法正確解讀的文字。 若要檢查所選取集區模式的其他限制,請參閱 PgBouncer 文件。
- 如果你把 PgBouncer 當作功能部署,它就可能成為單一故障點。 若 PgBouncer 功能已關閉,其可能會中斷整個資料庫連線集區,並導致應用程式的停機。 為了減少單點故障,你可以在負載平衡器後面設置多個 PgBouncer 實例,以在 Azure VM 上提供高可用性。
- PgBouncer 是使用單一執行緒架構的輕量型應用程式。 此設計非常適合大部分的應用程式工作負載。 但在產生大量短暫連線的應用程式中,這種設計可能會影響 PgBouncer 的效能,並限制你擴展應用程式的能力。 您可能需要嘗試下列其中一種方法:
- 將連線負載分散到多個 Azure 虛擬機上的 PgBouncer 實例。
- 考慮替代方案,包括多執行緒解決方案,如PgCat,適用於Azure虛擬機。
這很重要
內建 PgBouncer 功能的參數 pgbouncer.client_tls_sslmode 在 適用於 PostgreSQL 的 Azure 資料庫 中已被棄用。
當你將 require_secure_transport 伺服器參數設為 ON,以強制 TLS/SSL 用於連接到 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例時,TLS/SSL 也會自動強制用於連接內建的 PgBouncer 功能。 當你建立新的 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例並啟用內建的 PgBouncer 功能時,這個設定預設會開啟。 欲了解更多資訊,請參閱適用於 PostgreSQL 的 Azure 資料庫 中的 TLS 安全連線。
對於想要簡化管理、內建高可用性、與容器化應用程式輕鬆連線的客戶,以及可使用最熱門的組態參數,內建的 PgBouncer 功能是不錯的選擇。 對於想要多執行緒可擴展性、完全控制所有參數以及除錯體驗的客戶來說,在 Azure VM 上設置 PgBouncer 可能是個替代方案。