【发布时间】: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 仅用于发现副本集的其余部分.
-
我知道,在选举发生之前,写入不会起作用。但至少不应该阅读工作。我使用的连接字符串不应该通过发现它们来获取有效主机,然后寻找一个可以读取的节点。我希望如果在选举发生之前主节点关闭,仍然可以读取。