[pgbouncer]使用druid鏈接pgbouncer時候 unsupported startup parameter: extra_float_digits

前言

最近換用了pgbouncer作爲數據庫池,然而出現了問題,
druid初始化時候報錯:

unsupported startup parameter: extra_float_digits

好了,解決方案:
pgbouncer的安裝使用

2012-12-11 19:36:44.881 19072 WARNING C-0x3620a20: (nodb)/(nouser)@172.65.20.35:55419 Pooler Error: Unsupported startup parameter: extra_float_digits 
報錯很明顯,有一個參數不支持, unsupported startup parameter  extra_float_digits ,pgbouncer中有一個參數是可以忽略啓動參數的,叫ignore_startup_parameters 

處理辦法: 
修改配置文件pgbouncer.ini,在[pgbouncer]下面新增一行 
ignore_startup_parameters = extra_float_digits 
重啓pgbouncer,再次查看日誌,該參數已被忽略,測試數據正常。 

其實,在ini裏面已經有這個說明了:
在這裏插入圖片描述

參考文章抄錄

由於 PostgreSQL 採用進程模式,大量連接對數據庫性能會產生較大影響,在大量連接情況下, 
一般會在數據庫和應用程序之間配置 pgbouncer,pgbouncer 可以配置在數據庫主機上,也可以配置在 
單獨一臺服務器上,但是採用了 pgbouncer 後,在維護方面和以前會有些區別 

================================================================================ 
說白了就是一連接池。現在有好多模塊,plproxy,pgpool什麼的,都有這功能。pgbouncer與之相比,最大的好處是簡單,小型。 
如果不需要負載均衡什麼的功能,用pgbouncer就足夠了。 

PgBouncer的特點 
    a.內存消耗低(默認爲2k/連接),因爲Bouncer不需要每次都接受完整的數據包 
    b.可以把不同的數據庫連接到一個機器上,而對客戶端保持透明 
    c.支持在線的重新配置而無須重啓 

/////////////////////////////////////////////////////////////////////// 
實際操作: 
環境: 
centos 6.5  64位 
pg  9.1.1 
pgbouncer 1.5.4  最新版本 
libevent 2.0.22 

1.下載pgbouncer的安裝包 
http://pgfoundry.org/frs/?group_id=1000258&release_id=1952 

    
2.下載libevent包 
http://monkey.org/~provos/libevent/ 
這玩意也是個好東西,在很多地方用到 


3.安裝libevent 
[root@pgtina packages]# wget http://192.168.10.100/pgbouncer-1.5.4.tar.gz 
[root@pgtina packages]# tar -xzvf pgbouncer-1.5.4.tar.gz 
[root@pgtina packages]# ll 
total 1176 
drwxr-xr-x.  8 1000 1000   4096 Jan  5  2015 libevent-2.0.22-stable 
-rw-r--r--.  1 root root 854987 Nov 12 14:51 libevent-2.0.22-stable.tar.gz 
drwxr-xr-x. 10 1000 1000   4096 Nov 28  2012 pgbouncer-1.5.4 
-rw-r--r--.  1 root root 339610 Nov 12 14:46 pgbouncer-1.5.4.tar.gz 


cd /root/packages/ 
cd libevent-2.0.22-stable 
./configure --prefix=/home/pgsql/libevent 
make 
make install 



4.安裝pgbouncer 

/root/packages/pgbouncer-1.5.4 
./configure --prefix=/home/pgsql/pgbouncer/ --with-libevent=/home/pgsql/libevent/ 
make 
make install 
查看pgbouncer是否安裝成功,可以通過查看config.log中最後的返回值exit來確認,0是成功1是失敗. 

[root@pgtina pgbouncer-1.5.4]# tail -5 config.log 
#define HAVE_EVENT_BASE_NEW 1 
#define HAVE_EVDNS_BASE_NEW 1 
#define USE_EVDNS 1 

configure: exit 0    ----安裝成功 

二.配置 
修改屬主: 
drwxr-xr-x. 5 root     root     4096 Nov 12 15:05 libevent 
drwxr-xr-x. 4 root     root     4096 Nov 12 15:07 pgbouncer 
[root@pgtina pgsql]# chown -R postgres:postgres pgbouncer/ 
[root@pgtina pgsql]# chown -R postgres:postgres libevent/ 

1.配置pgbouncer的cfg文件 
cp /root/packages/pgbouncer-1.5.4/etc/pgbouncer.ini  /home/pgsql/pgbouncer/ 
chown postgres:postgres pgbouncer.ini 


[postgres@localhost config]$ pwd 
/home/postgres/pgbouncer/config 
[postgres@localhost config]$ more pgbouncer.ini 
[databases] 

