MongoDB+Azure+Android:com.mongodb.WriteConcernException 错误:“不是主”代码:“10058”

2023-12-14

背景:

您好,我正在 Azure 上运行 MongoDB 副本集,并已从 Android 应用程序中远程连接到它。我已经从所有实例中获得了很好的读取效果(更新:因为允许它们在主节点和辅助节点上读取)。但是,写入数据库仍然会出现间歇性错误,并出现以下错误,因为写入必须仅在主节点上完成。

此外,如果您可以提供任何更具体的资源来处理此问题,那么这也会非常有帮助。我已经浏览了大部分文档并针对此错误进行了大量搜索。

Question:

如何防止此错误并允许 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)

Notes:

  • 我在用mongo-java-驱动程序 v2.11.3.
  • I used the mongo-azure library to help create the MongoDB replica set with two worker roles.
    • (如果您有更多这方面的资源,那么我很乐意阅读它。我已经阅读了 GitHub 自述文件,this, this以及一些与 MongoDB/Azure 无关的其他内容。但是,这些资源没有更新,也没有详细说明。)

可能的解决方案:

  • 我认为与拥有副本集有关。
  • 我不确定是否会发生这种情况,因为我只有一个两个实例副本集(一个主副本集和一个辅助副本集),并且它们正在为谁想成为主副本而争论(阅读:投票)。也许,需要仲裁者?但是,我目前不知道该怎么做。

Update:

  • Thanks to the help of @David Makogon, I'm pretty sure the issue lies with how I have set up the connection to Azure, and how I access the worker roles. So, here's my updated notes on how the system is configured:
    • 两个辅助角色 (MongoDB.WindowsAzure.MongoDBRole),我通过以下方式直接连接到TCP Input Endpoint来自 Android 应用程序的端口 27017。正如@David 所说,我目前无法控制连接到哪个实例。
    • 一个 Web 角色 (MongoDB.WindowsAzure.Manager),我没有对其执行任何操作,但有一个HTTP Input Endpoint在端口 80 上。这只是我上面提到的 mongo-azure 库默认创建的。我不确定我是否应该对此做些什么。

如果实例都位于单个负载均衡后面Input端点(例如 27017),那么每次您的客户端计算机连接到该端点时,它将连接到复制集集群中可能不同的节点(并且您无法控制您转到哪个实例)。这可能可以解释为什么您有时尝试写入非主节点并收到错误,但所有读取都有效(因为您可能将 MongoDB 集群设置为允许在辅助节点上读取)。

工人角色也支持InstanceInput端点,允许您设置面向外部的端口范围(例如 27017-27019),映射到工作实例本身的单个端口(例如 27017)。如果您这样做,您的客户端应用程序现在可以直接连接到所有三个实例(27017、27018、27019)。许多驱动程序支持复制集连接,因此它能够确定哪个节点是主节点,从而将所有写入定向到该节点。我不知道您在 Android 上使用的驱动程序是否支持副本集。如果驱动程序不支持副本集,那么您可能需要考虑建立一个 API 层,然后执行与数据库的所有通信(无论如何,这是一个总体上遵循的良好实践,您可以查看 Azure 的移动服务实现这一点的快速方法)。

所以...如果您的副本集集群的端点配置为Input,这可能解释了您所看到的问题,该问题应该可以通过将端点类型切换为来解决InstanceInput.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB+Azure+Android:com.mongodb.WriteConcernException 错误:“不是主”代码:“10058” 的相关文章

