3

设置:

我有 mongodb 的一个 PRIMARY 和两个 SECONDARY 实例。两个辅助实例之一托管在与我的 Web 应用程序相同的区域中。

我正在使用 pymongo 进行连接。

询问:

如何以较低的延迟连接到 SECONDARY。

目前我正在这样做:

  from pymongo import ReplicaSetConnection
  from pymongo import ReadPreference

  db = ReplicaSetConnection('localhost:27017', replicaSet='rs1')['my_db']
  db.read_preference = ReadPreference.SECONDARY

我与任何一个中学都有联系。如何强制以较低延迟从实例获取连接

谢谢!!

4

2 回答 2

9

读取偏好如下:

  • PRIMARY:查询被发送到副本集的主节点。
  • PRIMARY_PREFERRED:如果可用,查询将发送到主节点,否则发送到辅助节点。
  • SECONDARY:查询分布在辅助节点之间。如果没有可用的辅助节点,则会引发错误。
  • SECONDARY_PREFERRED:查询分布在辅助节点之间,如果没有可用的辅助节点,则分布在主节点之间。
  • NEAREST:查询分布在所有成员之间。

因此,最近的二级没有特定的。您可以通过结合 NEAREST 和tag_sets并标记辅助节点来实现此目的。

然后,如果辅助节点已被标记{'secondaries': 1},您可以从最近的辅助节点读取,如下所示:

from pymongo import ReplicaSetConnection
from pymongo import ReadPreference

db = ReplicaSetConnection('localhost:27017', replicaSet='rs1')['my_db']
db.read_preference = ReadPreference.NEAREST
db.tag_sets = [{'secondaries': 1}]

更新:

您应该注意,如果发生选举并且您的副本集的拓扑发生更改,那么您必须手动更改 tag_sets 以表示新的辅助节点。

于 2012-11-23T14:38:47.707 回答
3

这个答案非常适合我的情况,因为我最近的辅助服务器与我的 Web 服务器位于同一区域(与在同一台机器上运行一样好),因此数据传输速度非常快,而且我不必付费用于带宽使用(考虑到数据量,这在一个月内可能会变得很重要)。

否则,“secondary_acceptable_latency_ms”的默认值 = 15ms。所以这并不重要。

因此,如果有人发现自己处于同样的情况,这就是该怎么做:

    from pymongo import ReplicaSetConnection
    from pymongo import ReadPreference

    db = ReplicaSetConnection('localhost:27017', replicaSet='rs1')['my_db']
    db.read_preference = ReadPreference.SECONDARY
    db.secondary_acceptable_latency_ms = 0.001

谢谢!!

于 2012-12-04T10:36:20.650 回答