2016-03-23 14 views
14

Hi Tôi có một thiết lập mà tôi đang sử dụng cần tây Flask SQLAlchemy và tôi liên tục nhận được lỗi này:cần tây, bình SQLAlchemy: DatabaseError: (DatabaseError) lỗi SSL: giải mã thất bại hoặc hồ sơ xấu mac

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

tôi đi theo bài này:

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

và cũng một vài chi tiết và thêm một prerun và postrun phương pháp:

@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() 

Nhưng tôi vẫn thấy lỗi này. Bất cứ ai đã giải quyết vấn đề này?

Lưu ý rằng tôi đang chạy tính năng này trên AWS (với hai máy chủ truy cập cùng một cơ sở dữ liệu). Bản thân cơ sở dữ liệu được lưu trữ trên máy chủ riêng của nó (không phải RDS). Tôi tin rằng tổng số nhiệm vụ nền cần tây là 6 (2 + 4). Flask frontend đang chạy bằng gunicorn.

chủ đề có liên quan của tôi: https://github.com/celery/celery/issues/3238#issuecomment-225975220

+0

Were bạn có thể tìm thấy một giải pháp cho việc này. –

+0

Không, chưa tìm thấy ai – Ankit

+0

Tôi sử dụng Celery, SQLAlchemy và PostgreSQL trên AWS và không có vấn đề như vậy. Sự khác biệt duy nhất tôi có thể nghĩ đến là tôi có cơ sở dữ liệu trên RDS. Tôi nghĩ rằng bạn có thể thử chuyển sang RDS tạm thời, chỉ để kiểm tra xem vấn đề sẽ vẫn còn hiện diện hay không. Nếu sẽ biến mất với RDS thì bạn sẽ cần phải nhìn vào các thiết lập PostgreSQL. –

Trả lời

1

Đây là nhận xét của tôi cùng với thông tin bổ sung:

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.

Theo paramters RDS, tôi đã bật 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. 

Đối với Mã khởi tạo Celery, nó là khoảng

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 

Chức năng do_the_work này sau đó được gọi từ nhiệm vụ cần tây. Các sqldb.get_engine trông như thế này:

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 

Cuối cùng, SQL_DB_URI và SQL_DB_ECHO trong các mô-đun cấu hình là những:

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

cảm ơn, vì vậy bạn tạo một công cụ và phiên làm việc mới trên mọi công việc? Ngoài ra tự hỏi nếu có một lý do đằng sau làm: 'sqldb.get_session(). Query' thay vì' db_session.query'? – Ankit

+0

@Ankit Biến động cơ ở cấp mô-đun và nó hoạt động như một singleton. Động cơ được tạo ra chỉ một lần và tái sử dụng trong các nhiệm vụ thực hiện sau đây (ít nhất đây là những gì tôi nhớ từ thử nghiệm của tôi). Sqldb.get_session() là một vấn đề sao chép-dán, nó phải là 'db_session.query'. –

Các vấn đề liên quan