随机推荐

  • 如何将 pandas 方法作为参数传递?

    我有一个计算 pandas 数据框的列模式的函数 def my func df for col in df columns stat df col mode print stat 但我想让它更通用 以便我可以更改我计算的统计数据 例如mea
  • ggplot2 中的默认中断 - 图例指南和极坐标 y 轴标签的中断限制在哪里

    这本质上是一个后续问题ggplot 如何计算其默认中断 当我试图找到一个稍微更优雅的解决方案时 我遇到了这个如何在coord 极坐标图ggplot中添加y轴标签 显然 休息时间总是用以下方式计算scales extended breaks
  • C# 从 Azure 检索 blob 列表

    我需要一些存档清理代码来在一定的保留期过后删除旧的 Azure 日志 我知道我可以这样做 CloudStorageAccount storageAccount CloudStorageAccount Parse CloudBlobClien
  • 修改x轴位置

    当你使用plot在 Matlab 中调用函数时 y 轴和 x 轴分别位于左侧和底部 但我希望 x 轴在图的中间穿过 比例和数字如下所示 请原谅我的业余绘画技巧 但基本上我希望 x 轴移动到顶部 例如 我希望那里有数字和那些小凸起 如红线所示
  • 如何使用计时器替换Azure辅助角色中的Thread.Sleep(...)?

    有很多人说要使用的例子Timer代替Thread Sleep in an Azure Worker Role 没有问题 我很难理解的是如何编写这个代码 目前 我有以下 伪代码 timer Elapsed sender args gt DoW
  • 记住状态 chrome 扩展

    我使用 chrome 扩展来触发两个内容脚本来注入 css 如果用户打开页面 则 contentscript on js 加载 在我的 manifest json 中定义 清单 json name tools version 1 1 des
  • AngularJS 路由器配置不起作用

    我刚刚开始学习 Angular JS 我编写了一些路由测试代码 但似乎不起作用 演示应用程序 js var demoApp angular module demoApp demoApp config function routeProvid
  • 在 Ionic 中打开适用于 Android 的应用程序

    我目前正在使用 Ionic Framework 开发适用于 iOS 和 Android 的移动应用程序 我有自己的 Map API 但缺乏导航功能 当用户单击 POI 时 我的应用程序可以打开其他地图应用程序 例如 Google 地图或 W
  • Chart.js yAxes 刻度步长不起作用(小提琴)

    我创建了一个折线图 其中 y 轴选项如下 yAxes ticks precision 1 stepSize 18 1 min 148 5 max 220 9 因此 我希望 y 轴比例如下 220 9 202 8 184 7 166 6 14
  • 使用 Android proguard 忽略外部库

    我想使用 Proguard 主要是出于混淆的原因 我在 Android 中遇到了 proguard 的问题 我使用simpleframework来解析XML 它的外部 在 proguard cfg 中 keepattributes Anno
  • jsf登录超时

    好的 简单的问题 我有一个 JSF 应用程序 包含一个登录页面 问题是 如果用户加载登录页面 离开一段时间 然后尝试登录 会话就会过期并引发 ViewExpiredException 当发生这种情况时 我可以重定向回登录 但这不是很顺利 如
  • 检查 Javascript 中的时差

    如何检查 Javascript 中两个文本框的时差 凑合 减去 JavaScriptDate对象以获得它们的差异 use a constant date e g 2000 01 01 and the desired time to init
  • WinSCP 批处理文件无法工作,但可以在 CMD 中手动工作

    我的脚本 cd C Users Administrator Downloads WinSCP 5 9 2 Portable winscp com command open ftp test email protected cd facomm
  • 如何在@BeforeSuite中使用testNG @Parameters读取资源文件

    我在用testNG with Selenium webdriver2 0 In my testNG xml I have
  • takeWhile 包括与谓词匹配的实际值 (takeWhileInclusive)

    我经常看到这样的问题 我想从列表中收集值直到值匹配 但我也需要匹配值本身 尽管takeWhile就这一点来说几乎是完美的 它实际上不允许保留最后一个 或基本上匹配的 条目 一个简单的示例 显示对象的类层次结构 直到实现特定接口的第一个类 g
  • 了解 object.size() 与 nchar()

    考虑以下向量x and y x lt a y lt deparse x From nchar nchar接受一个字符向量作为参数并返回一个向量 其元素包含 x 相应元素的大小 并从 object size 计算的是对象的大小 不包括在符号表
  • 当应用程序未运行(即完全终止)时处理推送通知

    我能够向我的 IOS 设备发送推送通知 但是当我点击该通知时 它只会打开应用程序 应用程序内不显示任何消息 我使用的代码 if application applicationState UIApplicationStateActive NS
  • 使用清单在 LoadLibrary 中搜索 Windows 路径

    如果你打电话LoadLibrary没有路径 例如 LoadLibrary whatever dll Windows 通常会遵循其标准搜索算法 与查找 EXE 所用的算法相同 我的问题是这样的 假设应用程序清单指定了系统 DLL 的特定版本
  • Durandal.js 优化器不工作(空 main-built.js)

    我正在尝试让 Durandal js 优化器在我的测试项目上工作 但它似乎不会为 main built js 生成任何内容 我在 durandal amd 文件夹中的 node js 命令提示符下使用以下命令 optimizer exe v
  • MongoDB+Azure+Android:com.mongodb.WriteConcernException 错误:“不是主”代码:“10058”

    背景 您好 我正在 Azure 上运行 MongoDB 副本集 并已从 Android 应用程序中远程连接到它 我已经从所有实例中获得了很好的读取效果 更新 因为允许它们在主节点和辅助节点上读取 但是 写入数据库仍然会出现间歇性错误 并出现