一、PgBouncer

PgBouncer介紹

PgBouncer是為PostgreSQL提供的輕量級(jí)連接池工具,作用如下:

  1. 能夠緩存和PostgreSQL的連接,當(dāng)有連接請(qǐng)求進(jìn)來(lái)的時(shí)候,直接分配空閑進(jìn)程,而不需要PostgreSQL fork出新進(jìn)程來(lái)建立連接,以節(jié)省創(chuàng)建新進(jìn)程,創(chuàng)建連接的資源消耗。
  2. 能夠有效提高連接的利用率,避免過(guò)多的無(wú)效連接,導(dǎo)致數(shù)據(jù)庫(kù)消耗資源過(guò)大,CPU占用過(guò)高。
  3. 對(duì)客戶端連接進(jìn)行限制,預(yù)防過(guò)多或惡意的連接請(qǐng)求。

輕量級(jí)體現(xiàn)在:

  1. 使用libevent進(jìn)行socket同學(xué),通信效率高。
  2. C語(yǔ)言編寫(xiě),效率高,每個(gè)連接僅消耗2kB內(nèi)存

基本概念

支持三種連接池模型:

  1. session,會(huì)話級(jí)連接,連接生命周期里,連接池分配一個(gè)數(shù)據(jù)庫(kù)連接,客戶端斷開(kāi)連接時(shí),連接放回連接池。
  2. transaction, 事務(wù)級(jí)連接,客戶端的每個(gè)事務(wù)結(jié)束時(shí),數(shù)據(jù)庫(kù)連接就會(huì)重新釋放回連接池,在執(zhí)行一個(gè)事務(wù)時(shí),就需要從連接池重新獲得一個(gè)連接。
  3. statement,語(yǔ)句級(jí)別連接 ,執(zhí)行完一個(gè)SQL語(yǔ)句時(shí),連接就會(huì)釋放回連接池,再次執(zhí)行一個(gè)SQL語(yǔ)句時(shí),需要重新從連接池里獲取連接,這種模式意味客戶端需要強(qiáng)制“autocommit”模式。

PgBouncer安裝方法

  1. 在Linux發(fā)行版中,包含已經(jīng)編譯好的PgBouncer,可以直接安裝。RHEL/CentOS平臺(tái)直接使用yum命令來(lái)安裝。Debian/Ubuntu平臺(tái)下,直接使用apt-get命令安裝。

  2. 在官網(wǎng)http://pgfoundry.org上下載源碼編譯安裝,需要先安裝libevent依賴(lài)。

PgBouncer的簡(jiǎn)單使用

  1. 簡(jiǎn)單配置
    簡(jiǎn)單介紹PgBouncer的配置文件pgbouncer.ini,后面詳細(xì)介紹具體配置。
    使用系統(tǒng)自帶工具安裝的PgBouncer的配置文件路徑是/etc/pgbouncer/pgbouncer.ini,默認(rèn)的配置和含義如下:
[databases]
[pgbouncer]
logfile = /var/log/pgbouncer/pgbouncer.log          # 日志文件位置
pidfile = /var/run/pgbouncer/pgbouncer.pid          # pid文件位置
listen_addr = 127.0.0.1                             # 監(jiān)聽(tīng)的地址
listen_port = 6432                                  # 監(jiān)聽(tīng)的端口
auth_type = trust                                   # 認(rèn)證方式
auth_file = /etc/pgbouncer/userlist.txt             #  認(rèn)證文件
admin_users = postgres                              # 管理員用戶名
stats_users = stats, postgres                       #  狀態(tài)用戶?stats和postgres
pool_mode = session                                 # 池的模式,默認(rèn)session級(jí)別
server_reset_query = DISCARD ALL                    # 
max_client_conn = 100                               # 最大連接用戶數(shù),客戶端到pgbouncer的鏈接數(shù)量
default_pool_size = 20                         # 默認(rèn)池大小,表示建立多少個(gè)pgbouncer到數(shù)據(jù)庫(kù)的連接

默認(rèn)情況下配置任何數(shù)據(jù)庫(kù)信息,需要我們添加一些簡(jiǎn)單的信息。從上面還可以看到,配置主要分為兩部分,第一部分是[databases]區(qū)域,是用來(lái)配置數(shù)據(jù)庫(kù)連接相關(guān)信息的。第二部分是[pgbouncer],是pgbouncer自身的配置。

下面來(lái)看一個(gè)[databases]部分配置的示例:

forcedb = host=127.0.0.1  port=3000  user=baz  password=foo  client_encoding=UNIODE datestyle=ISO connect_query='SELECT 1'

