MongoDB、C#、QueryFailure 标志不是 master 和 slaveOk=false

MongoDB, C#, QueryFailure flag was not master and slaveOk=false

我有一个网站 运行 好几个月了,现在突然什么都不能用了。该站点使用 MVC 5 完成,并使用 MongoDB 进行存储。

我最好的猜测是 MongoDB 主机在乱搞,这是导致问题的原因,但是...

以后我该怎么做才能避免这个问题?必须有一些我可以更改的设置吗?

这是错误和堆栈跟踪:

QueryFailure flag was not master and slaveOk=false (response was { "$err" : "not master and slaveOk=false", "code" : 13435 }).

at MongoDB.Driver.Internal.MongoReplyMessage1.ReadHeaderFrom(BsonBuffer buffer) at MongoDB.Driver.Internal.MongoReplyMessage1.ReadFrom(BsonBuffer buffer) at MongoDB.Driver.Internal.MongoConnection.ReceiveMessage[TDocument](BsonBinaryReaderSettings readerSettings, IBsonSerializer serializer, IBsonSerializationOptions serializationOptions) at MongoDB.Driver.Operations.QueryOperation1.GetFirstBatch(IConnectionProvider connectionProvider) at MongoDB.Driver.Operations.QueryOperation1.Execute(IConnectionProvider connectionProvider) at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.OrderedEnumerable1.<GetEnumerator>d__0.MoveNext() at System.Linq.Enumerable.<TakeIterator>d__3a1.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) at ScaleModellingCentral.Web.UI.Controllers.HomeController.Read() at lambda_method(Closure , ControllerBase , Object[] ) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 parameters) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult2.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d() at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f() at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass33.b__32(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<>c__DisplayClass2b.b__1c() at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.b__1e(IAsyncResult asyncResult)

这是一个托管问题引发的问题。

我的主要 server/shard 有问题,所以,正如预期的那样,次要成为新的主要,然后一切都失败了。

快速修复是在连接字符串后缀“?slaveOk=true”。固定阅读。仍然写入失败。

所以这里真正的问题是我只在连接字符串中输入了(初始)主服务器,所以(C#)驱动程序不知道有两个分片。

相反,如果我编写了正确的连接字符串,该站点将有一些失败的请求,然后驱动程序将切换到新的主分片,而不是继续使用失败的、现在是次要的分片。

        <add name="MongoDB" connectionString="mongodb://<username>:<password>@<server1>:<port1>,<server2>:<port2>/<dbname>" />