Mongoid 首选只读副本
Mongoid preferred read replica
我正在构建地理冗余 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
但我认为这不是一个好的解决方案,因为如果发生故障,可用性会受到影响。
想通了,看了这个: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
我正在构建地理冗余 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
但我认为这不是一个好的解决方案,因为如果发生故障,可用性会受到影响。
想通了,看了这个: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