它的基本格式是:
對(duì)外提供的數(shù)據(jù)庫(kù)名 = host=主機(jī)IP port=端口 user=用戶 password=密碼
其他的規(guī)則都類(lèi)似,數(shù)據(jù)庫(kù)名后面的等號(hào)旁邊要有空格隔開(kāi),后面每個(gè)成對(duì)的數(shù)值之間用空格隔開(kāi)。這里面的主機(jī)和端口指的是PostgreSQL監(jiān)聽(tīng)的地址和端口,而用戶和密碼就是用來(lái)連接PostgreSQL數(shù)據(jù)庫(kù)的用戶名和密碼。

我們根據(jù)這個(gè)格式來(lái)建一個(gè)我們自己的配置:

testdb =  host=192.168.1.244  port=5433 user=dbuser  password=yourpassword connect_query='SELECT 1'

下面的[pgbouncer]區(qū)域就使用默認(rèn)配置,這個(gè)默認(rèn)配置里,我們需要說(shuō)一下下面這兩個(gè)配置:

auth_type = trust                                   # 認(rèn)證方式
auth_file = /etc/pgbouncer/userlist.txt             #  認(rèn)證文件

第一行是用于配置登錄pgbouncer的認(rèn)證方式的,和PostgreSQL認(rèn)證方式相同,默認(rèn)是trust,即所有的都信任,還可以使用md5加密的形式。第二行是用于配置認(rèn)證用戶的,即連接pgbouncer的用戶名都保存在該文件中。當(dāng)?shù)谝恍性O(shè)置為md5加密時(shí),則加密的密碼也必須保存在第二行配置的文件中。如果這個(gè)文件不存在,那么登錄的時(shí)候,無(wú)論是哪個(gè)用戶,都會(huì)提示下面的錯(cuò)誤:

-bash-4.2$ psql -p 6432 testdb -h 127.0.0.1
psql: ERROR:  No such user: postgres
-bash-4.2$ psql -p 6432 testdb -h 127.0.0.1 -U dbuser 
psql: ERROR:  No such user: dbuser

而這個(gè)認(rèn)證文件默認(rèn)情況下是沒(méi)有的,因此需要手動(dòng)生成。在PostgreSQL的9.x版本中,所有的用戶密碼都是保存在pg_shadow表里。PostgreSQL 8.x版本則是保存在數(shù)據(jù)庫(kù)目錄下,可以直接復(fù)制過(guò)來(lái)使用。我們使用的9.5版本,因此需要手動(dòng)生成這個(gè)文件。生成這個(gè)認(rèn)證文件有兩種方式,分別是SQL語(yǔ)句方式和pgbouncer自帶的mkauth.py腳本生成。

我們來(lái)看下兩種生成方式:
(1)SQL語(yǔ)句生成認(rèn)證文件
之前我們說(shuō)過(guò),用戶密碼默認(rèn)是保存在pg_shadow表里的,如下面所示:

postgres=# select usename, passwd from pg_shadow order by 1; 
 usename  |               passwd                
----------+-------------------------------------
 dbuser   | md5baa6c789c3728a1a449b82005eb54a19
 postgres | 

usename和passwd兩列里面保存的就是我們需要的賬號(hào)和密碼,我們使用copy命令將它們導(dǎo)出來(lái):

postgres=# copy (select usename, passwd from pg_shadow order by 1) to '/var/lib/pgsql/9.5/auth_file';
COPY 2

我們打開(kāi)這個(gè)auth_file文件,內(nèi)容如下:

dbuser  md5baa6c789c3728a1a449b82005eb54a19
postgres        \N

里面保存有postgres的賬號(hào),一般不要使用這個(gè)超級(jí)管理員的身份,最好刪掉。然后保留可以連接數(shù)據(jù)庫(kù)的用戶賬號(hào)和加密后的密碼,將這個(gè)文件轉(zhuǎn)移到上面配置項(xiàng)指定的位置。并且文件名稱(chēng)要和上面變量里定義的文件名一致,否則會(huì)提示找不到這個(gè)文件。最后還要注意的一點(diǎn)是,默認(rèn)導(dǎo)出的文件里用戶名和密碼的格式pgbouncer無(wú)法識(shí)別,需要用雙引號(hào)引起來(lái),如下所示:

"dbuser"  "md5baa6c789c3728a1a449b82005eb54a19"

這樣才能正確識(shí)別。

(2)使用mkauth.py來(lái)生成文件
這個(gè)文件是使用python編寫(xiě)的一個(gè)小腳本,已經(jīng)賦予了可執(zhí)行權(quán)限。執(zhí)行的時(shí)候需要兩個(gè)參數(shù),基本格式是:

