Сельдерей, коллоидная sqlalchemy: DatabaseError: (DatabaseError) Ошибка SSL: ошибка дешифрования или неудачная запись mac

Привет У меня есть настройка, где я использую Celery Flask SqlAlchemy, и я периодически получаю эту ошибку:

 (psycopg2.DatabaseError) SSL error: decryption failed or bad record mac

Я следил за этим сообщением:

Celery + SQLAlchemy: DatabaseError: (DatabaseError) Ошибка SSL: ошибка дешифрования или неудачная запись mac

а также еще несколько и добавили методы prerun и postrun:

@task_postrun.connect
def close_session(*args, **kwargs):
    # Flask SQLAlchemy will automatically create new sessions for you from 
    # a scoped session factory, given that we are maintaining the same app
    # context, this ensures tasks have a fresh session (e.g. session errors 
    # won't propagate across tasks)
    d.session.remove()

@task_prerun.connect
def on_task_init(*args, **kwargs):
    d.engine.dispose()

Но я все еще вижу эту ошибку. Кто-нибудь решил это?

Обратите внимание, что я запускаю это на AWS (с двумя серверами, обращающимися к той же базе данных). Сама база данных размещена на собственном сервере (а не RDS). Я считаю, что общий объем работы по сельдерее составляет 6 (2 + 4). Флажок работает с использованием пушки.

Моя связанная тема: https://github.com/celery/celery/issues/3238#issuecomment-225975220

Ответы

Ответ 1

Вот мой комментарий и дополнительная информация:

Я использую Celery, SQLAlchemy и PostgreSQL для AWS, и такой проблемы нет. Единственное различие, о котором я могу думать, это то, что у меня есть база данных на RDS. Я думаю, вы можете попробовать переключиться на RDS временно, просто чтобы проверить, вопрос будет по-прежнему присутствовать или нет. Если он отключился с помощью RDS, тогда вам нужно будет изучить настройки PostgreSQL.

В соответствии с параметрами RDS у меня включен SSL:

ssl = 1, Enables SSL connections.
ssl_ca_file = /rdsdbdata/rds-metadata/ca-cert.pem
ssl_cert_file = /rdsdbdata/rds-metadata/server-cert.pem
ssl_ciphers = false, Sets the list of allowed SSL ciphers.
ssl_key_file = /rdsdbdata/rds-metadata/server-key.pem
ssl_renegotiation_limit = 0, integer, (kB) Set the amount of traffic to send and receive before renegotiating the encryption keys.

Что касается кода инициализации сельдерея, то примерно это

from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker

import sqldb

engine = sqldb.get_engine()
cached_data = None

def do_the_work():
    global engine, ruckus_data
    if cached_data is not None:
        return cached_data
    db_session = None
    try:
        db_session = scoped_session(sessionmaker(
            autocommit=False, autoflush=False, bind=engine))
        data = sqldb.get_session().query(
            sqldb.system.MyModel).filter_by(
                my_type = sqldb.system.MyModel.TYPEA).all()
        cached_data = {}
        for row in data:
            ... # put row into cached_data
    finally:
        if db_session is not None:
            db_session.remove()
    return cached_data

Эта функция do_the_work вызывается из задачи сельдерея. sqldb.get_engine выглядит следующим образом:

from sqlalchemy import create_engine

_engine = None

def get_engine():
    global _engine
    if _engine:
        return _engine
    _engine = create_engine(config.SQL_DB_URL, echo=config.SQL_DB_ECHO)
    return _engine

Наконец, SQL_DB_URI и SQL_DB_ECHO в конфигурационном модуле:

SQL_DB_URL = 'postgresql+psycopg2://%s:%[email protected]%s/%s' % (
    POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_HOST, POSTGRES_DB_NAME)
SQL_DB_ECHO = False