psycopg2 pgbouncer. Асинхронный режим с ошибкой gevent

#python #postgresql #gevent #psycopg #pgbouncer

#python #postgresql #gevent #psycopg #pgbouncer

Вопрос:

У меня есть приложение psycopg2 pgbouncer gevent. Асинхронное приложение, т.Е. Один процесс обслуживает несколько запросов. Асинхронный доступ к базе данных появился в последней версии psycopg2, если точнее, то 2.2. Но только в этом выпуске появляется ошибка, из-за которой происходит много отключений от pgbouncer. В журналах pgbouncer есть записи:

 2011-10-04 12:16:38.972 4590 LOG C-0x1b3f490: database/user@10.58.65.143:43849 login successful: db=database user=user
2011-10-04 12:16:38.972 4590 LOG C-0x1b3f0a0: database/user@10.58.65.143:43850 login successful: db=database user=user
2011-10-04 12:16:38.973 4590 LOG C-0x1b40840: database/user@10.58.65.143:43802 closing because: client close request (age=0)
2011-10-04 12:16:38.973 4590 LOG S-0x1b5cd80: database/user@127.0.0.1:5432 closing because: unclean server (age=0)
2011-10-04 12:16:38.976 4590 LOG C-0x1b3ef50: database/user@10.58.65.143:43825 closing because: client close request (age=0)
2011-10-04 12:16:38.976 4590 LOG S-0x1b5e520: database/user@127.0.0.1:5432 closing because: unclean server (age=0)
2011-10-04 12:16:38.977 4590 LOG S-0x1b5e520: database/user@127.0.0.1:5432 new connection to server
2011-10-04 12:16:38.979 4590 LOG C-0x1b3f340: database/user@10.58.65.143:43791 closing because: client close request (age=0)
2011-10-04 12:16:38.979 4590 LOG S-0x1b5d410: database/user@127.0.0.1:5432 closing because: unclean server (age=0)
2011-10-04 12:16:38.980 4590 LOG S-0x1b5d410: database/user@127.0.0.1:5432 new connection to server
2011-10-04 12:16:38.983 4590 LOG S-0x1b5cd80: database/user@127.0.0.1:5432 new connection to server
2011-10-04 12:16:38.987 4590 LOG S-0x1b5dbf0: database/user@127.0.0.1:5432 new connection to server
2011-10-04 12:16:38.990 4590 LOG S-0x1b5c1b0: database/user@127.0.0.1:5432 new connection to server
2011-10-04 12:16:38.992 4590 LOG C-0x1b3ff10: database/user@10.58.65.143:43854 login successful: db=database user=user
2011-10-04 12:16:38.995 4590 LOG S-0x1b5c450: database/user@127.0.0.1:5432 new connection to server
2011-10-04 12:16:38.996 4590 LOG C-0x1b3f340: database/user@10.58.65.143:43855 login successful: db=database user=user
2011-10-04 12:16:38.996 4590 LOG C-0x1b3ee00: database/user@10.58.65.143:43828 closing because: client close request (age=0)
2011-10-04 12:16:38.998 4590 LOG S-0x1b5c300: database/user@127.0.0.1:5432 new connection to server
2011-10-04 12:16:38.999 4590 LOG C-0x1b3f1f0: database/user@10.58.65.143:43805 closing because: client close request (age=0)
2011-10-04 12:16:38.999 4590 LOG S-0x1b5daa0: database/user@127.0.0.1:5432 closing because: unclean server (age=0)
2011-10-04 12:16:39.010 4590 LOG C-0x1b41410: database/user@10.58.65.143:43655 closing because: client close request (age=1)
2011-10-04 12:16:39.010 4590 LOG S-0x1b5d2c0: database/user@127.0.0.1:5432 closing because: unclean server (age=1)
2011-10-04 12:16:39.011 4590 LOG S-0x1b5d2c0: datab ase/user@127.0.0.1:5432 new connection to server
2011-10-04 12:16:39.014 4590 LOG C-0x1b3fc70: database/user@10.58.65.143:43818 closing because: client close request (age=0)
2011-10-04 12:16:39.014 4590 LOG S-0x1b5d170: database/user@127.0.0.1:5432 closing because: unclean server (age=0)
2011-10-04 12:16:39.042 4590 LOG C-0x1b40990: database/user@10.58.65.143:43822 closing because: client close request (age=0)
2011-10-04 12:16:39.042 4590 LOG S-0x1b5de90: database/user@127.0.0.1:5432 closing because: unclean server (age=0)
2011-10-04 12:16:39.043 4590 LOG C-0x1b40060: database/user@10.58.65.143:43820 closing because: client close request (age=0)
2011-10-04 12:16:39.043 4590 LOG S-0x1b5e280: database/user@127.0.0.1:5432 closing because: unclean server (age=0)
  

Может быть, есть какой-то способ настроить pgbouncer, чтобы избежать сообщений о нечистом сервере?
Информация об ошибке, например, есть исправление, которое что-то лечит. Все пакеты из репозиториев ubuntu, применяйте исправления на рабочей машине — не лучший вариант.
Моя конфигурация pgboucner:

 [pgbouncer]
logfile = /var/log/postgresql/pgbouncer.log
pidfile = /var/run/postgresql/pgbouncer.pid
listen_addr = *
listen_port = 6432
unix_socket_dir = /var/run/postgresql

pool_mode = session

server_reset_query = DISCARD ALL;
server_check_query = select 1
server_check_delay = 10

max_client_conn = 1000
default_pool_size = 200

log_connections = 1
log_disconnections = 1
  

Ответ №1:

Вероятно, вы не вызываете connection.close() . До Psycopg 2.2 при удалении соединения выполнялся неявный ОТКАТ, но это условие больше не могло быть гарантировано (и даже до того, как оно считалось небезопасным).

Смотрите http://initd.org/psycopg/docs/connection.html#connection.close

Комментарии:

1. Хм. Если я закрою соединение, я должен повторно подключаться к БД при каждом запросе? Я думаю, что могу использовать постоянные соединения.

2. Нет, на самом деле я думаю, что этого достаточно для фиксации или отката. Из того, что нам сообщили, сообщается о «нечистом сервере», когда соединение возвращается в pgpool в статусе «в транзакции». Попробуйте отслеживать .status атрибут соединений, покидающих вашу систему.

3. Когда я использую метод «закрыть», появляется ошибка типа «невозможно использовать закрытое соединение». Затем я использую метод ‘commit’ — сообщения об ошибках о нечистом сервере исчезают, но в журнале pgbouncer у меня много сообщений о подключении и отключении к БД. Могу ли я использовать постоянное соединение? pastebin.com/GNpNJrPk

4.Марко Крин говорит , что pgbouncer «запрос на закрытие клиента» предназначен только для клиента. […] Если вы не видите «нечистый сервер», сервер все еще находится в пуле.Поэтому я думаю, что ваша программа теперь не переподключается к серверу при каждом запросе. Если у вас есть какие-либо сомнения, вы можете встретиться с разработчиками psycopg и pgpool в списке рассылки