Pgbouncer最佳實踐之概念篇

瞭解更多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自身不須要查看整個數據包,因此在網絡開銷上僅爲2k(默認狀況),對系統的內存要求小。
  • 部署靈活:Pgbouncer沒有綁定到一臺後端服務器。目標數據庫能夠駐留在不一樣的主機上。
  • 可維護性強:支持大多數配置項的的在線從新配置;而且支持在線重啓/升級,而不會斷開客戶端鏈接。
  • 認證靈活:用戶認證支持基於文件的驗證方式外,還提供了數據庫查詢驗證;網絡鏈接認證與Postgresql數據庫一致,支持多種模式驗證。
  • 靈活鏈接數:支持全局、數據庫、用戶和客戶端鏈接數組合形式設置。

(注:文中未詳細描述部分,請參見Pgbouncer[1]的官網相關文檔,如配置手冊、使用手冊、FAQ等官方文檔)

前面大體介紹了Pgbouncer的一些特性,詳細特性請查閱(Pgbouncer官網),下面將針對使用Pgbouncer時的一些配置注意事項進行說明,爲Pgbouncer的使用用戶提供一個指引,知足複雜業務需求狀況下充分利用Pgbouncer的特性來實現特定業務場景需求。

在對Pgbouncer進行配置的過程當中,須要特別關注鏈接池模式外,還須要明確數據鏈接數、鏈接方式,最後則是針對不一樣業務場景的Pgbouncer部署形式。

首先討論一下爲何使用鏈接池[2],使用與不使用之間的性能差別,另外討論鏈接池模式的工做流程、細節及一些注意事項進行闡述,最後提供一個適合的鏈接池建議。

在咱們進行Postgresql入門的時候,一般會看到這段介紹「PostgreSQL服務器能夠處理來自客戶端的多個併發鏈接。爲此,它爲每一個鏈接啓動(「fork」)新進程,從那時起,客戶端和新的服務器進程進行通訊,而無需原始postgres進程進行干預。所以,主服務器進程始終在運行,等待客戶端鏈接,而客戶端及關聯的服務器進程來來每每。」可是,這意味着每一個新鏈接都會分叉一個新進程,保留在內存中,並可能在多個會話中變得過度繁忙。在業務量較小的狀況下,這種方式基本能夠知足要求,可是當業務量迅速激增,咱們可能就須要不斷去更改max_connections來知足客戶端的需求。當時一樣也帶來了很大的問題,如頻繁的關閉和建立鏈接形成的內存開銷,管理已產生的大量鏈接等等,最終致使服務器響應緩慢而沒法對外提供數據庫服務。在這樣一個背景下,數據庫鏈接池就被提出來了,對於使用Postgresql數據庫來講,通常分爲客戶端鏈接池,好比c3p0、druid等等;另一種則是服務器端鏈接池,例如pgbouncer、odyssey、pgpoolII等。

image

圖 1 直連數據庫服務器

這是沒有鏈接池的PostgreSQL鏈接生命週期:

  1. 客戶端經過請求並驗證與服務器的鏈接來開始新會話。
  2. 服務器fork一個新的系統進程來處理鏈接和工做會話。會話狀態是經過服務器級,數據庫級和用戶級配置參數的組合進行初始化的。
  3. 客戶經過執行一個或多個事務來完成所需的工做。示例包括:
  • 針對關係(表,視圖等)執行讀寫
  • 使用SET命令更改會話或事務狀態
  • 準備並執行預編譯語句
  1. 當客戶端斷開鏈接時,會話結束。
  2. 服務器銷燬會話進程。

一個數據庫會話包括全部經過單一鏈接的生命週期所作的工做。數據庫會話的時間長度是可變的,而且在客戶端和服務器上消耗的資源數量是可變的。

關鍵點在於:

  • 建立,管理和銷燬鏈接過程會花費時間並消耗資源。
  • 隨着服務器的鏈接數增長,管理這些鏈接所需的資源也隨之增長。此外,隨着客戶端在服務器上進行處理,服務器的每一個進程內存使用量將繼續增加。
  • 因爲單個會話僅服務於單個客戶端,所以客戶端能夠更改數據庫會話的狀態,並但願這些更改在後續的事務中繼續存在。

一個的鏈接池位於客戶端和服務器之間。客戶端鏈接到池管理器,而池管理器鏈接到服務器。引入鏈接池程序會將鏈接模型更改成客戶端代理服務器架構:

image

圖 2 使用鏈接池鏈接數據庫

這使客戶端鏈接生存期與服務器鏈接和進程生存期脫鉤。鏈接池的做用:

  • 接受和管理來自客戶端的鏈接
  • 創建和維護與服務器的鏈接
  • 將服務器鏈接分配給客戶端鏈接

特色:

  • 單個服務器鏈接可處理來自不一樣客戶端的會話,事務和語句
  • 單個客戶端會話的事務和/或語句可在不一樣的服務器鏈接上運行

顯而易見使用鏈接池可以下降服務器的內存開銷,而且有效複用數據庫鏈接,提供了良好的數據庫鏈接性能管理。

做者簡介

原文做者:王志斌,曾得到中國PostgreSQL數據庫管理工程師(PGCE),是PostgreSQL官方認證講師,盤古云課堂特邀金牌講師。

Greenplum相關內容豐富:王曉冉,現任Greenplum研發工程師。研究生畢業於中國科學院軟件所軟件工程專業。目前主要負責gpcopy的研發工做。此前參與了gpkakfa的研發及Postgres Merge工做。

image

相關文章
相關標籤/搜索