【问题标题】:MongoReplicaSetClient does not reconnect in celery workersMongoReplicaSetClient 不会在芹菜工人中重新连接
【发布时间】:2013-06-14 19:00:11
【问题描述】:

我使用 Celery 3.0.15 和 MongoDB 2.4.4 副本集作为后端(pymongo 版本 2.5.1)。我还使用相同的副本集作为主应用程序数据存储:

CELERY_CONFIG = {
    'BROKER_URL': 'mongodb://localhost:27017,localhost:27018,localhost:27019/',
    'BROKER_TRANSPORT_OPTIONS': {
        'replicaSet': 'test'
    }
}

...

conn = MongoReplicaSetClient(
    'localhost:27017,localhost:27018,localhost:27019', 
    replicaSet='test'
)

我可以启动一些工作人员并使用此 conn 实例从 celery 任务中的代码访问数据库。

如果Mongo Primary关闭并重新选举,Celery Worker会自动重新连接到新配置。但是,无论我重试多少次,无论我等待多长时间,所有带有 conn 的后续查询都会返回 AutoReconnect 异常。

为代理和主数据库分离副本集并不能解决问题:工作人员仍然可以正常重新连接,但我无法使用相同的 MongoReplicaSetClient 从任务中访问 mongo。

更新

AutoReconnect 之后手动调用conn.refresh() 即可解决问题。在这种情况下,MonitorThread 似乎无法正常工作。

【问题讨论】:

    标签: mongodb celery pymongo


    【解决方案1】:

    原因是 celery 启动它的工人的方式。默认情况下,在 3.0.15 中它使用 fork() 复制父进程的状态,但使 MonitorThread 死亡。解决方案是使用 CELERYD_FORCE_EXECV 选项,它强制 celery 使用 execv() 运行工作人员,并使监视器再次活跃和快乐。

    【讨论】:

      猜你喜欢
      • 2014-12-06
      • 2018-05-23
      • 1970-01-01
      • 2019-03-13
      • 2019-01-31
      • 2016-09-12
      • 2015-04-29
      • 2020-01-03
      • 1970-01-01
      相关资源
      最近更新 更多