问题:
我正在努力将pgbouncer 1.7.2连接到一个可操作的postgresql 9.6.5数据库(Django/Python web app,Ubuntu 14.04 OS)。
你能帮我解决这个问题吗?
背景:
PostgreSQL在没有pgbouncer的情况下运行得很好。我正在使用canonical guide设置pgbouncer。数据库以前是从另一台计算机还原的。
一切都在一台机器上。我正在尝试一个unix套接字连接。尚未尝试TCP(但已对其打开)。
数据库名为mydb。我的Django项目设置为通过用户ubuntu连接到它。
我试过的:
当我尝试psql -d mydb -p 6432 ubuntu(作为用户ubuntu)时,我得到:psql: ERROR: pgbouncer cannot connect to server
同时,pgbouncer.log显示:

01:39:56.428 78472 LOG C-0xfa51e0: mydb/ubuntu@unix(120837):6432 login attempt: db=mydb user=ubuntu tls=no
01:39:56.428 78472 LOG C-0xfa51e0: mydb/ubuntu@unix(120837):6432 closing because: pgbouncer cannot connect to server (age=0)
01:39:56.428 78472 WARNING C-0xfa51e0: mydb/ubuntu@unix(120837):6432 Pooler Error: pgbouncer cannot connect to server
01:40:11.428 78472 LOG S-0xfa0530: mydb/[email protected]:5432 closing because: connect failed (age=15)

请注意,psql -d mydb -p 5432 ubuntu成功地将我登录到mydb(不需要密码)。密码是否造成了问题?
下一步,如果我做了pgbouncer -d pgbouncer.ini(作为用户ubuntu),我会得到一个permission denied错误:
2017-10-15 23:34:14.325 17606 FATAL Cannot open logfile: '/var/log/postgresql/pgbouncer.log': Permission denied

pgbouncer.log中没有生成相应的日志行。文件perms设置如下:
ubuntu@ip-xxx-xx-xx-xx:/var/log/postgresql$ ls -lh
total 59M
-rw-r--r-- 1 postgres postgres 1.8M Oct 15 23:35 pgbouncer.log
-rw-r----- 1 postgres adm       57M Oct 15 23:07 postgresql-9.6-main.log

我的配置:
下面是我在Django应用程序settings.py文件中的记录:
DATABASES = {
        'default': {
                'ENGINE': 'django.db.backends.postgresql_psycopg2',
                'NAME': 'mydb',
                'USER': 'ubuntu',
                'PASSWORD': DB_PASSWORD,
                'HOST': '/var/run/postgresql',
                #'PORT': '6432',
        }

如果我取消注释'PORT': '6432',它仍然不起作用。
Pgbouncer的pgbouncer.ini包含以下内容:
[databases]
mydb= host=11.65.119.381 port=5432 user=ubuntu dbname=mydb

logfile = /var/log/postgresql/pgbouncer.log
pidfile = /var/run/postgresql/pgbouncer.pid

; ip address or * which means all ip-s
listen_addr = *
listen_port = 6432

; unix socket is also used for -R.
; On debian it should be /var/run/postgresql
;unix_socket_mode = 0777
;unix_socket_group =
unix_socket_dir = /var/run/postgresql

auth_type = trust
auth_file = /etc/pgbouncer/userlist.txt
admin_users = myuser, postgres, root
stats_users = myuser, postgres, root

auth_type设置为any也不起作用。
/etc/pgbouncer/userlist.txt包含:
"ubuntu" "md565j6e98u1z098oiuyt7543poi4561yh3"

在那里我通过SELECT usename, passwd FROM pg_shadow WHERE usename='ubuntu';获得密码字符串。注意,这与Django的DB_PASSWORD中引用的settings.py不同(我在userlist.txt中也尝试过这一点,但没有成功)。
pg_hba.conf包含:
local   all             postgres                                peer

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 md5

postgresql.conf包含:
listen_addresses = '*'
port = 5432
unix_socket_directories = '/var/run/postgresql'
#unix_socket_group = ''                 # (change requires restart)
#unix_socket_permissions = 0777         # begin with 0 to use octal notation

文件烫发:
/var/run/postgresql/包含:
total 8.0K
drwxr-s--- 2 postgres postgres 120 Oct 16 00:06 9.6-main.pg_stat_tmp
-rw-r--r-- 1 postgres postgres   6 Oct 15 13:23 9.6-main.pid
-rw-r--r-- 1 postgres postgres   6 Oct 15 23:23 pgbouncer.pid

最佳答案

如果您通过Unix套接字成功地连接到Postgres,那么可以通过指定主机作为套接字文件所在的目录(如果您自己编译了套接字文件,通常是/tmp)来告诉pgbouncer这样做,尽管发行版将其放在不同的位置。
所以在pgbouncer.ini中试试这样的东西:

[databases]
mydb= host=/tmp dbname=mydb

当pgbouncer作为用户ubuntu运行时(在您的例子中),并且您使用的是默认端口号,您可能不需要设置用户名,因此不需要显式地设置它。
在博士后,做
show unix_socket_directories;

查看实际套接字目录的位置。

关于postgresql - 成功将PostgreSQL 9.6.5连接到pgbouncer 1.7.2,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46801419/

10-12 14:08