Ruby on rails Mongoid首选读取副本

Ruby on rails Mongoid首选读取副本,ruby-on-rails,mongodb,ruby-on-rails-4,mongoid,moped,Ruby On Rails,Mongodb,Ruby On Rails 4,Mongoid,Moped,我正在构建一个地理冗余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

我正在构建一个地理冗余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

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

了解到这一点:您可以看到moped支持从最近的副本读取,因此解决方案非常简单,在mongoid.yml中:

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

尝试将读取首选项设置为“最近”,而不是“次要”。Secondary将随机(很好,基本上)选择,而最近的将根据测试ping时间选择。