在DreamFactory中创建MongoDB副本集服务

时间:2015-01-01 14:41:38

标签: mongodb service connection replication

我正在尝试使用MongoDB副本集创建服务。 MongoDB的文档说here连接字符串格式必须是

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

所以,我的连接字符串就像是

mongodb://IP1:PORT1,IP2:PORT2,IP3:PORT3/DATABASE?replicaSet=REPLICA_SET_NAME

但是当我尝试探索服务时,我没有得到任何数据,集合或模式,我注意到DreamFactory创建了另一个名为“DATABASE?replicaSet = REPLICA_SET_NAME”的数据库。我试图删除这些选项“replicaSet = REPLICA_SET_NAME”以查看发生了什么,然后我在探索时遇到此错误:

{
  "error": [
    {
      "context": null,
      "message": "Failed to list resources for this service.\nIP1:PORT1: not master and slaveOk=false",
      "code": 500
    }
  ]
}

如果我一直在尝试探索相同的REST端点(例如,/ rest / API-NAME?names_only = true& include_schemas = true),那么我最终会得到正确的响应。似乎每次我发出请求时都会尝试使用不同的ip和端口。

我还注意到,如果我只是离开主服务器并从连接字符串中删除选项,那么它可以正常工作。但这毫无意义,因为我正在失去整个副本设定点。

我甚至尝试设置一个名为“replicaSet”的查找键等于REPLICA_SET_NAME,但它也不起作用。

如何在DreamFactory中使用MongoDB副本集?

1 个答案:

答案 0 :(得分:-1)

这可能不是您问题的解决方案,但我的观察很少。

从技术上讲,你的连接字符串很好。但我在DreamFactory中发现的是,他们似乎不允许使用连接字符串的选项。它们似乎只允许连接字符串中的身份验证和数据库名称。正在考虑" DATABASE?replicaSet = REPLICA_SET_NAME"作为数据库名称,因为它们只允许URI中的数据库名称。

这是在文本字段下面的信息框文本,用于输入DreamFactory中的连接字符串 - "连接字符串可以包括身份验证凭据以及数据库名称。如果它们包含特殊字符,请在下面输入。"

看起来他们的意思是,"只有身份验证凭据和数据库名称。"

当您删除选项" replicaSet = REPLICA_SET_NAME"时,您将获得所需的数据库名称。但是由于你有连接的replicaset节点,它将从它们中选择一个服务器并连接到它。如果它连接到主节点,则可以正常工作,因为您可以读取和写入主节点。如果它恰好选择了一个非主要节点,那么你就无法列出这项服务的资源。\ nIP1:PORT1:not master and slaveOk = false"错误。

这应该有效的唯一条件是 - 1.您只连接到主节点,只是为了避免连接到辅助节点。 2.只传递数据库名称,只是为了避免弄乱数据库名称

这就是为什么当你离开主服务器并从连接字符串中删除选项时它的工作原理。