/etc/pgbouncer/mkauth.py   用戶列表文件   "數(shù)據(jù)庫(kù)連接參數(shù)"

我們來(lái)看一個(gè)示例:

/etc/pgbouncer/mkauth.py  /etc/pgbouncer/userlist.txt   "host=127.0.0.1  user=postgres password=123456"

這里比較重要的是后面那一段參數(shù),=號(hào)兩邊不能有空格,兩個(gè)鍵值對(duì)之間要用空格隔開(kāi),不能用逗號(hào),否則會(huì)報(bào)錯(cuò)。用戶必須是有查詢pg_shadow表權(quán)限的用戶請(qǐng)記住這里的限制條件。

如果沒(méi)有錯(cuò)誤的話,就會(huì)在/etc/pgbouncer/目錄下生成userlist.txt文件。文件內(nèi)容如下所示:

"dbuser" "md5baa6c789c3728a1a449b82005eb54a19" ""
"postgres" "" ""

默認(rèn)會(huì)備份出PostgreSQL數(shù)據(jù)庫(kù)的pg_shadow表里的所有數(shù)據(jù)庫(kù),包括postgres用戶。所有的用戶名和密碼都會(huì)用雙引號(hào)引起來(lái),比手動(dòng)備份要方便的多。這里唯一麻煩的就是腳本后面的連接字符串。

  1. 啟動(dòng)pgbouncer
    當(dāng)用戶文件配置好以后,就可以啟動(dòng)pgbouncer來(lái)使用了。
    使用linux發(fā)行版自帶的包管理工具安裝pgbouncer的時(shí)候,它會(huì)自動(dòng)創(chuàng)建一個(gè)pgbouncer用戶,而如果是自己編譯的話,則需要手動(dòng)創(chuàng)建這個(gè)用戶。創(chuàng)建完成以后。需要切換到這個(gè)用戶下來(lái)啟動(dòng)pgbouncer,pgbouncer是不允許在root用戶下啟動(dòng)的。

切換完成后,它的啟動(dòng)命令格式是:
pgbouncer -d /etc/pgbouncer/pgbouncer.ini
-d 表示是以后后臺(tái)進(jìn)程的方式運(yùn)行,后面跟的是配置文件的路徑。啟動(dòng)完成,pgbouncer默認(rèn)監(jiān)聽(tīng)6432端口。

然后就可以使用psql來(lái)登錄了。

  1. 停止pgbouncer
    目前pgbouncer還沒(méi)有自主停止的腳本或者命令,只能通過(guò)kill命令來(lái)停止。格式是:
    cat /var/run/pgbouncer/pgbouncer.pid | xargs kill -9

  2. 連接信息的查看
    pgbouncer對(duì)外提供了一個(gè)虛擬數(shù)據(jù)庫(kù)pgbouncer,之所以成為虛擬數(shù)據(jù)庫(kù),是因?yàn)樗梢蕴峁┫馪ostgreSQL那樣的數(shù)據(jù)庫(kù)操作界面,但是這個(gè)數(shù)據(jù)庫(kù)卻并不是真實(shí)存在的。而是pgbouncer虛擬出來(lái)的一個(gè)命令行界面。登錄命令是:

psql -p 6432  pgbouncer

登錄以后可以使用show help命令查看所有的幫助命令信息,常用的兩個(gè)命令是:

  1. show clients 用來(lái)查看客戶端連接信息
  2. show pools 用來(lái)查看連接池信息

這篇文章主要講解了pgbouncer的基本介紹,基本配置以及簡(jiǎn)單的使用。下一篇文章繼續(xù)說(shuō)pgbouncer的配置文件,熟悉它的高級(jí)配置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,869評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,941評(píng)論 6 342
  • feisky云計(jì)算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,904評(píng)論 0 5
  • 一轉(zhuǎn)眼小寶貝已經(jīng)一歲多了,感覺(jué)時(shí)間過(guò)得很快,一直以來(lái)小家伙的抵抗力比較差,差不多每個(gè)月都會(huì)有點(diǎn)不舒服,每當(dāng)看到他...
    D067_小偉_佛山閱讀 184評(píng)論 0 5
  • ———袁少 這嬌羞的太陽(yáng) 轉(zhuǎn)眼火焰般滾燙 空中彌漫幸福的灰塵 跨過(guò)小憩的庇蔭 嗜血毒刺來(lái)襲 地上獠牙絆腳 背帶深嵌...
    君照閱讀 365評(píng)論 0 0