Mongoid首选阅读副本

时间:2015-02-05 14:58:45

标签: 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: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

但我不觉得这是一个很好的解决方案,因为在失败的情况下可用性会受到影响。

1 个答案:

答案 0 :(得分:0)

读出来,读到这个:https://github.com/mongoid/moped/blob/master/lib/moped/read_preference.rb你可以看到moped支持从最近的副本读取,所以解决方案非常简单,在mongoid.yml:

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