Mongodb阅读首选项

时间:2012-11-23 12:28:34

标签: mongodb pymongo

SETUP:

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

我正在使用pymongo进行连接。

QUERY:

如何以较低的延迟与SECONDARY建立连接。

目前我这样做:

  from pymongo import ReplicaSetConnection
  from pymongo import ReadPreference

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

我与任何一个SECONDARY有联系。 如何强制从具有较低延迟的实例获取连接

谢谢!

2 个答案:

答案 0 :(得分:6)

阅读偏好如下:

  • 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以表示新的辅助副本。

答案 1 :(得分:3)

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

否则'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

谢谢!