C# 无法连接到与主读取首选项匹配的副本集成员
我有3个mongodb节点:主节点、辅助节点和仲裁节点(版本2.4.9) 我有mongodb C#驱动程序1.8.3 我正在使用以下连接字符串: “连接字符串”mongodb://mongo2,mongo1,mongo3/?connect=replicset&replicset=myrs&readPreference=secondary首选“ 记录半案例时,驱动程序引发异常: 无法连接到与主读取首选项匹配的副本集成员 我的代码: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
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被添加到驱动程序中以管理副本集内容。因此,在我看来,您应该将其保留为单个实例对象。因为每次创建一个新实例时,它都会尝试从一个实例获取副本集设置,这对效率来说并不是一件好事。我知道这篇文章已经过时了,但上周我遇到了这个问题,我解决了这个问题 您需要检查的几件事:
和应该是&代码>否则会出现“实体问题”
27017
primaryPrefered
而不是secondaryPreferred
-如果您希望应用程序在正常情况下从主应用程序读取数据,但在主应用程序不可用时允许从辅助应用程序读取过时数据。这将在故障切换期间为应用程序提供“只读模式”。使用secondary首选是一种计数器指示。从mongodb官方文档了解更多信息
replicaSet
而不是replicaSet
李>
对我来说,很少有mongo服务器崩溃,因此我看到了错误。请检查您的mongo db服务器连接我在这里感到困惑:“这些主机名必须在您的IIS服务器中解析,因为您的驱动程序将使用这些地址连接到mongo实例。”。问题,如何在IIS中解决?@MarvinGlennLacuna抱歉,我不是英语母语人士。我的意思是,承载IIS的服务器必须能够解析这些主机名。