成功将 postgreSQL 9.6.5 连接到 pgbouncer 1.7.2
Successfully connecting postgreSQL 9.6.5 to pgbouncer 1.7.2
问题:
我正在努力将 pgbouncer 1.7.2
连接到可操作的 postgresql 9.6.5
数据库(Django/Python 网络应用程序,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/ubuntu@11.65.119.381: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 的 settings.py
中引用的 DB_PASSWORD
不同(我在 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,您可以告诉 pgbouncer 做同样的事情,方法是将主机指定为套接字文件所在的目录(通常是 /tmp,如果您自己编译的话) ) 虽然发行版把它放在不同的地方。
所以在你的 pgbouncer.ini 中尝试这样的事情:
[databases]
mydb= host=/tmp dbname=mydb
当 pgbouncer 是 运行 作为用户 ubuntu 时,您可能不需要设置用户名(在您的情况下)并且您使用的是默认端口号,所以您不需要不需要明确设置它。
在 Postgres 中,执行
show unix_socket_directories;
查看您的实际套接字目录在哪里。
问题:
我正在努力将 pgbouncer 1.7.2
连接到可操作的 postgresql 9.6.5
数据库(Django/Python 网络应用程序,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/ubuntu@11.65.119.381: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 的 settings.py
中引用的 DB_PASSWORD
不同(我在 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,您可以告诉 pgbouncer 做同样的事情,方法是将主机指定为套接字文件所在的目录(通常是 /tmp,如果您自己编译的话) ) 虽然发行版把它放在不同的地方。
所以在你的 pgbouncer.ini 中尝试这样的事情:
[databases]
mydb= host=/tmp dbname=mydb
当 pgbouncer 是 运行 作为用户 ubuntu 时,您可能不需要设置用户名(在您的情况下)并且您使用的是默认端口号,所以您不需要不需要明确设置它。
在 Postgres 中,执行
show unix_socket_directories;
查看您的实际套接字目录在哪里。