PgBouncer簡述

PgBouncer是爲PostgreSQL數據庫提供的一個輕量級的連接池工具。

爲什麼需要數據庫連接池呢?

1、我們知道PostgreSQL是進程模式的數據庫,每次應用程序連接數據庫的時候,PostgreSQL主進程都會fork一個服務進程來爲應用程序服務 ,在關閉連接後,PostgreSQL會自動釋放掉這個進程。這種方式對於不頻繁且連接持有時間較長的生產場景來說,效果是比較好的。但是對於存在大量短連接場景。如果頻繁的創建和銷燬服務進程,那麼會消耗掉比較多的資源。這時我們就需要一個連接池來將後端PostgreSQL數據庫的連接緩存住,在應用程序有新的連接請求過來的時候,連接池工具會將連接池中的一個空閒連接分配給應用程序,應用程序斷開後連接會重新放回連接池中,而不需要創建和銷燬新的連接,從而降低資源的消耗。

2、理論上,如果後臺進程數與服務器的cpu核數相同的時候,cpu的利用率是最高的,因爲cpu不需要再多個進程間進行頻繁的切換。但限制數據庫的連接數與cpu的核數相同是不現實的。一般來說,連接數會設置爲cpu核數的4倍,如果超過4倍,cpu的利用率會大大的下降。然而即使限制連接數是cpu核數的4倍,對於很多應用來說仍然不夠。這時候,連接池的作用就體現出來了,PGBouncer是線程模式,並且允許前端創建多個連接,把前端連接聚合到適量的後端數據庫連接上。

此外,使用PGBouncer還有一些其它原因,比如:

可以對客戶端連接進行限制,預防過多的連接或惡意的連接請求。

PGBouncer使用libevent進行socket通信,通信方式效率更高。

PGBouncer的每個連接僅消耗2KB內存,資源消耗少。


PGBouncer的連接池模式共有三種,分別是會話級、事物級、語句級。

會話級:即session級別連接。客戶端會一直持有這個連接,直到客戶端斷開連接,纔會將連接放回連接池中。

事務級別:Transaction級別。客戶端的每個事物結束後,數據庫連接都會釋放回連接池總,新的事物再從連接池中獲取新的連接。

語句級:statement級別。每執行完一個SQL語句,連接都會釋放回連接池中,再次執行SQL語句,需要再次從連接池中獲取新的連接。這種模式意味着客戶端強制“autocommit”模式。


需注意的是,如果應用中使用了PostgreSQL的二階段提交(prepare statement)、綁定變量那麼必須使用session級別模式,因爲如果使用trasaction或者statement模式,server pool複用時創建的prepared name可能已經被分配給其它的客戶端或者已經不存在了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章