使用Mongo驱动程序从Java写入MongoDB主/主副本集成员的错误

时间:2015-03-23 18:27:46

标签: java mongodb jongo

我遇到了将应用程序迁移到更分散的体系结构的问题。具体来说,我最近开始将应用程序迁移到MongoDB副本集,其中所有成员使用虚拟云中的本地子网进行通信。就传播从Primary out写入辅助数据的数据而言,replicaSet工作正常。有两个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 replicaSet的任何成员,写操作会自动发送给标记为Master / Primary的成员?

更多详情:

MongoDB是版本2.6.7

从简单的YAML文件中提取设置

application.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实例分开,但它可以正确地写入主/主服务器而不会出现问题因此它不应该是防火墙问题。任何想法或帮助表示赞赏。

0 个答案:

没有答案