我使用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
在这种情况下无法正常工作。
答案 0 :(得分:4)
原因是芹菜开始工作的方式。默认情况下,在3.0.15中,它使用fork()
复制父进程的状态,但使MonitorThread
死亡。解决方案是使用CELERYD_FORCE_EXECV
选项强制芹菜运行execv()
的工作人员,让监视器恢复活力并再次开心。