yunwei = host=192.168.12.250 port=5432 user=postgres  password=1qaz@WSX68 dbname=yunwei pool_size=100 
tm_samples = host=192.168.12.250 port=5432 user=postgres  password=1qaz@WSX68 dbname=tm_samples pool_size=30 

[databases] 
yunwei = host=192.168.12.250 port=5432 user=postgres  password=** dbname=yunwei pool_size=50 

[pgbouncer] 
listen_port = 1999 
listen_addr = 192.168.12.250 
auth_type = md5 
auth_file = /home/pgsql/pgbouncer/user.txt 
logfile = /home/pgsql/pgbouncer/pgbouncer.log 
pidfile = /home/pgsql/pgbouncer/pgbouncer.pid 
admin_users = root 
pool_mode = Transaction 

//////////可選參數 
max_client_conn = 100 
default_pool_size = 900 
reserve_pool_timeout = 0 
reserve_pool_size = 30 
server_reset_query = DISCARD ALL; 
admin_users = pgadmin 
stats_users = pgstats 
ignore_startup_parameters = extra_float_digits,application_name,geqo 
stats_period = 30 
server_idle_timeout,max_connections也比較重要,後期再寫。 
md5: 基於md5的密碼驗證,auth_file中需要有普通文本和md5值兩種形式的密碼; 
    crypt: 基於crypt的密碼驗證(man 3 crypt), auth_file必須包含文本密碼; 
    plain: 明文驗證方式; 
    trust: 不進行驗證,但auth_file依然需要保存用戶名; 
    any: 也不進行驗證,而且auth_file中不需要保存用戶名了。但此種方式需要在pg_template1中明確說明用戶名進行真實數據庫的登錄。 
    如: pg_template1 = host=127.0.0.1 user=exampleuser dbname=template1.否則會報錯的。 
admin_users:列出哪些用戶可以登錄pgbouncer進行管理,以逗號進行分隔 
stats_users:列出哪些用戶可以登錄pgbouncer進行只讀操作,如可以列出服務器狀態,訪問鏈接等,但是不能執行reload。 
///////// 


2.配置用戶密碼文件users.txt 
[postgres@pgtina pgbouncer]$ more user.txt 
"root" "tina" 
"postgres"  "test12" 
"fenxi" "fenxi" 
"sqluser" "sqlpassword" 


三.啓動 
1.啓動命令 
[postgres@pgtina ~]$ /home/pgsql/pgbouncer/bin/pgbouncer -d /home/pgsql/pgbouncer/pgbouncer.ini 

如果報錯: 
error while loading shared libraries: libevent-2.0.so.5: 

就安裝兩個包: 
[root@pgtina libevent-2.0.22-stable]# yum install libevent 
[root@pgtina libevent-2.0.22-stable]# yum install libevent-devel 

[postgres@pgtina ~]$ /home/pgsql/pgbouncer/bin/pgbouncer -d /home/pgsql/pgbouncer/pgbouncer.ini 
2015-11-12 15:46:56.901 16634 LOG File descriptor limit: 1024 (H:4096), max_client_conn: 100, max fds possible: 130   ---啓動成功 

2.查看日誌 
[root@pgtina pgbouncer]# ll 
total 28 
drwxr-xr-x. 2 postgres postgres 4096 Nov 12 15:32 bin 
-rw-r--r--. 1 postgres postgres 5832 Nov 12 15:35 pgbouncer.ini 
-rw-rw-r--. 1 postgres postgres  438 Nov 12 15:47 pgbouncer.log 
-rw-r--r--. 1 postgres postgres    5 Nov 12 15:46 pgbouncer.pid 
drwxr-xr-x. 4 postgres postgres 4096 Nov 12 15:32 share 
-rw-r--r--. 1 postgres postgres   39 Nov 12 15:35 user.txt 
tail -f /home/postgres/pgbouncer/pgbouncer.log 

3.登錄 
[postgres@pgtina ~]$ psql -h 192.168.12.250 -p 1999 -U postgres -d yunwei     ---連接的時候一定要帶-h ip 
Password for user postgres: 
psql (9.1.1) 
Type "help" for help. 

yunwei=# \d 
                        List of relations 
Schema |               Name                |   Type   |  Owner   
--------+-----------------------------------+----------+---------- 
public | ali_download_daily                | view     | postgres 
public | am_android_wildmob_ru             | table    | postgres 
public | am_android_wildmob_ru_id_seq      | sequence | postgres 


