【问题标题】:Mongoid preferred read replicaMongoid 首选只读副本
【发布时间】:2015-02-05 14:58:45
【问题描述】:

我正在构建一个地理冗余的 MongoDB 副本集,但是有一个问题。 每次向数据库发送查询时,显然都会选择一个随机副本。

MOPED: x.x.x.0:p COMMAND      database=admin command={:ismaster=>1} runtime: 148.4439ms
MOPED: x.x.x.1:p COMMAND      database=admin command={:ismaster=>1} runtime: 150.5547ms
MOPED: x.x.x.2:p COMMAND      database=admin command={:ismaster=>1} runtime: 3.8707ms
MOPED: x.x.x.3:p COMMAND      database=admin command={:ismaster=>1} runtime: 289.3072ms

如您所见,第三个副本是最近的,因此从另一个副本中读取是浪费时间,但这就是发生的情况:

MOPED: x.x.x.3:p QUERY        database=d collection=c selector={} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil runtime: 393.3878ms

所以问题是,我可以指定首选读取的 IP 地址,还是只告诉 MOPED 连接到最快的?

mongoid.yml 文件现在指定了所有 4 个副本:

  hosts:
    - x.x.x.0:p
    - x.x.x.1:p
    - x.x.x.2:p
    - x.x.x.3:p
  options:
    read: :secondary

一种选择是仅手动设置主服务器和最近的副本:

  hosts:
    - x.x.x.0:p
    - x.x.x.2:p
  options:
    read: :secondary

但我不认为这是一个好的解决方案,因为如果出现故障,可用性会受到影响。

【问题讨论】:

  • 尝试将读取首选项设置为最近而不是次要。二级将随机选择(嗯,几乎),而最近的将根据测试 ping 时间进行选择。

标签: ruby-on-rails mongodb ruby-on-rails-4 mongoid moped


【解决方案1】:

想通了,看了这个:https://github.com/mongoid/moped/blob/master/lib/moped/read_preference.rb可以看到moped支持从最近的replica读取,所以解决方法很简单,在mongoid.yml中:

hosts:
  - x.x.x.0:p
  - x.x.x.2:p
options:
  read: :nearest

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-19
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多