【发布时间】:2013-12-25 07:52:19
【问题描述】:
背景:
您好,我正在 Azure 上运行一个 MongoDB 副本集,并已从 Android 应用程序中远程连接到它。我已经从所有实例中读取工作正常(更新:因为它们被允许在主节点和辅助节点上读取)。但是,写入数据库仍然会出现间歇性错误并出现以下错误,因为必须仅在主节点上进行写入。
此外,如果您可以提供任何更具体的资源来处理此问题,那也将非常有帮助。我已经浏览了大部分文档并搜索了相当多的这个错误。
问题:
如何防止此错误并允许 100% 的时间写入?
E/AndroidRuntime(): com.mongodb.WriteConcernException: {
"serverUsed" : "/<my-remote-ip>:27017" , "err" : "not master" ,
"code" : 10058 , "n" : 0 , "lastOp" : { "$ts" : 0 , "$inc" : 0} ,
"connectionId" : 1918 , "ok" : 1.0}
堆栈跟踪:
E/AndroidRuntime(13731): FATAL EXCEPTION: Thread-7629
E/AndroidRuntime(13731): Process: com.myapplication.examplemongodb, PID: 13731
E/AndroidRuntime(13731): com.mongodb.WriteConcernException: { "serverUsed" : "/<my-remote-ip>:27017" , "err" : "not master" , "code" : 10058 , "n" : 0 , "lastOp" : { "$ts" : 0 , "$inc" : 0} , "connectionId" : 1918 , "ok" : 1.0}
E/AndroidRuntime(13731): at com.mongodb.CommandResult.getException(CommandResult.java:77)
E/AndroidRuntime(13731): at com.mongodb.CommandResult.throwOnError(CommandResult.java:110)
E/AndroidRuntime(13731): at com.mongodb.DBTCPConnector._checkWriteError(DBTCPConnector.java:102)
E/AndroidRuntime(13731): at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:142)
E/AndroidRuntime(13731): at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:115)
E/AndroidRuntime(13731): at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:248)
E/AndroidRuntime(13731): at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:204)
E/AndroidRuntime(13731): at com.mongodb.DBCollection.insert(DBCollection.java:76)
E/AndroidRuntime(13731): at com.mongodb.DBCollection.insert(DBCollection.java:60)
E/AndroidRuntime(13731): at com.mongodb.DBCollection.insert(DBCollection.java:105)
E/AndroidRuntime(13731): at com.myapplication.examplemongodb.ActivityMain$1.run(ActivityMain.java:83)
E/AndroidRuntime(13731): at java.lang.Thread.run(Thread.java:841)
注意事项:
- 我正在使用mongo-java-driver v2.11.3。
- 我使用mongo-azure library 来帮助创建具有两个工作角色的 MongoDB 副本集。
可能的解决方案:
- 我认为与拥有副本集有关。
- 我不确定是否会发生这种情况,因为我只有一个两个实例副本集(一个主副本集和一个辅助副本集),并且他们正在争夺(阅读:投票)谁想成为主副本。也许,需要一个仲裁者?但是,我目前不知道该怎么做。
更新:
- 感谢@David Makogon 的帮助,我很确定问题在于我如何设置与 Azure 的连接,以及如何访问工作角色。因此,这是我关于如何配置系统的更新说明:
- 两个工作角色 (MongoDB.WindowsAzure.MongoDBRole),我通过 Android 应用程序的
TCP Input Endpoint端口 27017 直接连接到它们。正如@David 所说,我目前无法控制连接到哪个实例。 - 一个 Web 角色 (MongoDB.WindowsAzure.Manager),我不使用它,在端口 80 上有一个
HTTP Input Endpoint。这是默认情况下使用我上面提到的 mongo-azure 库创建的。我不确定我是否应该对此做些什么。
- 两个工作角色 (MongoDB.WindowsAzure.MongoDBRole),我通过 Android 应用程序的
【问题讨论】:
标签: java android mongodb azure mongodb-java