Я столкнулся с проблемой при запуске Celery с PgBouncer и PostgreSQL после включения таймаутов простоя соединения.
Мой стек включает в себя:
Django (обслуживается через Tornado)
Celery (рабочие + тактовые)
PostgreSQL
PgBouncer (перед PostgreSQL)
Из-за большого количества неактивных подключений к базе данных, вызванных Tornado + Django, я ввел настройки времени ожидания простоя, чтобы защитить PostgreSQL от исчерпания соединений.
PgBouncer
[2025-12-16 06:12:01,578: ERROR/MainProcess] Unrecoverable error: DatabaseError('client_idle_timeout\nserver closed the connection unexpectedly\n\tThis probably means the server terminated abnormally\n\tbefore or while processing the request.\n',)
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/celery/worker/__init__.py", line 351, in start
component.start()
File "/usr/local/lib/python2.7/site-packages/celery/worker/consumer.py", line 393, in start
self.consume_messages()
File "/usr/local/lib/python2.7/site-packages/celery/worker/consumer.py", line 885, in consume_messages
self.connection.drain_events(timeout=10.0)
File "/usr/local/lib/python2.7/site-packages/kombu/connection.py", line 276, in drain_events
return self.transport.drain_events(self.connection, **kwargs)
File "/usr/local/lib/python2.7/site-packages/kombu/transport/virtual/__init__.py", line 760, in drain_events
item, channel = get(timeout=timeout)
File "/usr/local/lib/python2.7/site-packages/kombu/transport/virtual/scheduling.py", line 39, in get
return self.fun(resource, **kwargs), resource
File "/usr/local/lib/python2.7/site-packages/kombu/transport/virtual/__init__.py", line 780, in _drain_channel
return channel.drain_events(timeout=timeout)
File "/usr/local/lib/python2.7/site-packages/kombu/transport/virtual/__init__.py", line 578, in drain_events
return self._poll(self.cycle, timeout=timeout)
File "/usr/local/lib/python2.7/site-packages/kombu/transport/virtual/__init__.py", line 287, in _poll
return cycle.get()
File "/usr/local/lib/python2.7/site-packages/kombu/transport/virtual/scheduling.py", line 39, in get
return self.fun(resource, **kwargs), resource
File "/usr/local/lib/python2.7/site-packages/djkombu/transport.py", line 31, in _get
m = Queue.objects.fetch(queue)
File "/usr/local/lib/python2.7/site-packages/djkombu/managers.py", line 18, in fetch
queue = self.get(name=queue_name)
File "/usr/local/lib/python2.7/site-packages/django/db/models/manager.py", line 132, in get
return self.get_query_set().get(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 344, in get
num = len(clone)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 82, in __len__
self._result_cache = list(self.iterator())
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 273, in iterator
for row in compiler.results_iter():
File "/usr/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 680, in results_iter
for rows in self.execute_sql(MULTI):
File "/usr/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 735, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute
return self.cursor.execute(query, args)
DatabaseError: client_idle_timeout
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
[2025-12-16 06:12:02,291: INFO/MainProcess] Celerybeat: Shutting down...
Вопросы:
Известна ли это проблема при использовании Celery с таймаутами простоя PgBouncer?
Эти значения таймаута несовместимы с долго работающими рабочими процессами Celery?
Каков рекомендуемый способ настройки PgBouncer/PostgreSQL тайм-ауты простоя при использовании Celery?
Будем очень признательны за любые рекомендации или передовой опыт. Заранее спасибо!
Я столкнулся с проблемой при запуске Celery с PgBouncer и PostgreSQL после включения таймаутов простоя соединения. Мой стек включает в себя: [list] [*]Django (обслуживается через Tornado)
[*]Celery (рабочие + тактовые)
[*]PostgreSQL
[*]PgBouncer (перед PostgreSQL)
[/list] Из-за большого количества [b]неактивных подключений к базе данных[/b], вызванных Tornado + Django, я ввел настройки времени ожидания простоя, чтобы защитить PostgreSQL от исчерпания соединений. PgBouncer [code]idle_transaction_timeout=240 (4mins) client_idle_timeout=240 [/code] PostgreSQL [code]idle_in_transaction_session_timeout=300000 (5mins) idle_session_timeout=300000 (5mins) [/code] [b]Проблема:[/b] После применения этих настроек Celery иногда вылетает со следующей ошибкой: [code][2025-12-16 06:12:01,578: ERROR/MainProcess] Unrecoverable error: DatabaseError('client_idle_timeout\nserver closed the connection unexpectedly\n\tThis probably means the server terminated abnormally\n\tbefore or while processing the request.\n',) Traceback (most recent call last): File "/usr/local/lib/python2.7/site-packages/celery/worker/__init__.py", line 351, in start component.start() File "/usr/local/lib/python2.7/site-packages/celery/worker/consumer.py", line 393, in start self.consume_messages() File "/usr/local/lib/python2.7/site-packages/celery/worker/consumer.py", line 885, in consume_messages self.connection.drain_events(timeout=10.0) File "/usr/local/lib/python2.7/site-packages/kombu/connection.py", line 276, in drain_events return self.transport.drain_events(self.connection, **kwargs) File "/usr/local/lib/python2.7/site-packages/kombu/transport/virtual/__init__.py", line 760, in drain_events item, channel = get(timeout=timeout) File "/usr/local/lib/python2.7/site-packages/kombu/transport/virtual/scheduling.py", line 39, in get return self.fun(resource, **kwargs), resource File "/usr/local/lib/python2.7/site-packages/kombu/transport/virtual/__init__.py", line 780, in _drain_channel return channel.drain_events(timeout=timeout) File "/usr/local/lib/python2.7/site-packages/kombu/transport/virtual/__init__.py", line 578, in drain_events return self._poll(self.cycle, timeout=timeout) File "/usr/local/lib/python2.7/site-packages/kombu/transport/virtual/__init__.py", line 287, in _poll return cycle.get() File "/usr/local/lib/python2.7/site-packages/kombu/transport/virtual/scheduling.py", line 39, in get return self.fun(resource, **kwargs), resource File "/usr/local/lib/python2.7/site-packages/djkombu/transport.py", line 31, in _get m = Queue.objects.fetch(queue) File "/usr/local/lib/python2.7/site-packages/djkombu/managers.py", line 18, in fetch queue = self.get(name=queue_name) File "/usr/local/lib/python2.7/site-packages/django/db/models/manager.py", line 132, in get return self.get_query_set().get(*args, **kwargs) File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 344, in get num = len(clone) File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 82, in __len__ self._result_cache = list(self.iterator()) File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 273, in iterator for row in compiler.results_iter(): File "/usr/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 680, in results_iter for rows in self.execute_sql(MULTI): File "/usr/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 735, in execute_sql cursor.execute(sql, params) File "/usr/local/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute return self.cursor.execute(query, args) DatabaseError: client_idle_timeout server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
[2025-12-16 06:12:02,291: INFO/MainProcess] Celerybeat: Shutting down... [/code] Вопросы: [list] [*]Известна ли это проблема при использовании Celery с таймаутами простоя PgBouncer?
[*]Эти значения таймаута несовместимы с долго работающими рабочими процессами Celery?
[*]Каков рекомендуемый способ настройки PgBouncer/PostgreSQL тайм-ауты простоя при использовании Celery?
[/list] Будем очень признательны за любые рекомендации или передовой опыт. Заранее спасибо!