Успешное подключение postgreSQL 9.6.5 к pgbouncer 1.7.2

Вопрос:

Я изо всех сил пытаюсь соединиться pgbouncer 1.7.2 к оперативному postgresql 9.6.5 база данных (веб-приложение Django/Python, ОС Ubuntu 14.04).

Можете ли вы помочь мне решить эту проблему?


Фон:

PostgreSQL прекрасно работает без pgbouncer. Я использую каноническое руководство по настройке 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';, Обратите внимание, что это отличается от 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

1 ответ

Решение

Если вы успешно подключаетесь к собственно Postgres через сокет Unix, вы можете сказать pgbouncer сделать то же самое, указав хост в качестве каталога, в котором находятся ваши файлы сокетов (обычно это / tmp, если вы его скомпилировали самостоятельно), хотя дистрибутивы помещают его в разных местах.

Так что попробуйте что-то вроде этого в вашем pgbouncer.ini:

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

Возможно, вам не нужно указывать имя пользователя, когда pgbouncer работает как пользователь ubuntu (в вашем случае), и вы используете номер порта по умолчанию, поэтому вам не нужно устанавливать его явно.

В Postgres, сделать

show unix_socket_directories;

чтобы увидеть, где находится ваш настоящий каталог сокетов.

Другие вопросы по тегам