【发布时间】:2017-11-17 14:25:57
【问题描述】:
我有 3 个在 AWS 上运行的 mongo 实例,1 个主实例和 2 个辅助实例。我们希望所有读取查询都转到辅助节点,因此我们在创建 mongoose 连接时使用这些配置选项:
options = {
db: {
readPreference: 'secondaryPreferred',
native_parser: true
},
replset: {
strategy: 'ping',
auto_reconnect: false,
}
};
mongoose.connect(databaseUrl, options);
问题:使用这些设置,读取查询会同时到达 Primary 和 Secondary 节点,而 2 个辅助节点正在运行。
当我们使用readPreference: 'secondary' 时,它按我们预期的方式工作:所有读取查询都只发送到辅助节点。
请帮我解释一下,因为 mongo 文档提到:
secondaryPreferred:在大多数情况下,操作从次要成员中读取,但如果没有次要成员可用,则从主要成员中读取操作。
顺便说一句,我看到了一些相同的问题,但所有这些问题仍然没有明确的解决方案。 :(
我们正在使用:
- 猫鼬:v4.9.5
- Mongo 服务器:v3.2
- 节点:v5.12.0
【问题讨论】:
-
你真的应该只从“主要”阅读,除非你真的明白这意味着什么以及所有的含义。如果您必须提出这个问题,那么您可能应该坚持从初级阅读。似乎偏好设置按设计工作。
-
我需要配置为从
secondary读取,因为primary当前由write操作员满载。如果设置按设计工作,为什么它从primary和secondary读取。 -
光靠这个理由还不够。如果您的主要负载很重,那么“分片”是您应该首先考虑的地方。二次读取“按设计”意味着不能保证数据是最新的。只有当您接受您的应用程序可以接受的既定事实时,它才是真正有效的选择。二次读取不是为了扩展,就像复制不能代替备份一样。
-
是的,我明白了。看来
reads from Secondary是主要满载问题的糟糕解决方案。 -
嗨 Huy Tran - 你能检查你的 databaseUrl,以确保它正确指定了副本集吗?也许这可能与您看到的问题有关?