为何连接MongoDB P-S-S副本集的两个从节点时可以执行写入操作?
问题结论
这是MongoDB的官方设计预期行为,不属于异常问题。
核心原因解释
- 当MongoDB连接串指定了多个节点地址,且没有显式配置
directConnection=true参数时,驱动默认会自动执行副本集成员发现逻辑:它会优先连接列表中任意一个可达的节点,拉取该节点存储的整个副本集的完整成员配置,自动识别出当前的主节点地址。后续所有写入请求会被驱动自动路由到主节点执行,所以哪怕你给出的地址全是从节点,只要能正常访问其中一个从节点,就可以正常完成写入操作。 - 你单独连接单个从节点时,驱动默认会进入直连模式,不会触发副本集发现逻辑,写入请求会直接发送到当前连接的从节点,从节点本身不允许写入,因此抛出
pymongo.errors.NotPrimaryError报错,完全符合预期。
验证方法
你可以在包含两个从节点的连接串末尾添加directConnection=true参数,修改为:mongodb://test:test@node02:27017,node03:27017/test-db?directConnection=true
此时驱动会强制直连你指定的节点,不会做副本集发现和请求路由,写入时就会抛出和单独连从节点相同的非主节点报错。
内容的提问来源于stack exchange,提问作者goldenbull
相关产品推荐
相关产品推荐

