連接池是管理數據庫連接的軟件組件。這可以通過多種方式幫助提高資源利用率,幫助實現負載平衡或故障轉移,並且可以大大減少事務時間。在這篇博文中,我們將瞭解什麼是連接池以及如何配置它。
連接池是一個軟件組件管理數據庫連接。這可以通過多種方式幫助提高資源利用率,幫助實現負載平衡或故障轉移,並且可以大大減少事務時間。在這篇博文中,我們將瞭解什麼是連接池以及如何配置它。
什麼是連接池以及它爲何有用
打開與數據庫的連接需要許多步驟。我們需要連接到服務器並執行初始握手,就加密和連接設置達成一致,然後在所有層(網絡驅動程序、操作系統層、數據庫層等)中保留新的連接資源。每個連接都會消耗內存,內存大小取決於數據庫引擎。對於 PostgreSQL,一個連接甚至可以使用 1.3MB 內存。打開連接也需要時間,因爲我們需要協商新連接的設置。
如果我們不斷爲每個 SQL 查詢打開新連接,可能會導致數據庫服務器出現多個問題:
打開連接需要時間和資源,因此我們的交易速度較慢
我們可能會超出活動連接的限制(默認情況下可以設置爲某個值)像一百個連接)
數據庫可能會消耗更多內存,這可能會對緩存命中率和可用於查詢的可用內存產生負面影響
而不是打開每個 SQL 查詢都有一個新連接,我們可以池化連接。我們可以配置連接池來保留連接數量併爲所有客戶端重用它們。這樣我們的應用程序連接到池化器而不是直接連接數據庫,然後池化器連接到數據庫。這帶來了多個優點:
連接池使連接保持打開狀態的時間更長,從而減少了數據庫端打開和關閉連接的開銷並減少了延遲。
我們可以在連接之間甚至數據庫之間實現負載平衡,從而提高性能。
池化器可以維持穩定的連接數量,因此我們可以避免這個問題活動連接過多,會減少資源使用。
池化器可以重定向主服務器和備用服務器之間的連接,以提供故障轉移,從而提高穩定性和可擴展性。
池化器可以將密碼存儲到數據庫的中央位置,從而提高安全性。
池化器可以緩存結果以提高查詢性能。
連接池也有一些缺點:
它是我們系統中可能成爲故障點的另一個組件。
由於應用程序和數據庫之間的另一個網絡躍點,網絡延遲可能會略有增加。
低效的連接池可能會成爲瓶頸。
我們需要調整和維護連接池,這增加了維護負擔。
不同類型的連接池
有很多實現連接池的方法。在本節中,我們將瞭解各種實現細節。
外部或內部連接池
在典型情況下,我們從應用程序連接到數據庫。我們現在可以將連接池放在兩個位置之一:應用程序本身或應用程序和數據庫之間的某個位置。
將連接池放在應用程序中(應用程序端連接池)可以非常容易因爲許多 ORM 或數據庫驅動程序都支持開箱即用。例如,JDBC 支持 c3p0,而 ODBC 支持開箱即用。這帶來了很多好處。我們不需要安裝和維護任何額外的組件,因爲池化器位於應用程序內部。我們只需要部署應用程序的新版本,然後就可以準備好池化了。這也減少了網絡延遲,因爲我們沒有任何額外的網絡躍點(一切都位於我們的應用程序內部)。
不幸的是,應用程序端連接池有一些缺點。最大的一個是它僅針對一個應用程序進行配置。如果我們有很多應用程序(尤其是在分佈式環境中),那麼我們需要在很多地方配置池化器。更不用說我們仍然可能達到服務器端的連接計數限制,因爲池化器彼此不瞭解。擁有許多連接池也會導致更高的資源使用率,並且通常性能較低。
我們還可以使用位於應用程序和數據庫之間的外部連接池。這可以與任意數量的應用程序一起使用,並讓我們能夠精確控制連接限制。集中式連接池還可以更好地控制資源,讓我們實現故障轉移或負載分配。
外部連接池也有一些缺點。首先也是最重要的,它是我們需要隨着時間的推移安裝、配置、調整和維護的另一個組件。我們還需要重新配置每個應用程序以使用連接池(這應該像更改一些連接字符串並重新部署應用程序一樣簡單)。外部池化器還會增加一些網絡延遲,因爲它是應用程序和數據庫之間的另一個網絡組件。
外部連接池化器也可能成爲故障點。如果池化器由於某種原因而關閉,應用程序將無法再連接到數據庫。如果池化器速度緩慢或效率低下,則會影響所有使用它的應用程序。因此,池化器必須具有高質量,纔不會降低整體性能。
池化類型
每個池化器需要決定如何將連接分配給客戶端。通常有三種方法。
第一種是會話池。在這種方法中,連接在會話持續時間內分配給客戶端(直到客戶端斷開連接或達到超時)。這是最簡單的方法,但是,這有效地限制了客戶端數量,因爲通常每個客戶端消耗一個連接。
下一個解決方案是事務池。在此方法中,池程序爲每個事務分配連接,並且僅在事務持續時間內分配連接。如果客戶端想要運行另一個事務,他們需要獲得另一個連接(並且可能需要等待其他連接可用)。這允許池化器處理更多客戶端,並且是推薦的方法。
最後一種方法是爲每個 SQL 語句獨立分配連接。理論上,這會帶來最高的靈活性和連接利用率。但是,這會導致一項事務跨越多個連接。由於許多事務設置與連接相關,這可能會成爲技術限制。
連接池解決方案
根據您使用的數據庫類型,可能有一些內置的解決方案,或者您可能需要手動配置它們。讓我們看一些示例。
內置解決方案
根據您的基礎設施提供商,您也許能夠使用內置或近內置解決方案:
Neon PostgreSQL 數據庫有一個內置的 PgBouncer
Supabase 有一個內置的 Supavisor
適用於 PostgreSQL 的 Azure 數據庫支持內置 PgBouncer
DigitalOcean 的 PostgreSQL 包括 PgBouncer
Azure 數據庫可與 ProxySql
Azure 數據庫可與 Heimdall 數據庫代理一起使用
ADO.NET 支持內置連接池
Oracle 支持通用連接池對於 JDBC
Oracle 自治數據庫支持數據庫駐留連接池
外部解決方案
您可以使用許多外部解決方案使用:
Amazon RDS 代理
Pgpool
PgBouncer
奧德賽
Heimdall 數據庫代理
ProxySQL
pgcat
案例研究:配置 PgBouncer
在此示例中,我們將研究 PgBouncer。
我們首先按照文檔中的方式安裝它。
然後我們需要配置它。最重要的設置是:
pool_mode:如何處理連接;我們可以使用事務
max_client_conn:配置可以連接到連接池的客戶端數量
default_pool_size:配置允許多少個服務器連接對於每個用戶數據庫
min_pool_size:要保留多少個備用連接
配置池化器後,我們可以使用pgbench驗證其性能:
pgbench -c 10 -p -j 2 -t 1000 database_name登錄後複製
PgBouncer 可以輕鬆地將每秒事務數增加 60%,如基準測試所示:
對 PostgreSQL 連接池進行基準測試:PgBouncer、PgCat和 Supavisor
通過連接池提高數據庫性能
使用 PgBouncer 增強 PostgreSQL
總結
連接池可以提高性能並減少資源消耗。有許多內置解決方案可以輕鬆地與我們的數據庫一起使用,無論我們將它們託管在哪裏以及我們使用什麼數據庫引擎。我們需要記住,連接池是另一個故障點,需要小心處理。配置良好的連接池可以使每秒的事務數量增加近一倍,從而極大地提高性能。
以上就是配置連接池的詳細內容,更多請關注本站其它相關文章!