我遇到了将应用程序迁移到更分散的体系结构的问题。具体来说,我最近开始将应用程序迁移到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实例分开,但它可以正确地写入主/主服务器而不会出现问题因此它不应该是防火墙问题。任何想法或帮助表示赞赏。