瞭解更多Greenplum技術乾貨,歡迎訪問Greenplum中文社區網站
Pgbouncer 是一款開源的輕量級數據庫鏈接管理工具,能夠緩存數據庫鏈接,減小不斷創建新數據庫鏈接帶來的性能損失。sql
PgBouncer能夠直接用來管理Greenplum 的數據庫鏈接。Greeplum的數據庫安裝包裏面已包含它,用戶能夠直接使用。用戶名和要鏈接的數據庫組成key, PgBouncer 會爲不一樣的key建立不一樣的鏈接池(每一個鏈接池中鏈接的用戶和數據庫是相同的),PgBouncer內部中可維護多個鏈接池。當客戶端請求一個新鏈接的時,若對應的鏈接池中有空閒的鏈接,則直接複用,不然爲其建立一個新的鏈接,但若是鏈接池中的鏈接數已到上限,則client端需等待;當客戶端關閉鏈接的時候,PgBouncer 則把鏈接回收再利用。數據庫
接下來咱們將經過系列文章來爲你們講解Pgbouncer的最佳實踐,以及Pgbouncer在Greenplum中的應用。後端
使用PgBouncer 鏈接Greenplum的數據庫和鏈接Postgres的用法同樣, 只不過PgBouncer鏈接Greenplum的時候,鏈接的是master 節點。數組
PgBouncer包含psql-like的管理工具。有管理權限的用戶使用psql 鏈接PgBouncer中虛擬的數據庫pgbouncer, 可查看鏈接池中狀態及管理PgBouncer。緩存
PgBouncer做爲PostgreSQL數據庫的鏈接池中間件。與其餘存在於PostgreSQL的鏈接池中間件不一樣,PgBouncer僅做爲一個鏈接池和代理層爲PostgreSQL和應用之間提供服務。服務器
Pgbouncer具有例如鏈接池模式、鏈接類型、端口重用,應用場景以及用戶認證、網絡認證等多種重要特性,下面將逐一講述,並指望爲讀者提供一份在實施過程當中使用的配置指南。網絡
數據庫鏈接池在Pgbouncer中包括會話鏈接池、事務鏈接池、語句鏈接池三種方式。架構
一、會話鏈接池併發
官方解釋爲最有禮貌的方法。當客戶端鏈接時,服務器鏈接將在其保持鏈接的整個過程當中分配給它。當客戶端斷開鏈接時,服務器鏈接將從新放入池中。此模式支持全部PostgeSQL功能。工具
二、事務鏈接池
服務器鏈接僅在事務期間分配給客戶端。當PgBouncer發現事務已結束時,服務器鏈接將被放回池中。該模式破壞了PostgreSQL的一些基於會話的功能。僅當應用程序經過協做使用不中斷功能時,纔可使用它。有關不兼容的功能。
三、語句鏈接池
官方解釋爲最激進的方法。不容許多語句事務。本質上爲了在客戶端上強制執行「自動提交」模式,主要針對PL/Proxy。
另外支持其餘特性包括:
(注:文中未詳細描述部分,請參見Pgbouncer[1]的官網相關文檔,如配置手冊、使用手冊、FAQ等官方文檔)
前面大體介紹了Pgbouncer的一些特性,詳細特性請查閱(Pgbouncer官網),下面將針對使用Pgbouncer時的一些配置注意事項進行說明,爲Pgbouncer的使用用戶提供一個指引,知足複雜業務需求狀況下充分利用Pgbouncer的特性來實現特定業務場景需求。
在對Pgbouncer進行配置的過程當中,須要特別關注鏈接池模式外,還須要明確數據鏈接數、鏈接方式,最後則是針對不一樣業務場景的Pgbouncer部署形式。
首先討論一下爲何使用鏈接池[2],使用與不使用之間的性能差別,另外討論鏈接池模式的工做流程、細節及一些注意事項進行闡述,最後提供一個適合的鏈接池建議。
在咱們進行Postgresql入門的時候,一般會看到這段介紹「PostgreSQL服務器能夠處理來自客戶端的多個併發鏈接。爲此,它爲每一個鏈接啓動(「fork」)新進程,從那時起,客戶端和新的服務器進程進行通訊,而無需原始postgres進程進行干預。所以,主服務器進程始終在運行,等待客戶端鏈接,而客戶端及關聯的服務器進程來來每每。」可是,這意味着每一個新鏈接都會分叉一個新進程,保留在內存中,並可能在多個會話中變得過度繁忙。在業務量較小的狀況下,這種方式基本能夠知足要求,可是當業務量迅速激增,咱們可能就須要不斷去更改max_connections來知足客戶端的需求。當時一樣也帶來了很大的問題,如頻繁的關閉和建立鏈接形成的內存開銷,管理已產生的大量鏈接等等,最終致使服務器響應緩慢而沒法對外提供數據庫服務。在這樣一個背景下,數據庫鏈接池就被提出來了,對於使用Postgresql數據庫來講,通常分爲客戶端鏈接池,好比c3p0、druid等等;另一種則是服務器端鏈接池,例如pgbouncer、odyssey、pgpoolII等。
圖 1 直連數據庫服務器
這是沒有鏈接池的PostgreSQL鏈接生命週期:
一個數據庫會話包括全部經過單一鏈接的生命週期所作的工做。數據庫會話的時間長度是可變的,而且在客戶端和服務器上消耗的資源數量是可變的。
關鍵點在於:
一個的鏈接池位於客戶端和服務器之間。客戶端鏈接到池管理器,而池管理器鏈接到服務器。引入鏈接池程序會將鏈接模型更改成客戶端代理服務器架構:
圖 2 使用鏈接池鏈接數據庫
這使客戶端鏈接生存期與服務器鏈接和進程生存期脫鉤。鏈接池的做用:
特色:
顯而易見使用鏈接池可以下降服務器的內存開銷,而且有效複用數據庫鏈接,提供了良好的數據庫鏈接性能管理。
做者簡介
原文做者:王志斌,曾得到中國PostgreSQL數據庫管理工程師(PGCE),是PostgreSQL官方認證講師,盤古云課堂特邀金牌講師。
Greenplum相關內容豐富:王曉冉,現任Greenplum研發工程師。研究生畢業於中國科學院軟件所軟件工程專業。目前主要負責gpcopy的研發工做。此前參與了gpkakfa的研發及Postgres Merge工做。