【问题标题】:Mongodb Read preferencesMongodb读取偏好
【发布时间】:2012-11-11 19:46:35
【问题描述】:

设置:

我有一个 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

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

谢谢!!

【问题讨论】:

    标签: mongodb pymongo


    【解决方案1】:

    读取偏好如下:

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

    【讨论】:

    • 我还发现了这个:“secondary_acceptable_latency_ms”。我正在考虑将其设置为较低的值(默认值为 15 毫秒)。因此,只有具有较低延迟时间的辅助设备被连接。我会试试这个然后回来。
    • 你是对的,如果我通过 tag_sets 的方式,改变 tag_sets 会很痛苦(可能会忘记)。我很早就想到了这一点。如果我要使用 tag_sets,我宁愿将 tag_set 分配给我想使用的 SECONDARY。
    • 实际上,如果您的读取偏好是 SECONDARY,驱动程序会在 15 毫秒内从最近的辅助设备或任何辅助设备读取。 SECONDARY_PREFERRED 相同,除非只有主节点启动,在这种情况下从主节点读取。因此,如果您将读取首选项 SECONDARY_PREFERRED 和 secondary_acceptable_latency_ms 设置为 .001(因为不允许为零),您将只能从驱动程序测量的具有最短延迟的辅助节点读取。
    • (另请注意,以防万一有任何混淆,“延迟”是成员从运行您的应用程序的机器的 ping 时间;它与复制延迟完全不同。)
    • 是的,我明白...我希望它连接到最近的辅助服务器的主要原因是因为最近的辅助服务器(在我的情况下)与我的 Web 服务器位于同一区域。因此,由于我将处理大量数据,首先它会更快,其次我不必为带宽付费。
    【解决方案2】:

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

    否则,“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
    

    谢谢!!

    【讨论】:

      猜你喜欢
      • 2014-09-27
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多