在隐藏且优先级为0的MongoDB从节点执行rs.slaveOk()是否安全?
在隐藏延迟从节点上调用
rs.slaveOk()的安全性 完全没问题,在你配置的这些隐藏从节点上调用rs.slaveOk()是安全且合理的操作,刚好能满足你执行count()这类只读查询的需求,下面具体给你拆解原因:
rs.slaveOk()的本质只是会话级权限放开:它仅仅是允许当前Mongo Shell会话从非主节点读取数据,不会修改副本集的任何配置,也不会干扰主节点的正常运行,更不会影响你设置的“不参与故障转移”的规则——毕竟你的从节点已经设了priority: 0,本来就不会参与主节点选举,这个命令不会改变这一点。你的节点配置已经做了安全隔离:这些从节点标记为
hidden: true,意味着它们不会被MongoDB的驱动自动发现和路由请求,只有你主动连接到这些节点执行查询时,才会读取它们的数据。而且它们的priority: 0也确保了永远不会被选举为主节点,所以在上面执行只读查询完全不会影响副本集的整体稳定性。延迟节点的查询也无风险:对于那个延迟1天的从节点(
slaveDelay: 86400),调用rs.slaveOk()后执行count(),只会读取它已经同步完成的历史数据,不会打断它的延迟同步进程,也不会导致数据不一致——它本来就是作为历史备份存在的,这类只读查询完全契合它的定位。
小操作示例
比如你连接到延迟从节点的Shell:
mongo --port 4002
然后执行:
rs.slaveOk() // 之后就可以执行count查询了 db.yourCollection.count()
唯一需要注意的是:不要尝试在这些从节点上执行写操作(虽然默认情况下从节点也不允许写,除非你特意修改了readOnly配置,但你的节点没开这个),只读查询比如count()、find()之类的都完全没问题。
内容的提问来源于stack exchange,提问作者Daniel F
相关产品推荐
相关产品推荐

