Node.js mongodb本机驱动程序似乎忽略了readPreference=nearest

Node.js mongodb本机驱动程序似乎忽略了readPreference=nearest,node.js,mongodb,Node.js,Mongodb,我正在尝试在3个不同的数据中心设置mongodb副本集。所以我有3台服务器通过VPN连接到一个专用网络。假设它们是: 服务器A:10.*.1(我国的数据中心,二级) 服务器B:10.*.88(我的办公室,主要) 服务器C:10.*.10(海外数据中心,二级) 我的程序也部署在3台数据服务器上。我还将连接字符串中的readPreference设置为nearest,以获得最佳性能。然而,我仍然发现服务器A上的程序运行非常慢。所以我在我的主实例上将评测级别设置为2 db.setProilingLeve

我正在尝试在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
=
最近的
。也不行

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

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

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
[root@iZ94s1agmdlZ image-server]# node -v
v0.10.36
主机信息:

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
[root@iZ94s1agmdlZ image-server]# node -v
v0.10.36
节点信息:

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
[root@iZ94s1agmdlZ image-server]# node -v
v0.10.36

我正在使用节点本机驱动程序2.0.42,经过一些测试,我终于发现这只是GridStore的问题。即使我在连接字符串中指定了readPreference=nearest(它实际上适用于除
GridStore
之外的其他查询),GridStore也无法从连接字符串中获得此设置。 要解决此问题,请在初始化GridStore时指定
选项

{
  ReadPreference.NEAREST
}
这会很神奇。我会把这个错误报告给官方的吉拉


nodejs驱动程序2.0.39

您是在谈论您的“应用程序”还是在谈论“哪个服务器正在从哪个复制中读取数据?”。您提到的“从服务器A到服务器B的查询”并不表示“查询”来自您的应用程序。除非您明确声明,否则复制通常来自“主”。如果这是你的问题,那么你就“离题”了,需要在编程问题网站上发帖。@BlakesSeven很抱歉给你带来了困惑。我指的是我的应用程序,不是服务器。因为应用程序部署在与mongod相同的服务器上。我将修改我的问题,使之更清楚。