MongoDB 2.2 和 1.3.0 版本的驱动增加了支持 » 读取首选项, 允许你指定怎样查询MongoDB复制集. 读取首选项可能被指定在连接上,或者库上,或者是集合上. 首选项规定默认要自上而下的继承 (举个例子 MongoCollection 将继承相应的 MongoDB 实例的读取首选项).
读取首选项是模式和标签集相结合的. 模式决定mongod的优先权, 而 » 标签集 为mongod实例合格指定了标准。只有那些ping附近的mongd实例时间在15毫秒内的Mongod实例是合格的。
所有的读取首选项都可能返回从节点比主节点延时的的数据,除非你选择MongoClient::RP_PRIMARY。如果你不使用MongoClient::RP_PRIMARY.模式,请确保你的应用可以容忍过时的数据。
MongoClient::RP_PRIMARY
所有的读操作将使用主节点. 默认是这样,如果主节点不可用,读操作将产生一个异常。
这个模式和使用标签集相冲突. 一个标签集指定为 MongoClient::RP_PRIMARY 将产生一个异常。
MongoClient::RP_PRIMARY_PREFERRED
在大多数情况下, 读取会操作主节点. 但是,如果主节点不可用, 故障转移期间, 将从从节点读取数据。
当读取首选项包含一个标签集, 客户端首先从主节点读取, 如果可用,去从节点匹配标签. 如果从节点没有匹配到标签, 读操作将产生一个异常。
2.2版本的mongos增加了完全支持读取首选项功能。当连接到mongos实例时, MongoClient::RP_PRIMARY_PREFERRED将发送查询到从节点.
MongoClient::RP_SECONDARY
读操作仅仅发送给从节点. 如果没有从节点可用,将产生一个异常.
大多数复制集至少有一个从节点, 但是可能没有可用的从节点。举个例子,有一主节点和一从节点, 还有一个仲裁节点,但是没有其它从节点了,从节点处于故障转移阶段或者不可用的时候。
当读取首选项包括了标签集, 客户端试着找到匹配标签的从节点,直接读一个从节点。如果没有匹配标签的从节点,将导致一个异常
MongoClient::RP_SECONDARY_PREFERRED
大多数情况下,从从节点读取,在只有主节点的情况下,读取主节点
当读取首选项包括了标签集, 客户端试着找到匹配标签的从节点,直接读一个从节点。如果没有匹配标签的从节点,将导致一个异常.
MongoClient::RP_NEAREST
驱动随机读取一个ping时间低于15毫秒的节点。使用 MongoClient::RP_NEAREST 模式的话,读取可能发生在主节点或者从节点。
采用这个模式的话,读操作会发生在网络延时小的节点,不考虑读取的数据是过时的还是最新的。
当读取首选项包括了标签集, 客户端试着找到匹配标签的节点,直接读一个最近组的随机节点。
Note:
对复制集的读操作都发生在符合特定读首选项的最近的节点。 MongoClient::RP_NEAREST 模式会获取主节点和从节点的状态,找到延时低的节点来读取。
» 标签集允许你自定义参数,把读操作指向特定的节点。标签集使得下面两种情况成为可能,读操作指向特定的数据节点或者指定的mongod实例给指定类型的操作使用,例如记录日志或者分析日志。
你可以指定标签集用下面的读取首选项模式:
MongoClient::RP_PRIMARY_PREFERRED
MongoClient::RP_SECONDARY
MongoClient::RP_SECONDARY_PREFERRED
MongoClient::RP_NEAREST
你不能指定标签集用 MongoClient::RP_PRIMARY 读取首选项模式。只有选择了一个从节点,标签才能用,除非是最近模式。
读取首选项可能指定连接URI给 MongoClient::__construct(), 使用查询串语法或者使用标签集的数组语法传递给核心类的设置方法。
当某个读取首选项使用了查询串, 标签集的 readPreferenceTags值应该是逗号分隔开的一串冒号连接的键值对。
Note:
每一个查询串定义的标签集将使用 readPreferenceTags 名称. 不像php接收URL查询串的方式,readPreferenceTags连续的值相互不覆盖。驱动将按照顺序获得标签集。
如果驱动找不到一个匹配的标签集,读取会失败! 你有责任提供合适的回退,像空的 readPreferenceTags 值指定"没有标签集首选项".
Example #1 查询串语法的读取首选项URI链接
<?php
// Prefer the nearest server with no tag preference
$uri = 'mongodb://rs1.example.com,rs2.example.com/';
$uri .= '?readPreference=nearest';
$m = new MongoClient($uri, array('replicaSet' => 'rs'));
// Pick the nearest server in the "east" data center
$uri = 'mongodb://rs1.example.com,rs2.example.com/';
$uri .= '?readPreference=nearest';
$uri .= '&readPreferenceTags=dc:east';
$m = new MongoClient($uri, array('replicaSet' => 'rs'));
// Prefer the nearest server in the "east" data center also used for reporting,
// but fall back to a server in the "west" data center
$uri = 'mongodb://rs1.example.com,rs2.example.com/';
$uri .= '?readPreference=nearest';
$uri .= '&readPreferenceTags=dc:east,use:reporting';
$uri .= '&readPreferenceTags=dc:west';
$m = new MongoClient($uri, array('replicaSet' => 'rs'));
// Prefer the nearest server in the "east" data center, then a server in the
// "west" data center, and finally fall back to no tag set preference
$uri = 'mongodb://rs1.example.com,rs2.example.com/';
$uri .= '?readPreference=nearest';
$uri .= '&readPreferenceTags=dc:east';
$uri .= '&readPreferenceTags=dc:west';
$uri .= '&readPreferenceTags=';
$m = new MongoClient($uri, array('replicaSet' => 'rs'));
?>
Example #2 Setting read preferences with array syntax for tag sets
<?php
$m = new MongoClient('mongodb://rs1.example.com,rs2.example.com', array(
'replicaSet' => 'rs',
));
// Prefer the nearest server with no tag preference
$m->setReadPreference(MongoClient::RP_NEAREST, array());
// Pick the nearest server in the "east" data center
$m->setReadPreference(MongoClient::RP_NEAREST, array(
array('dc' => 'east'),
));
// Prefer the nearest server in the "east" data center also used for reporting,
// but fall back to a server in the "west" data center
$m->setReadPreference(MongoClient::RP_NEAREST, array(
array('dc' => 'east', 'use' => 'reporting'),
array('dc' => 'west'),
));
// Prefer the nearest server in the "east" data center, then a server in the
// "west" data center, and finally fall back to no tag set preference
$m->setReadPreference(MongoClient::RP_NEAREST, array(
array('dc' => 'east'),
array('dc' => 'west'),
array(),
));
?>