我正在尝试在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
答案 0 :(得分:0)
经过一些测试后,我终于发现它只是GridStore的一个问题。即使我在连接字符串中指定readPreference =最近(它实际上适用于除GridStore
之外的其他查询),GridStore也不会从连接字符串中获取此设置。
要解决此问题,请在初始化GridStore时指定options
{
ReadPreference.NEAREST
}
这会做出魔力。我将向官方JIRA报告此错误。
nodejs驱动程序 2.0.39