mongodb本机驱动程序似乎忽略了readPreference =最近

时间:2015-09-08 09:45:35

标签: node.js mongodb

我正在尝试在3个不同的数据中心设置mongodb副本集。所以我有3台服务器通过VPN连接到专用网络。让我们说它们是:

  

服务器A:10。*。*。1(我所在国家的数据中心,次要)
  服务器B:10。*。*。88(我的办公室,小学)
  服务器C:10。*。*。10(海外数据中心,次要)

我的程序也部署在3个数据服务器中。我还在连接字符串中将readPreference设置为nearest以获得最佳性能。但是,我仍然发现服务器A上的程序运行速度非常慢。所以我在我的主要实例上将分析级别设置为2

db.setProilingLevel(2)

令人惊讶的是,我发现来自服务器A上的应用程序的查询正在访问服务器B以获取数据(有时我猜测服务器C,因为它有时会非常慢)。 我还尝试在代码中对readPreference = nearest进行硬编码。也不起作用。

那为什么会发生这种情况,我该如何解决?

一些可能有用的附加信息:
副本集信息:

img:PRIMARY> rs.status()
{
    "set" : "img",
    "date" : ISODate("2015-09-08T09:36:30.481Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "internal.myserver.com:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 356160,
            "optime" : Timestamp(1441704113, 1),
            "optimeDate" : ISODate("2015-09-08T09:21:53Z"),
            "electionTime" : Timestamp(1441589586, 1),
            "electionDate" : ISODate("2015-09-07T01:33:06Z"),
            "configVersion" : 9,
            "self" : true
        },
        {
            "_id" : 2,
            "name" : "img.myserver.com:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 115567,
            "optime" : Timestamp(1441704113, 1),
            "optimeDate" : ISODate("2015-09-08T09:21:53Z"),
            "lastHeartbeat" : ISODate("2015-09-08T09:36:29.742Z"),
            "lastHeartbeatRecv" : ISODate("2015-09-08T09:36:28.558Z"),
            "pingMs" : 33,
            "syncingTo" : "internal.myserver.com:27017",
            "configVersion" : 9
        },
        {
            "_id" : 3,
            "name" : "us.img.myserver.com:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 6126,
            "optime" : Timestamp(1441704113, 1),
            "optimeDate" : ISODate("2015-09-08T09:21:53Z"),
            "lastHeartbeat" : ISODate("2015-09-08T09:36:29.006Z"),
            "lastHeartbeatRecv" : ISODate("2015-09-08T09:36:30.153Z"),
            "pingMs" : 497,
            "syncingTo" : "internal.myserver.com:27017",
            "configVersion" : 9
        }
    ],
    "ok" : 1
}

主机信息:

[root@SERVER_B image-server]# ping internal.myserver.com
PING internal.myserver.com (10.*.*.88) 56(84) bytes of data.
64 bytes from internal.myserver.com (10.*.*.88): icmp_seq=1 ttl=64 time=5.78 ms

[root@SERVER_B image-server]# ping img.myserver.com
PING img.myserver.com (10.*.*.1) 56(84) bytes of data.
64 bytes from img.myserver.com (10.*.*.1): icmp_seq=1 ttl=64 time=0.025 ms

[root@SERVER_B image-server]# ping us.img.myserver.com
PING us.img.myserver.com (10.*.*.10) 56(84) bytes of data.
64 bytes from us.img.myserver.com (10.*.*.10): icmp_seq=1 ttl=64 time=195 ms

nodejs信息:

[root@iZ94s1agmdlZ image-server]# node -v
v0.10.36

我正在使用节点本机驱动程序2.0.42

1 个答案:

答案 0 :(得分:0)

经过一些测试后,我终于发现它只是GridStore的一个问题。即使我在连接字符串中指定readPreference =最近(它实际上适用于除GridStore之外的其他查询),GridStore也不会从连接字符串中获取此设置。 要解决此问题,请在初始化GridStore时指定options

{
  ReadPreference.NEAREST
}

这会做出魔力。我将向官方JIRA报告此错误。

nodejs驱动程序 2.0.39