Mongo 4.4 PSA副本集Secondary操作报错NotPrimaryNoSecondaryOk如何解决
问题原因
该错误属于MongoDB副本集的默认安全限制,并非集群故障:
MongoDB副本集的Secondary节点默认禁止所有读操作,避免未做读偏好配置的客户端默认读到过期数据。Mongo Shell默认的secondaryOk参数为false,当在Secondary节点直接执行任何读操作时,就会抛出NotPrimaryNoSecondaryOk错误,错误码13435,和集群状态健康、数据同步正常的表现完全吻合。
修复方案
可根据使用场景选择对应配置:
- 临时生效(仅当前Mongo Shell会话有效):在Secondary节点的Shell中执行
db.getMongo().setSecondaryOk()即可,执行完成后当前会话可正常执行读操作。MongoDB 4.4仍兼容旧版本的rs.slaveOk()命令,但更推荐使用前者。 - 永久生效(所有新启动的Mongo Shell会话默认允许Secondary读):在操作用户的家目录下创建
.mongoshrc.js文件,写入db.getMongo().setSecondaryOk()并保存,后续每次启动Mongo Shell会自动加载该配置。 - 应用连接配置:若业务应用需要访问Secondary节点分流读请求,在MongoDB连接串中添加读偏好参数即可,例如追加
?readPreference=secondaryPreferred,即可实现优先读Secondary节点,Secondary不可用时自动切换到Primary节点读。
注意:无论如何配置,副本集的所有写操作都只能发往Primary节点,Secondary节点默认不接受写请求属于副本集的正常机制。
内容的提问来源于stack exchange,提问作者Leos Literak
相关产品推荐
相关产品推荐

