MongoReplicaSetClient不会在芹菜工作者中重新连接

时间:2013-06-18 14:02:49

标签: mongodb celery pymongo

我使用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'
)

我可以启动一些worker并使用这个conn实例从celery任务中的代码访问数据库。

如果mongo primary关闭并重新选举,芹菜工作者会自动重新连接到新配置。但是,无论我做了多少次重复,无论我等待多久,conn的所有后续查询都会返回AutoReconnect异常。

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

更新

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

1 个答案:

答案 0 :(得分:4)

原因是芹菜开始工作的方式。默认情况下,在3.0.15中,它使用fork()复制父进程的状态,但使MonitorThread死亡。解决方案是使用CELERYD_FORCE_EXECV选项强制芹菜运行execv()的工作人员,让监视器恢复活力并再次开心。