2016-03-23 8 views
14

を失敗したか、または不正なレコードこんにちは私はセロリフラスコSQLAlchemyのを使用していると私は断続的に、このエラーを取得していますセットアップを持っています私はこの記事に続く:セロリ、フラスコSQLAlchemyの:DatabaseError:(DatabaseError)SSLエラー:</p> <pre><code>(psycopg2.DatabaseError) SSL error: decryption failed or bad record mac </code></pre> <p>:解読は、MAC

Celery + SQLAlchemy : DatabaseError: (DatabaseError) SSL error: decryption failed or bad record mac

ともいくつかのより多くをし、プレランおよびポストランメソッドを追加しました:

@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(同じデータベースにアクセスする2台のサーバー)で実行していることに注意してください。データベース自体は、自身のサーバー(RDSではなく)にホストされています。私は実行しているセロリのバックグラウンドタスクは6(2 + 4)と考えています。フラスコフロントエンドはガンコーンを使用しています。

私の関連スレッド:ここ https://github.com/celery/celery/issues/3238#issuecomment-225975220

+0

あなたは、このための解決策を見つけることができました。 –

+0

いいえ、まだ見つからない – Ankit

+0

AWSでCelery、SQLAlchemy、PostgreSQLを使用していますが、そのような問題はありません。私が考えることができる唯一の違いは、私はRDS上のデータベースを持っているということです。問題がまだ存在するかどうかをテストするために、一時的にRDSに切り替えることができます。 RDSで消える場合は、PostgreSQLの設定を調べる必要があります。 –

答えて

1

は私の追加情報と一緒にコメントです:RDSの偶然にによると

I use Celery, SQLAlchemy and PostgreSQL on AWS and there is no such problem. The only difference I can think of is that I have the database on RDS. I think you can try switching to RDS temporary, just to test if the issue will be still present or not. If it disappered with RDS then you'll need to look into PostgreSQL settings.

、私は、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 
+0

ありがとうございます、あなたはすべてのタスクで新しいエンジンとセッションを作成しますか?また、 'db_session.query'の代わりに' sqldb.get_session()。query'を実行するのが合理的かどうか疑問です。 – Ankit

+0

@Ankitエンジン変数はモジュールレベルにあり、シングルトンとして機能します。エンジンは一度だけ作成され、次のタスクの実行に再利用されます(少なくともこれは私のテストから覚えています)。 sqldb.get_session()はコピー・ペーストの問題です。単に 'db_session.query'でなければなりません。 –

関連する問題