【发布时间】: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 似乎无法正常工作。
【问题讨论】: