【问题标题】:MongoReplicaSetClient fails unexpectedly during primary re-electionMongoReplicaSetClient 在主重选期间意外失败
【发布时间】:2013-12-10 14:22:01
【问题描述】:

我正在将引用 mongo 资源的代码库迁移到使用复制,我看到 MongoReplicaSetClient 出现了一些意外行为。除非我在选举新的主节点期间尝试写入,否则客户端工作正常。

我正在运行的简单测试是:
* 启动一个 3 节点副本集
* 连接 MongoReplicaSetClient('localhost:27017,localhost:27018,localhost:27017', replicaSet='rs0'
* 执行写入
* 杀死主节点并立即执行写入
* 初选完成后再次写入

上述所有步骤都可以正常工作,除了倒数第二个主节点已关闭。根据MongoReplicaSetClient 文档,我希望在不存在主节点的情况下执行的所有写入尝试都会引发AutoReconnect 错误。然而,我看到的是一个通用的 AssertionError。

db = MongoReplicaSetClient('localhost:27017,localhost:27018,localhost:27017', replicaSet='rs0', w=2).testdb
db.testcol.save({'test': 1})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.linux-x86_64/egg/pymongo/collection.py", line 266, in save
  File "build/bdist.linux-x86_64/egg/pymongo/collection.py", line 362, in insert
  File "build/bdist.linux-x86_64/egg/pymongo/message.py", line 248, in _do_batched_insert
  File "build/bdist.linux-x86_64/egg/pymongo/mongo_replica_set_client.py", line 1456, in _send_message
  File "build/bdist.linux-x86_64/egg/pymongo/pool.py", line 397, in maybe_return_socket
AssertionError

有谁知道这是否是预期的行为?我想正确处理此类事件,甚至在选举完成之前阻止所有写入。

【问题讨论】:

  • 我不完全确定重新选举是否会因为连接错误而失败,而是“找不到候选服务器”会因为连接错误而失败
  • 这是一个错误:jira.mongodb.org/browse/PYTHON-601
  • 此时MongoClient和MongoReplicaSetClient有什么区别吗?文档指出它运行一个监视线程来密切关注副本集。但是,我使用 MongoClient 运行了与上述相同的测试,它能够很好地检测到主要变化。它还在初选期间按预期抛出了适当的 AutoReconnect 错误。我想知道文档是否刚刚过时,MongoReplicaSetClient 是否处于弃用路径。
  • 嗨,我是 PyMongo 维护者。 MongoReplicaSetClient 绝对不在弃用路径上;事实上,这是连接到副本集的首选方式。报告的错误是一个错误,我们将在下一个版本中修复。

标签: python mongodb pymongo replicaset


【解决方案1】:

报告的错误是一个错误,我们将在下一个版本 PyMongo 2.7 中修复它。此处描述了该错误:https://jira.mongodb.org/browse/PYTHON-601

【讨论】:

    猜你喜欢
    • 2022-11-19
    • 2016-06-22
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2017-06-04
    • 2020-06-30
    相关资源
    最近更新 更多