4.參數使用例子 
連接pgbouncer本身的DB 
[postgres@pgtina pgbouncer]$ psql -h 192.168.12.250 -p 1999 -U root -d pgbouncer    --注意端口跟數據庫的本身端口要區分開,密碼就是tina ,且連接的時候一定要帶-h ip 
Password for user root: 
psql (9.1.1, server 1.5.4/bouncer) 
WARNING: psql version 9.1, server version 1.5. 
         Some psql features might not work. 
Type "help" for help. 

pgbouncer=# show help; 
NOTICE:  Console usage 
DETAIL:  
SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|VERSION 
SHOW STATS|FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM 
SHOW DNS_HOSTS|DNS_ZONES 
SET key = arg 
RELOAD 
PAUSE [<db>] 
RESUME [<db>] 
KILL <db> 
SUSPEND 
SHUTDOWN 
SHOW 



Pgbouncer 三中模式: 
1.session pooling:一個客戶端連接對應一個服務器連接。客戶端斷開,服務器連接回收到連接池中。是默認的模式,每開啓一個進程,DB端也會開啓一個新的進程 
2.transaction pooling:服務器連接在一個事務裏是纔給予客戶端,事務結束,連接回收回連接池。 
3.statement pooling:不允許多語句的事務,最激進的模式。主要給pl/proxy使用。是基於每個查詢的,開啓此模式不適合執行事務,會報錯 


Show config; #查看相關配置 
Show stats; 
Show lists;#查看連接相關信息,如,數據庫個數,空閒連接數等等 
Show pools;#查看池中連接信息 
Show databases;#查看相關數據庫 
Show clients; #查看連接數 
如果修改了配置文件,那麼需要reload重新加載 
pgbouncer=# reload; 
RELOAD 



Pgbouncer是一個針對PostgreSQL數據庫的輕量級連接池,任何目標應用都可以把 pgbouncer 當作一個 PostgreSQL 服務器來連接,然後pgbouncer 會處理與服務器連接,或者是重用已存在的連接。 
pgbouncer 的目標是降低因爲新建到 PostgreSQL 的連接而導致的性能損失。 


pgbouncer=# show databases; 
    name    |   host    | port |  database  | force_user | pool_size | reserve_pool 
------------+-----------+------+------------+------------+-----------+-------------- 
mvds_url   | 192.168.12.250 | 5432 | mvds_url   | postgres   |        50 |            0 
pgbouncer  |           | 1999 | pgbouncer  | pgbouncer  |         2 |            0 
tm_samples | 192.168.12.250 | 5432 | tm_samples | postgres   |        30 |            0 
yunwei     | 192.168.12.250 | 5432 | yunwei     | postgres   |       100 |            0 



===== 
2012-12-11 19:36:44.881 19072 WARNING C-0x3620a20: (nodb)/(nouser)@172.65.20.35:55419 Pooler Error: Unsupported startup parameter: extra_float_digits 
報錯很明顯,有一個參數不支持, unsupported startup parameter  extra_float_digits ,pgbouncer中有一個參數是可以忽略啓動參數的,叫ignore_startup_parameters 

處理辦法: 
修改配置文件pgbouncer.ini,在[pgbouncer]下面新增一行 
ignore_startup_parameters = extra_float_digits 
重啓pgbouncer,再次查看日誌,該參數已被忽略,測試數據正常。 

======== 

5.連接數測試 
psql -U sqluser -d dw_report -p 1999 
psql -U postgres -d devops -p 1999 
Password for user postgres: 
psql (9.1.1) 
Type "help" for help. 

devops=# select * from pg_tables where schemaname='public'; 
schemaname |  tablename   | tableowner | tablespace | hasindexes | hasrules | hastriggers 
------------+--------------+------------+------------+------------+----------+------------- 
public     | t_test_wubao | postgres   |            | f          | f        | f 



pgbouncer=# show clients; 
type |  user   | database  | state  |   addr    | port  | local_addr | local_port |    connect_time     |    request_time     |   ptr    | link 
------+---------+-----------+--------+-----------+-------+------------+------------+---------------------+---------------------+----------+------ 
C    | fenxi   | devops    | active | unix      |  1999 | unix       |       1999 | 2015-11-12 16:19:36 | 2015-11-12 16:19:45 | 0xc71b88 | 
C    | sqluser | dw_report | active | unix      |  1999 | unix       |       1999 | 2015-11-12 16:21:07 | 2015-11-12 16:21:35 | 0xc71cf0 | 
C    | root    | pgbouncer | active | 127.0.0.1 | 54713 | 127.0.0.1  |       1999 | 2015-11-12 15:59:48 | 2015-11-12 16:21:41 | 0xc71a20 | 
(3 rows) 

pgbouncer=# show pools; 
database  |   user    | cl_active | cl_waiting | sv_active | sv_idle | sv_used | sv_tested | sv_login | maxwait 
-----------+-----------+-----------+------------+-----------+---------+---------+-----------+----------+--------- 
devops    | postgres  |         1 |          0 |         0 |       0 |       1 |         0 |        0 |       0 
dw_report | postgres  |         1 |          0 |         0 |       0 |       1 |         0 |        0 |       0 
pgbouncer | pgbouncer |         1 |          0 |         0 |       0 |       0 |         0 |        0 |       0 
yunwei    | postgres  |         0 |          0 |         0 |       0 |       0 |         0 |        0 |       0 



如果是通過 pgsql -h 127.0.0.1 -p 6000 -U readonly pgbouncer 方式登錄,在執行reload時就會提示“ERROR:  admin access needed”的錯誤信息了。 
7. 如何停止 
     以admin登錄pgbouncer, 執行shutdown即可。 
     
     
     
     
===========================================================    
區別一 pg_hba.conf 功能減弱 
      採用了 pgbouncer 卑鄙,pg_hba.conf 功能減弱,這裏說減弱,是因爲原庫上 pg_hba.conf 
可以配置,但已經形同虛設,不能發揮原有的作用,因爲可以配置原庫上的 pg_hba.conf ,配置 
成只允許 pgbouncer,原庫 pg_hba.conf 配置如下。 

# TYPE  DATABASE        USER            ADDRESS                 METHOD 
# "local" is for Unix domain socket connections only 
local   all             all                                     trust 

#Pgbouncer IP 
host all all 192.168.1.10/32 md5 

     儘管在原庫上配置了 pg_hba.conf ,只允許 pgbouncer主機連庫, 但是不能限制其它IP通過 
pg_bouncer  連接數據庫,從這個角度來說,採用 pgbouncer 無疑是增加了安全漏洞,當然可以 
採用其它措施彌補。 


區別二 主庫上無法查詢應用服務器 IP 
     
         在數據庫維護過程中,經常需要查詢某個庫的業務服務器IP信息,查詢哪些服務器在連接數據庫, 
採用了 pgbouncer 後,這方面的查詢沒以前方便,例如在主庫上查詢連接 skytf 庫的客戶端 IP 信息, 
如下所示: 
postgres=# select datname,usename ,client_addr,client_port from pg_stat_activity where datname='skytf'; 
  datname  |  usename  |   client_addr   | client_port 
-----------+-----------+-----------------+------------- 
skytf | skytf | 192.168.1.10 |       32119 
skytf | skytf | 192.168.1.10 |       18583 
skytf | skytf | 192.168.1.10 |       31723 
skytf | skytf | 192.168.1.10 |       32363 
skytf | skytf | 192.168.1.10 |       58929 
skytf | skytf | 192.168.1.10 |       58930 
skytf | skytf | 192.168.1.10 |       58931 
skytf | skytf | 192.168.1.10 |       58932 
skytf | skytf | 192.168.1.10 |       58933 
skytf | skytf | 192.168.1.10 |       58934 
skytf | skytf | 192.168.1.10 |       58935 
skytf | skytf | 192.168.1.10 |       58936 
skytf | skytf | 192.168.1.10 |       58937 
skytf | skytf | 192.168.1.10 |       58938 
    

     從上面查詢結果來看,上面的 clietn_addr 只顯示 pgbouncer 的 IP,而無法顯示真正的客戶端 IP, 
那麼如何獲取客戶端的IP呢? 有兩種方法: 

--4 方法一: 登陸 pgbouncer 控制檯獲取客戶端IP信息 
            登陸 pgbouncer 控制檯,並且執行 "show clients" 命令。 

postgres@db> psql -h 127.0.0.1 -p 1922  pgbouncer pgbouncer_admin 
psql (9.1.2, server 1.4.2/bouncer) 
WARNING: psql version 9.1, server version 1.4. 
         Some psql features might not work. 
Type "help" for help. 

pgbouncer=# show clients; 
type |      user       |  database  | state  |         addr          | port  |       local_addr       | local_port |    connect_tim 
e     |    request_time     |    ptr     |    link    
------+-----------------+------------+--------+-----------------------+-------+------------------------+------------+--------------- 
------+---------------------+------------+------------ 
C    | skytf       | skytf  | active | ::ffff:192.168.1.15 | 57791 | ::ffff:192.168.173.215 |       1922 | 2012-03-20 06: 
45:28 | 2012-03-20 10:36:31 | 0x1350c9d0 | 0x1352e330 

   
    備註:爲了格式輸出,上面只列出一條記錄,例如上面可以看出連接 skytf 庫的業務服務器IP爲 
              192.168.1.15,顯然通過 pgbouncer 查詢客戶端 IP 不太方便。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章