0

我在将应用程序迁移到更分布式的体系结构时遇到问题。具体来说,我最近开始将一个应用程序迁移到一个 MongoDB 副本集,其中所有成员都使用虚拟云中的本地子网进行通信。复制集可以很好地传播从主节点写入的数据到辅助节点。有两个 Java 应用程序服务器主要执行读取操作,但是它们偶尔也需要执行写入操作。托管 Java 应用程序服务器的每个服务器还包含在本地运行的自己的辅助 mongodb 实例。

具体来说,我遇到的问题是关于使用 Jongo 包装的 MongoDB 驱动程序的 Java。我MongoClientOptions.Builder()用来设置readPreference(ReadPreference.nearest());通常应该从本地机器上运行的 mongodb 实例读取的内容,因为它的延迟最小。无论如何,读取操作在这两个 Java 服务器上都可以正常工作,并且该rs.status()命令会返回一个健康的配置。

尝试执行写入操作时失败,并且我的错误显示: {"timestamp":1427131553387,"status":500,"error":"Internal Server Error","exception":"com.mongodb.CommandFailureException","message":"{ \"serverUsed\" : \"localhost:27017\" , \"note\" : \"from execCommand\" , \"ok\" : 0.0 , \"errmsg\" : \"not master\"}", ...} 建议它正在尝试对本地 mongodb 实例(replicaSet 中的辅助成员)执行写入操作。我的理解是,通过连接到 MongoDB 副本集的任何成员,写入操作将自动发送到标记为主/主的成员?

更多细节:

MongoDB 是 2.6.7 版本

这些设置是从一个简单的 YAML 文件中提取的

应用程序.yml

mapserver.mongo:
  database: "maps"
  port: 27017
  host: "localhost"

然后在通过调用实例化的应用程序中:
return new MongoClient(new ServerAddress(this.getHost(), this.getPort()), this.getOptions());


也许我在设置中遗漏了Java MongoDB驱动程序(和/或Jongo)确定replicaSet中的成员及其角色所需的设置,并将写入操作引导到集合中的当前Master?澄清一下,有一个 NodeJS 服务器部分,它是与这些 Java/Seconday-MongoDB 服务器中的任何一个单独的服务器实例,并且与主要 MongoDB 实例分开,但它可以正确地写入主要/主服务器而不会出现问题,因此它不应该是防火墙问题。任何想法或帮助表示赞赏。

4

0 回答 0