pgbouncer 是一款開源的輕量級資料庫連線管理工具,可以快取資料庫連線,減少不斷建立新資料庫連線帶來的效能損失。
pgbouncer可以直接用來管理greenplum 的資料庫連線。greeplum的資料庫安裝包裡面已包含它,使用者可以直接使用。使用者名稱和要連線的資料庫組成key, pgbouncer 會為不同的key建立不同的連線池(每個連線池中連線的使用者和資料庫是相同的),pgbouncer內部中可維護多個連線池。當客戶端請求乙個新連線的時,若對應的連線池中有空閒的連線,則直接復用,否則為其建立乙個新的連線,但如果連線池中的連線數已到上限,則client端需等待;當客戶端關閉連線的時候,pgbouncer 則把連線**再利用。
使用pgbouncer 連線greenplum的資料庫和連線postgres的用法一樣, 只不過pgbouncer連線greenplum的時候,連線的是master 節點。
pgbouncer包含psql-like的管理工具。有管理許可權的使用者使用psql 連線pgbouncer中虛擬的資料庫pgbouncer, 可檢視連線池中狀態及管理pgbouncer。
pgbouncer作為postgresql資料庫的連線池中介軟體。與其他存在於postgresql的連線池中介軟體不同,pgbouncer僅作為乙個連線池和**層為postgresql和應用之間提供服務。
pgbouncer具備例如連線池模式、連線型別、埠重用,應用場景以及使用者認證、網路認證等多種重要特性,下面將逐一講述,並期望為讀者提供乙份在實施過程中使用的配置指南。
資料庫連線池在pgbouncer中包括會話連線池、事務連線池、語句連線池三種方式。
1、會話連線池
官方解釋為最有禮貌的方法。當客戶端連線時,伺服器連線將在其保持連線的整個過程中分配給它。當客戶端斷開連線時,伺服器連線將重新放入池中。此模式支援所有postgesql功能。
2、事務連線池
伺服器連線僅在事務期間分配給客戶端。當pgbouncer發現事務已結束時,伺服器連線將被放回池中。該模式破壞了postgresql的一些基於會話的功能。僅當應用程式通過協作使用不中斷功能時,才可以使用它。有關不相容的功能。
3、語句連線池
官方解釋為最激進的方法。不允許多語句事務。本質上為了在客戶端上強制執行「自動提交」模式,主要針對pl/proxy。
另外支援其他特性包括:
前面大致介紹了pgbouncer的一些特性,詳細特性請查閱(pgbouncer官網),下面將針對使用pgbouncer時的一些配置注意事項進行說明,為pgbouncer的使用使用者提供乙個指引,滿足複雜業務需求情況下充分利用pgbouncer的特性來實現特定業務場景需求。
在對pgbouncer進行配置的過程中,需要特別關注連線池模式外,還需要明確資料連線數、連線方式,最後則是針對不同業務場景的pgbouncer部署形式。
首先討論一下為什麼使用連線池[2],使用與不使用之間的效能差異,另外討論連線池模式的工作流程、細節及一些注意事項進行闡述,最後提供乙個適合的連線池建議。
在我們進行postgresql入門的時候,通常會看到這段介紹「postgresql伺服器可以處理來自客戶端的多個併發連線。為此,它為每個連線啟動(「fork」)新程序,從那時起,客戶端和新的伺服器程序進行通訊,而無需原始postgres程序進行干預。因此,主伺服器程序始終在執行,等待客戶端連線,而客戶端及關聯的伺服器程序來來往往。」但是,這意味著每個新連線都會分叉乙個新程序,保留在記憶體中,並可能在多個會話中變得過分繁忙。在業務量較小的情況下,這種方式基本可以滿足要求,但是當業務量迅速激增,我們可能就需要不斷去更改max_connections來滿足客戶端的需求。當時同樣也帶來了很大的問題,如頻繁的關閉和建立連線造成的記憶體開銷,管理已產生的大量連線等等,最終導致伺服器響應緩慢而無法對外提供資料庫服務。在這樣乙個背景下,資料庫連線池就被提出來了,對於使用postgresql資料庫來說,一般分為客戶端連線池,比如c3p0、druid等等;另外一種則是伺服器端連線池,例如pgbouncer、odyssey、pgpoolii等。
這是沒有連線池的postgresql連線生命週期:
1. 客戶端通過請求並驗證與伺服器的連線來開始新會話。
2. 伺服器fork乙個新的系統程序來處理連線和工作會話。會話狀態是通過伺服器級,資料庫級和使用者級配置引數的組合進行初始化的。
3. 客戶通過執行乙個或多個事務來完成所需的工作。示例包括:
4. 當客戶端斷開連線時,會話結束。
5. 伺服器銷毀會話程序。
乙個資料庫會話包括所有通過單一連線的生命週期所做的工作。資料庫會話的時間長度是可變的,並且在客戶端和伺服器上消耗的資源數量是可變的。
關鍵點在於:
乙個的連線池位於客戶端和伺服器之間。客戶端連線到池管理器,而池管理器連線到伺服器。引入連線池程式會將連線模型更改為客戶端**伺服器架構:
這使客戶端連線生存期與伺服器連線和程序生存期脫鉤。連線池的作用:
特點:顯而易見使用連線池能夠降低伺服器的記憶體開銷,並且有效復用資料庫連線,提供了良好的資料庫連線效能管理。
作者簡介
王曉冉,現任greenplum研發工程師。研究生畢業於中國科學院軟體所軟體工程專業。目前主要負責gpcopy的研發工作。此前參與了gpkakfa的研發及postgres merge工作。
最佳實踐 Flutter 最佳實踐
最佳實踐是乙個領域可以接受的專業標準,對於任何程式語言來說,提高 質量 可讀性 可維護性和健壯性都非常重要。讓我們探索一些設計和開發flutter應用程式的最佳實踐。class enum typedef和extension應採用駝峰命名uppercamelcase規則。class mainscree...
OssImport系列之四 最佳實踐
本文主要介紹,ossimport在典型場景下應用,典型需求的實現。ossimport有 單機模式 和 分布式模式 兩種部署方式。對於小於30tb的小規模資料資料遷移,單機模式即可完成。對於大規模的資料遷移,請使用分布式模式。worker有限流功能,通過修改配置檔案sys.properties的配置項...
JUnit最佳實踐
junit最佳實踐 cherami 轉貼 參與分 20053,專家分 4960 發表 2003 9 16 下午7 57 版本 1.0 閱讀 3899次 martin fowler說過 當你試圖列印輸出一些資訊或除錯乙個表示式時,寫一些測試 來替代那些傳統的方法。一開始,你會發現你總是要建立一些新的f...