適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器中的 PgBouncer
適用於: 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器
適用於 PostgreSQL 的 Azure 資料庫彈性伺服器會將 PgBouncer 提供為內建連線共用解決方案。 PgBouncer 是選用功能,您可以單獨為每個資料庫伺服器啟用。 在公用存取和私人存取網路中,一般用途和記憶體最佳化計算層都支援該功能。
PgBouncer 會在與適用於 PostgreSQL 的 Azure 資料庫伺服器彈性伺服器相同的虛擬機器 (VM) 上執行。 Postgres 會針對連線使用流程型模型,因此維護許多閒置連線的成本就會很昂貴。 伺服器執行數千個以上的連線時,Postgres 就會發生資源約束。 PgBouncer 的主要優點是可改善資料庫伺服器上的閒置連線和短期連線。
PgBouncer 會使用輕量型模型,並利用該模型的非同步 I/O。 其僅會在需要時才使用 Postgres 連線,也就是在開放交易內或查詢為使用中時使用。 此模型允許相應增加至 10,000 個連線,且具有較低的額外負荷。
PgBouncer 會在資料庫伺服器上的連接埠 6432 上執行。 您可以將應用程式的資料庫連線組態變更為使用相同的主機名稱,但將連接埠變更為 6432 以開始使用 PgBouncer,並從改善的閒置連線調整獲益。
適用於 PostgreSQL 的 Azure 資料庫中的 PgBouncer 彈性伺服器支援 Microsoft Entra 驗證 (Azure AD)。
啟用和設定 PgBouncer
若要啟用 PgBouncer,請前往 Azure 入口網站中的 [伺服器參數] 窗格,搜尋 PgBouncer,並將 pgbouncer.enabled
設定變更為 true
。 不需要重新啟動伺服器。
您可以使用這些參數來設定 PgBouncer。
注意
只有當 pgbouncer.enabled
伺服器參數設定為 true
時,[伺服器參數] 窗格才會顯示下列 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 的版本
目前,在適用於 PostgreSQL 的 Azure 資料庫彈性伺服器中,所有支援的主要引擎版本 (16、15、14、13、12、11) 上部署的 PgBouncer 版本均為 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
資料庫:
將
pgBouncer.stats_users
參數設定為現有使用者的名稱 (例如myUser
),並套用變更。以這個使用者身分連線至
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,請遵循下列步驟:
連線到您的資料庫伺服器,但使用連接埠 6432,而不是一般連接埠 5432。 確認此連線是否正常運作。
psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=postgres user=myUser password=myPassword sslmode=require"
在 QA 環境中針對 PgBouncer 測試您的應用程式,確保您沒有任何相容性問題。 PgBouncer 專案提供相容性矩陣,針對大部分的使用者,我們的建議是使用交易集區。
將您的生產應用程式變更為連線至連接埠 6432,而不是 5432。 監視可能指向相容性問題的任何應用程式端錯誤。
區域備援高可用性中的 PgBouncer
在區域備援高可用性 (HA) 的伺服器中,主要伺服器會執行 PgBouncer。 您可以透過連接埠 6432 連線至主要伺服器上的 PgBouncer。 容錯移轉之後,PgBouncer 會在新升級的待命伺服器上重新啟動,也就是新的主要伺服器。 因此,您的應用程式連接字串在容錯移轉後會維持不變。
使用 PgBouncer 搭配其他連線集區
在某些情況下,您可能已有應用程式端連線集區,或已在應用程式端設定 PgBouncer (例如 Azure Kubernetes Service 側車)。 在這些情況下,內建的 PgBouncer 仍很有用,因為其可提供閒置連線調整的優勢。
在資料庫伺服器上使用應用程式端集區搭配 PgBouncer 可能很有幫助。 在此處,應用程式端集區具有減少初始連線延遲的優勢 (因為連線的初始往返速度快很多),而資料庫端 PgBouncer 會提供閒置連線調整。
限制
PgBouncer 功能目前不支援高載伺服器計算層。 如果您將計算層從「一般用途」或「記憶體最佳化」變更為「可高載」,您將失去內建的 PgBouncer 功能。
每當調整作業、高可用性容錯移轉或重新啟動期間而重新啟動伺服器時,PgBouncer 和 VM 也會重新啟動。 因此,您必須重新建立現有的連線。
入口網站不會顯示所有 PgBouncer 參數。 啟用 PgBouncer 並儲存參數之後,您必須結束 [伺服器參數] 窗格 (例如,選取 [概觀]),然後返回 [伺服器參數] 窗格。
您無法搭配備妥陳述式使用陳述式集區模式。 目前版本的 PgBouncer 已新增支援交易模式內的備妥陳述式。 此支援可透過 max_prepared_statements 參數啟用和設定。 將此參數設定高於預設值的 0 ,將會啟用對備妥陳述式的支援。 此支援僅適用於通訊協定層級的備妥陳述式。 對於大部分的程式設計語言,這表示我們在用戶端上使用 libpq 函式 PQprepare,傳送 PgBouncer 可以攔截的通訊協定層級命令,而不是發出類似於 PREPARE proc AS 的動態 SQL 命令,該命令會傳送 PgBouncer 無法正確解譯的文字。 若要檢查所選取集區模式的其他限制,請參閱 PgBouncer 文件。
若 PgBouncer 部署為功能,其就會變成潛在的單一失敗點。 若 PgBouncer 功能已關閉,其可能會中斷整個資料庫連線集區,並導致應用程式的停機。 若要減輕單一失敗點,您可以在負載平衡器後方設定多個 PgBouncer 執行個體,以在 Azure VM 上取得高可用性。
使用 AAD 驗證的權杖大小限制 - 因為權杖大小限制,所以具有大量群組成員資格的使用者將無法透過 PgBouncer 進行連線。 具有少量群組的應用程式、服務和使用者可以運作。
PgBouncer 是使用單一執行緒架構的輕量型應用程式。 此設計非常適合大部分的應用程式工作負載。 但在建立大量短期連線的應用程式中,此設計可能會影響 pgBouncer 效能,並限制調整應用程式的能力。 您可能需要嘗試下列其中一種方法:
- 將連線負載分散至 Azure VM 上的多個 PgBouncer 執行個體。
- 請考慮替代解決方案,包括 Azure VM 上的 PgCat 等多執行緒解決方案。
重要
適用於內建 PgBouncer 功能的 pgbouncer.client_tls_sslmode
參數已在適用於 PostgreSQL 的 Azure 資料庫彈性伺服器受到取代。
當適用於 PostgreSQL 的 Azure 資料庫彈性伺服器的 TLS/SSL 連線透過將 require_secure_transport
伺服器參數設定為 ON
強制執行時,會自動強制執行 TLS/SSL 以連線至內建 PgBouncer 功能。 當您建立新的適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體並啟用內建的 PgBouncer 功能時,預設會啟用此設定。 如需詳細資訊,請參閱適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器並搭配私人存取的網路概觀。
對於想要簡化管理、內建高可用性、與容器化應用程式輕鬆連線的客戶,以及可使用最熱門的組態參數,內建的 PgBouncer 功能是不錯的選擇。 對於想要多執行緒可擴縮性、完全控制所有參數和偵錯體驗的客戶,在 Azure VM 上設定 PgBouncer 可能是替代方案。