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

使用Mongo驱动程序从Java写入MongoDB主/主副本集成员时出错,java,mongodb,jongo,Java,Mongodb,Jongo,我在将应用程序迁移到更分布式的体系结构时遇到了问题。具体来说,我最近开始将一个应用程序迁移到MongoDB replicaSet中,其中所有成员都使用虚拟云中的本地子网进行通信。replicaSet可以将写入的数据从主数据向外传播到辅助数据。有两个Java应用程序服务器主要执行读取操作,但是它们偶尔也需要执行写入操作。托管Java应用程序服务器的每台服务器还包含它们自己的本地运行的辅助mongodb实例 具体来说,我遇到的问题是关于Java使用MongoDB驱动程序的问题,该驱动程序由Jongo

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

具体来说,我遇到的问题是关于Java使用MongoDB驱动程序的问题,该驱动程序由Jongo包装。我正在使用
mongoclientations.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实例(复制集中的辅助成员)执行写操作。我的理解是,通过连接到MongoDB复制集的任何成员,写入操作将自动发送到标记为Master/Primary的成员

更多详细信息:

MongoDB的版本是2.6.7

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

application.yml

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

然后在通过调用实例化的应用程序中:
返回新的MongoClient(新的服务器地址(this.getHost()、this.getPort()、this.getOptions())



也许我在设置中遗漏了Java MongoDB驱动程序(和/或Jongo)确定replicaSet中的成员及其角色,并将写入操作传递到集合中的当前主机所必需的内容?为了澄清,有一个NodeJS服务器部分,它是一个独立于这些Java/Seconday MongoDB服务器的服务器实例,并且与主MongoDB实例分离,但是它可以正确地写入主/主服务器而不会出现问题,因此不应该是防火墙问题。非常感谢您的任何想法或帮助。

您使用的驱动程序版本是什么?尝试将副本集成员的多个
serveraddress
传递给
MongoClient
调用-最简单的解释是,由于只传递了一个地址,因此不会将
MongoClient
作为副本集连接,所以它正在向二级服务器发送写操作。@wdberkeley感谢您的回复-我能够调试并发现一些问题,其中一个问题您已经提到了。似乎您必须为Java驱动程序提供多个
ServerAddress
,以确定您使用的是ReplicaSet-问题在于它似乎无法单独发现其他成员,但我需要指定MongoClient中的所有成员,这是不可接受的,因为随着时间的推移,地址可能会发生变化,成员可能会被添加/删除,这在最坏的情况下需要重新编译,或者在最好的情况下,在更改YAML配置文件并将地址更改为Mongos后重新启动服务器。