【问题标题】:c# Unable to connect to a member of the replica set matching the read preference Primaryc# 无法连接到与读取首选项Primary匹配的副本集的成员
【发布时间】:2013-04-17 19:36:40
【问题描述】:

好的,我在 linux 服务器上设置了两个节点,并带有一个副本集。

在使用 1.8.1.20 驱动程序的 c# 应用程序中,我有

client = new MongoClient("mongodb://54.244.162.21,54.234.244.182/rs0?connect=replicaset;replicaSet=rs0;slaveOk=true;readPreference=primaryPreferred");

-当我用 mongo 连接到每个节点时,无论是主节点还是从节点,更新和查找语句都能正常工作。

-当我尝试关闭任何主节点或辅助节点时,我得到: 无法连接到与读取首选项 Primary 匹配的副本集成员

-当两个节点都启动时,我没有收到任何错误,一切正常。

-我尝试将 readPreference 更改为每个可能的值,因为我想看看冗余是如何工作的。

我是不是搞错了。我假设您应该能够连接到任何一个,并且至少可以读取工作。以下代码是我在首次建立连接时明显发生异常的代码。

        server = client.GetServer();

        foreach (string db in server.GetDatabaseNames())
        {
            Debug.WriteLine(db);
        }

【问题讨论】:

  • 你的副本集中只有两个成员吗?如果是这样,如果一个被关闭,另一个将无法成为主要的,您将无法进行任何写入。请参阅副本集的文档 - 您需要添加第三个节点 - 常规数据节点或只是一个仲裁器。
  • 顺便说一句,您没有使用您发布的代码连接到单个节点,您正在连接到一个命名的副本集,并且 host:port 仅用于发现副本集的其余部分.
  • 我知道,在选举发生之前,写入不会起作用。但至少不应该阅读工作。我使用的连接字符串不应该通过发现它们来获取有效主机,然后寻找一个可以读取的节点。我希望如果在选举发生之前主节点关闭,仍然可以读取。

标签: c# mongodb driver


【解决方案1】:

问题是某些数据库命令只能在主数据库上运行。如果您在连接到没有主副本的副本集时发出一个,则会出现此错误。

本例中的命令是 server.GetDatabaseNames() - 可能是疏忽导致无法在辅助节点上运行此命令,但目前情况确实如此。

我将与维护 MongoDB 驱动程序的人员核实,看看是否应该在辅助服务器上允许此命令。

对于你的例子,我想你会发现如果你的程序连接然后发出读取查询,那么它会正常工作。

【讨论】:

  • 我们还需要更好的错误信息。我在这里为此创建了一张 JIRA 票证:jira.mongodb.org/browse/CSHARP-730
  • 这一切都很棒。你们让我朝着正确的方向前进,因为我不知道这是否是设计使然。我最初的问题没有得到回答。问题是,如果主节点已关闭,您是否可以从辅助节点读取数据(并且没有选择其他辅助节点——两个节点方案或三个节点场景,其中两个节点发生故障,剩下一个辅助节点)。在你们提醒我 getdatabasenames() 在没有主节点的情况下无法工作之后,我尝试从一个确实有效的集合中读取。所以对于任何有这个非常重要问题的人。是的,没有主节点就可以读取。再次感谢大家。
  • 实际上,我的最后一句话明确地说明了这一点:) - 发出一个读取查询,它应该可以正常工作(在二级上)。
  • 抱歉,出于某种原因,我仔细阅读了所有内容,除了最后一行。
  • 是否有只能在主节点上运行的命令列表?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多