2016-10-25 8 views
3

У меня есть сайт Django с бэкэнд Postgresql, для которого я использую pgbouncer для объединения пула db (режим транзакции).Настройки Django при использовании pgbouncer

Приложение и БД находятся на разных серверах (по 1 серверу). Я установил pgbouncer на сервер приложений. Мой вопрос: какой должна быть конфигурация в settings.py? Обратите внимание, что я использую Unix сокеты для подключения к pgbouncer.


Мой текущий settings.py содержит:

DATABASE_URL = 'postgres://user1:[email protected]:5432/db1' 
DATABASES = { 
'default': dj_database_url.config(default=DATABASE_URL) 
} 

Соответствующие разделы pgbouncer.ini являются:

[databases] 
db1 = host=xx.xxx.xxx.xxx port=5432 dbname=db1 

listen_addr = * 
listen_port = 6432 
auth_type = md5 
unix_socket_dir = /var/run/postgresql 
pool_mode = transaction 
max_client_conn = 200 
default_pool_size = 300 

userlist.txt содержит:

"user1" "pass1" 

Примечание: Один ответ is here, но не работает для меня, так как БД недоступно локально в моем случае. Мне нужно установить переменную среды DATABASE_URL, вместо использования default = '...'.

Одним из предложений является рассмотрение pgbouncer базы данных в settings.py. В таком случае будет что-то вроде следующей работы?

if PRODUCTION == '1': 
    #PRODUCTION is set to '1' if in production environment 
    DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.postgresql_psycopg2', 
      'NAME': 'pgbouncer', 
      'USER': 'user1', 
      'PASSWORD': 'pass1', 
      'HOST': '/var/run/postgresql', 
      'PORT': '6432', 
     } 
+0

Ваш вопрос непонятен. У вас возникли проблемы с подключением pgbouncer к postgresql или подключением django к pgbouncer? Если это последний, вы просто рассматриваете pgbouncer как базу данных, это все – e4c5

+0

@ e4c5: эй, как дела? В частности, как мне подключиться к pgbouncer в 'settings.py'? Я добавляю фрагмент кода в вопросе, чтобы проиллюстрировать, как я думаю, что это должно быть сделано. Вы могли бы исправить это? :-) –

+0

Не должен ли ваш двигатель быть psycopg2 или postgis вместо o – e4c5

ответ

5

От docs:

pgbouncer является соединение PostgreSQL Pooler. Любое целевое приложение может быть подключено к pgbouncer, как если бы это был сервер PostgreSQL, и pgbouncer создаст соединение с фактическим сервером, или будет повторно использовать одно из существующих соединений.

Кроме того,

Есть приложение (или клиент PSQL) подключаются к pgbouncer вместо того, чтобы непосредственно к серверу PostgreSQL.


Конфигурация:

pgbouncer.ini:

[databases] 
db1 = host=xx.xxx.xxx.xxx port=5432 dbname=db1 

[pgbouncer] 
listen_addr = * 
listen_port = 6432 
auth_type = md5 
auth_file = userlist.txt 
unix_socket_dir = /var/run/postgresql 
pool_mode = transaction 
max_client_conn = 200 
default_pool_size = 300 

. Список пользователейTXT:

"user1" "pass1" 

положить в settings.py:

if PRODUCTION == '1': 
    #PRODUCTION is set to '1' if in production environment 
    DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.postgresql_psycopg2', 
      'NAME': 'db1', 
      'USER': 'user1', 
      'PASSWORD': 'pass1', 
      'HOST': '/var/run/postgresql', 
      # 'PORT': '6432', 
     } 

Extra:

В случае не используется UNIX сокет - вы можете установить HOST: ' 127.0.0.1 'или' localhost ', если pgbouncer запущен локально, или что бы IP-сервер pgbouncer не работал. Из docs:

Если вы используете PostgreSQL, то по умолчанию (пустой HOST), подключение к базе данных делаются через сокеты домена UNIX («местные» линии в pg_hba.conf). Если ваш сокет домена UNIX не находится в стандартном местоположении , используйте то же значение unix_socket_directory из postgresql.conf. Если вы хотите подключиться через TCP-сокеты, установите HOST на «localhost» или «127.0.0.1» (строки «host» в pg_hba.conf). На Windows, вы всегда должны определять HOST, поскольку сокеты домена UNIX не доступны .


В случае PostGreSQL Для ENGINE вы можете использовать postgresql или postgresql_psycopg2 - есть разница между обе данной версии Django - postgresql_psycopg2 vs posgresql.

+1

И этот ответ спас мою жизнь снова после всего этого времени. Я включил «ПОРТ»: «6432» в настройках.py, я удалил его в соответствии с этим ответом и вуаля! Не могли бы вы объяснить, почему вы прокомментировали эту строку? Какое значение? –

1

Все ваши настройки БД в settings.py должны быть идентичны настройкам в вашей pgbouncer конфигурации, за исключением хоста в settings.py будет указывать на pgbouncer. Вероятно, вам необходимо изменить 'NAME': 'pgbouncer' на 'NAME': 'db1'. Поскольку вы используете сокет unix, порт не должен иметь значения.

+0

Спасибо за повторение. Два пояснения: 1) не следует «НАЗВАНИЕ» включать имя базы данных «pgbouncer» (т. Е. 'Pgbouncer'). Не идея подключиться к 'pgbouncer' db в settings.py, а сам pgbouncer сделает все остальное? 2) Я думал в нашем предыдущем обсуждении, консенсусом было * не использовать unix-сокеты *, поскольку «pgbouncer» установлен на сервере приложений, а сервер БД является отдельным? –

+0

Вы сказали, что pgbouncer находится на вашем сервере приложений, поэтому Django может подключиться к нему с помощью unix-сокета. pgbouncer просто не может использовать сокет unix для подключения к удаленному экземпляру PG. 'HOST' сообщает Django, где сделать сетевое соединение (pgbouncer),' NAME' сообщает ему, к какой базе данных подключиться. Установка «NAME»: «pgbouncer» приведет к тому, что pgbouncer попытается перенаправить запрос в исходный экземпляр PG и подключиться к базе данных в этом экземпляре под названием «pgbouncer», что, вероятно, не является тем, что вы хотите. –

+0

Возможно, можно настроить разные dbnames в 'pgbouncer.ini' и' settings.py', но я бы не рекомендовал его, не делайте вещи более запутанными. –

 Смежные вопросы

  • Нет связанных вопросов^_^