Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法连接到与主读取首选项匹配的副本集成员_C#_Mongodb_Mongodb .net Driver - Fatal编程技术网

C# 无法连接到与主读取首选项匹配的副本集成员

C# 无法连接到与主读取首选项匹配的副本集成员,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我有3个mongodb节点:主节点、辅助节点和仲裁节点(版本2.4.9) 我有mongodb C#驱动程序1.8.3 我正在使用以下连接字符串: “连接字符串”mongodb://mongo2,mongo1,mongo3/?connect=replicset&replicset=myrs&readPreference=secondary首选“ 记录半案例时,驱动程序引发异常: 无法连接到与主读取首选项匹配的副本集成员 我的代码: var client = new MongoCli

我有3个mongodb节点:主节点、辅助节点和仲裁节点(版本2.4.9)

我有mongodb C#驱动程序1.8.3 我正在使用以下连接字符串:

“连接字符串”mongodb://mongo2,mongo1,mongo3/?connect=replicset&replicset=myrs&readPreference=secondary首选“

记录半案例时,驱动程序引发异常:

无法连接到与主读取首选项匹配的副本集成员

我的代码:

        var client = new MongoClient(connectionString);
        var server = client.GetServer();
        var database = server.GetDatabase(dbName);
        var collection = database.GetCollection<T>(collectionName);
        collection.Insert(newDoc);
var客户端=新的MongoClient(connectionString);
var server=client.GetServer();
var database=server.GetDatabase(dbName);
var collection=database.GetCollection(collectionName);
收款.插入(新单据);
我做错了什么

What am I doing wrong? 
我认为不应该在连接字符串中声明仲裁器。仲裁者并不是一个真正的节点,它不持有任何数据,它的任务是参与复制集的主节点(进行写入的节点)的投票

您添加仲裁器做得很好,因为如果没有它,节点(和投票)是偶数,并且您将面临一些连接失败的情况。无论如何,你的问题与此无关。你真的需要这个
connect=replicaset

我对C#了解不多,但我发现所有官方驱动程序的连接字符串格式都相同,这也是php中的一个示例:

    $m = new MongoClient("mongodb://mongo1:27017,mongo2:27018/?replicaSet=myrs&readPreference=secondary");
你在测试最终的一致性吗?让我知道你对它的看法,我没有时间检查它


不知道它是否区分大小写,但请注意大写字母
replicaSet=myrs

我怀疑这是因为您提供了错误的主机名

这里有一件事您应该知道,可用mongo实例列表不是来自您的连接字符串,而是来自第一个可用mongo实例的返回结果。例如,当驱动程序与实例mongo1通信时,它会获取可用实例的列表,您可以使用以下命令获取该列表:

rs.status()
在我的笔记本电脑中,它返回如下内容:

{
    "set" : "rs0",
    "date" : ISODate("2014-01-27T06:43:11Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "YX-ARCH:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 15894,
            "optime" : Timestamp(1390804960, 1),
            "optimeDate" : ISODate("2014-01-27T06:42:40Z"),
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "YX-ARCH:27011",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 31,
            "optime" : Timestamp(1390804960, 1),
            "optimeDate" : ISODate("2014-01-27T06:42:40Z"),
            "lastHeartbeat" : ISODate("2014-01-27T06:43:10Z"),
            "lastHeartbeatRecv" : ISODate("2014-01-27T06:43:10Z"),
            "pingMs" : 0,
            "syncingTo" : "YX-ARCH:27017"
        }
    ],
    "ok" : 1
}
这意味着有两个实例:YX-ARCH:27017(主要)和YX-ARCH:27011(次要)

现在的问题是,这些主机名必须可以在IIS服务器中解析,因为驱动程序将使用这些地址连接到mongo实例

因此,如果主机名解析为internet IP,而您的mongo服务仅适用于intranet,则您将永远无法连接到它。你会得到上面的错误


还有一件事,不建议每次都创建一个新的MongoClient实例。从文档中可以知道它是线程安全类。MongoClient被添加到驱动程序中以管理副本集内容。因此,在我看来,您应该将其保留为单个实例对象。因为每次创建一个新实例时,它都会尝试从一个实例获取副本集设置,这对效率来说并不是一件好事。

我知道这篇文章已经过时了,但上周我遇到了这个问题,我解决了这个问题

您需要检查的几件事:

  • 如果到mongodb的连接托管在connectionstrings.config中,则
    应该是
    &否则会出现“实体问题”
  • 不要忘记添加mongodb端口
    27017
  • 使用
    primaryPrefered
    而不是
    secondaryPreferred
    -如果您希望应用程序在正常情况下从主应用程序读取数据,但在主应用程序不可用时允许从辅助应用程序读取过时数据。这将在故障切换期间为应用程序提供“只读模式”。使用
    secondary首选
    是一种计数器指示。从mongodb官方文档了解更多信息

  • 最明显的是检查副本集是否相互连接,这意味着存在仲裁成员,因此您将遇到该问题。我想打赌,如果您只放置mongo1并删除其他副本集参数,它将非常有效

  • 正如姚星所提到的,如果您使用的是mongodb主机/名称,请确保它们是正确的,进一步的测试是使用mongodb IP地址,而不是主机/名称。根据我的测试,这仍然有效
  • Mongodb参数区分大小写,因此最好确保您使用的是lese所述的
    replicaSet
    而不是
    replicaSet
  • 如果您有仲裁员成员,则不必将其包含在连接中
  • 此外,您可以检查此MongoDB配置。它还包括加密,以备不时之需,但总的来说,如果所有问题都得到解决,你就不会有这个问题
    对我来说,很少有mongo服务器崩溃,因此我看到了错误。请检查您的mongo db服务器连接

    我在这里感到困惑:“这些主机名必须在您的IIS服务器中解析,因为您的驱动程序将使用这些地址连接到mongo实例。”。问题,如何在IIS中解决?@MarvinGlennLacuna抱歉,我不是英语母语人士。我的意思是,承载IIS的服务器必须能够解析这些主机名。