Контейнер Redis - Возвращение таймаута через некоторое время - PullRequest
0 голосов
/ 10 января 2019

Я управляю набором сервисов, которые используют redis как очередь, брокер. Как сельдерей.

Когда я запускаю свои контейнеры (используя docker-compose), все работает нормально, но через некоторое время службы, пытающиеся подключиться к redis, выдают исключение Timeout.

Это мои журналы контейнера redis:

1:C 09 Jan 15:10:30.407 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 09 Jan 15:10:30.408 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 09 Jan 15:10:30.408 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 09 Jan 15:10:30.411 * Running mode=standalone, port=6379.
1:M 09 Jan 15:10:30.411 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 09 Jan 15:10:30.411 # Server initialized
1:M 09 Jan 15:10:30.411 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
1:M 09 Jan 15:10:30.412 * Ready to accept connections
1:M 09 Jan 16:10:48.695 * 1 changes in 3600 seconds. Saving...
1:M 09 Jan 16:10:48.731 * Background saving started by pid 19
19:C 09 Jan 16:10:48.738 * DB saved on disk
19:C 09 Jan 16:10:48.739 * RDB: 0 MB of memory used by copy-on-write
1:M 09 Jan 16:10:48.833 * Background saving terminated with success

Я использую конфигурацию по умолчанию, это ее раздел docker-compose:

  redis:
    image: redis:latest

И это исключение, которое я получаю из своей колбы с сельдереем:

kombu.exceptions.OperationalError: Timeout connecting to server

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/app/env/lib/python3.6/site-packages/celery/beat.py", line 241, in apply_entry
    result = self.apply_async(entry, producer=producer, advance=False)
  File "/app/env/lib/python3.6/site-packages/celery/beat.py", line 358, in apply_async
    entry, exc=exc)), sys.exc_info()[2])
  File "/app/env/lib/python3.6/site-packages/vine/five.py", line 178, in reraise
    raise value.with_traceback(tb)
  File "/app/env/lib/python3.6/site-packages/celery/beat.py", line 350, in apply_async
    **entry.options)
  File "/app/env/lib/python3.6/site-packages/celery/app/task.py", line 535, in apply_async
    **options
  File "/app/env/lib/python3.6/site-packages/celery/app/base.py", line 745, in send_task
    amqp.send_task_message(P, name, message, **options)
  File "/usr/lib/python3.6/contextlib.py", line 99, in __exit__
    self.gen.throw(type, value, traceback)
  File "/app/env/lib/python3.6/site-packages/kombu/connection.py", line 436, in _reraise_as_library_errors
    sys.exc_info()[2])
  File "/app/env/lib/python3.6/site-packages/vine/five.py", line 178, in reraise
    raise value.with_traceback(tb)
  File "/app/env/lib/python3.6/site-packages/kombu/connection.py", line 431, in _reraise_as_library_errors
    yield
  File "/app/env/lib/python3.6/site-packages/celery/app/base.py", line 744, in send_task
    self.backend.on_task_call(P, task_id)
  File "/app/env/lib/python3.6/site-packages/celery/backends/redis.py", line 265, in on_task_call
    self.result_consumer.consume_from(task_id)
  File "/app/env/lib/python3.6/site-packages/celery/backends/redis.py", line 126, in consume_from
    self._consume_from(task_id)
  File "/app/env/lib/python3.6/site-packages/celery/backends/redis.py", line 132, in _consume_from
    self._pubsub.subscribe(key)
  File "/app/env/lib/python3.6/site-packages/redis/client.py", line 2482, in subscribe
    ret_val = self.execute_command('SUBSCRIBE', *iterkeys(new_channels))
  File "/app/env/lib/python3.6/site-packages/redis/client.py", line 2404, in execute_command
    self._execute(connection, connection.send_command, *args)
  File "/app/env/lib/python3.6/site-packages/redis/client.py", line 2408, in _execute
    return command(*args)
  File "/app/env/lib/python3.6/site-packages/redis/connection.py", line 610, in send_command
    self.send_packed_command(self.pack_command(*args))
  File "/app/env/lib/python3.6/site-packages/redis/connection.py", line 585, in send_packed_command
    self.connect()
  File "/app/env/lib/python3.6/site-packages/redis/connection.py", line 486, in connect
    raise TimeoutError("Timeout connecting to server")

Что может быть не так?

Если я так и не смог подключиться, я понимаю, но проблема начинается через некоторое время, и он возвращает время ожидания до тех пор, пока я не перезапущу контейнер.

Спасибо!

1 Ответ

0 голосов
/ 04 марта 2019

Проблема заключалась в путанице правил iptables между правилами докера и некоторыми другими правилами. Я исправил это, используя Nginx в качестве обратного прокси (шаблон шлюза) и управляя правилами доступа к нему вместо использования iptables для этого.

Таким образом, все работает как положено.

Спасибо!

...