MongoDB 2.2 y la versión 1.3.0 del controlador añaden el soporte para » preferencias de lectura, que permiten controlar cuántas consultas son dirigidas a instancias de mongod en un entorno de conjunto de réplica. Las preferencias de lectura podrían especificarse en base a cada conexión, cada base de datos, o cada colección. Las preferencias definidas en un nivel más alto serán heredadas de forma predeterminada (p.ej. MongoCollection heredará las preferencias de lectura definidas en la instancia de MongoDB conrrespondiente).
Las preferencias de lectura son especificadas con una combinación de modos y conjuntos de etiquetas. Los modos determinan cómo se priorizan instancias, mientras que los » conjuntos de etiquetas especifican criterios para elegir instancias de mongod. Las instancias de mongod solamente son elegibles si el timepo de ping está dentro de 15ms desde la instancia de mongod más cercana.
Todos los modos de preferencias de lectura excepto MongoClient::RP_PRIMARY podrían devolver datos antiguos, puesto que los secundarios replican operaciones del primario con alguna demora. Asegúrese de que su aplicación puede admitir datos antiguos si elige usar un modo distinto de MongoClient::RP_PRIMARY.
MongoClient::RP_PRIMARY
Todas las opearciones de lectura utilizarn únicamente el primario del conjunto de réplica actual. Esto es lo predeterminado. Si el primario no está disponible, las operaciones de lectura producirán una excepción.
Este modo es incompatible con el uso de conjuntos de etiquetas. Especificar un conjunto de etiquetas con MongoClient::RP_PRIMARY resultará en una excepción.
MongoClient::RP_PRIMARY_PREFERRED
En muchas situaciones, las operaciones leen desde el miembro primario del conjunto. Sin embargo, si el primario no está disponible, como durante situaciones de tolerancia a fallos, las operacoines leen desde miembros secundarios.
Cuando la preferencias de lectura incluye un conjunto de etiquetas, el cliente lee primero desde el primario, si está disponible, y luego desde los secundarios que coinciden con las etiquetas especificadas. Si ningún segundario coincide con alguna etiqueta, la operación de lectura producirá una excepción.
La versión 2.2 de mongos añade soporte completo para preferencias de lectura. Al conectar a instancias más antiguas de mongos, MongoClient::RP_PRIMARY_PREFERRED enviará las consultas a los secundarios.
MongoClient::RP_SECONDARY
Operations read only from the secondary members of the set. If no secondaries are available, read operations will produce an exception.
La mayoría de los conjuntos tienen al menos un secundario, pero hay situaciones donde podría no haber ningún secundario disponible. Por ejemplo, un conjunto con un primario, un secundario, y un árbitro podría no tener ningún secundario si un miembro está en estado de recuperación o indisponible.
Cuando la preferencia de lectura incluye un conjunto de etiquetas, el cliente intenta encontrar miembros secundarios que coincidan con el conjunto de etiquetas especificado y dirigir las lecturas a un secundario aleatorio de entre el grupo más cercano. Si ningún secundario ha coincidido con las etiquetas, la operación de lectura producirá una excepción.
MongoClient::RP_SECONDARY_PREFERRED
En muchas situaciones, las operaciones leen desde miembros secundarios, pero en situaciones donde el conjunto consiste el un único primario sin ningún otro miembro, la operación de lectura usará el primario del conjunto.
Cuando la preferencia de lectura incluye un conjunto de etiquetas, el cliente intenta encontrar un miembro secundario que coincida con el conjunto de etiquetas especificado y dirigir las lecturas a un secundario aleatorio de entre el grupo más cercano. Si ningún secundario ha coincidido con las etiquetas, la operación de lectura producirá una excepción.
MongoClient::RP_NEAREST
El controlador lee desde un miembro aleatorio del conjunto que posea un timepo de ping que sea menos de 15ms más lento que el miembro con el tiempo de ping más lento. Las lecturas en el modo MongoClient::RP_NEAREST no consideran el tipo de miembro y podría leerse tanto desde primarios como de secundarios.
Establezca este modo para minimizar el efecto de latencia de red en operaciones de lectura sin tener preferencia para datos actuales o antiguos.
Si se especifica un conjunto de etiquetas, el cliente intenta encontrar un miembro que coincida con el conjunto de etiquetas especificado y dirigir las lecturas a un nodo aleatorio de entre el grupo más cercano.
Nota:
Todas las operaciones leen desde el miembro más cercano del conjunto de réplica que coincida con el modo de preferencia de lectura especificado. El modo MongoClient::RP_NEAREST prefiere lecturas de baja latencia sobre un estado de miembro primario o secundario.
Los » conjuntos de etiquetas permiten especificar criterios para que una aplicación pueda dirigir operaciones de lectura hacia miembros específicos, basándose en parámetros personalizados. Los conjuntos de etiquetas aseguran que las operaciones de lectura apunten a miembros de un centro de datos en particular o a instancias de mongod diseñadas para una clase de operaciones en concreto, tales como de información o análisis.
Se pueden especificar conjuntos de etiquetas con los siguientes modos de preferencia de lectura:
MongoClient::RP_PRIMARY_PREFERRED
MongoClient::RP_SECONDARY
MongoClient::RP_SECONDARY_PREFERRED
MongoClient::RP_NEAREST
No se pueden especificar conjuntos de etiquetas con el modo de preferencia de lectura MongoClient::RP_PRIMARY. Las etiquetas se aplican solamente al seleccionar un miembro secundario de un conjunto, excepto para el cuándo en el modo más cercano.
Las preferencias de lectura se pueden especificar en una URI proporcionada a MongoClient::__construct(), el cual utiliza una sintaxis decadena de consulta, o mediante métodos modificadores (setter) en las clases núcleo, que usan una sintaxis de array para los conjuntos de etiquetas.
Cuando se especifican los modos de preferencia de lectura en una cadena de consulta, los conjuntos de etiquetas para el valor readPreferenceTags deberían ser una secuencia delimitada por comas de pares clave/valor delimitados por dos puntos.
Nota:
Cada conjunto de etiquetas definida en la cadena de consulta utilizará el nombre readPreferenceTags. A diferencia de cómo PHP pudiera tratar cadenas de consulta de URL, los valores sucesivos para readPreferenceTags no se sobrescribirán. El controlador recopilará conjuntos de etiquetas en el orden en que aparecen en la cadena de consulta.
¡Si el controlador no puede encontrar un conjunto de etiquetas coincidente, la lectura fallará! Es su responsabilidad el proporcionar recursos adecuados, tales como un valor de readPreferenceTags vacío para recurrir a "no tag set preference".
Ejemplo #1 Preferencias de lectura de URI de coneción con sintaxis de cadena de consulta
<?php
// Preferir el servidor más cercano sin preferencia de etiqueta
$uri = 'mongodb://rs1.example.com,rs2.example.com/';
$uri .= '?readPreference=nearest';
$m = new MongoClient($uri, array('replicaSet' => 'rs'));
// Elegir el servidor más cercano en el centro de datos "east"
$uri = 'mongodb://rs1.example.com,rs2.example.com/';
$uri .= '?readPreference=nearest';
$uri .= '&readPreferenceTags=dc:east';
$m = new MongoClient($uri, array('replicaSet' => 'rs'));
// Preferir el servidor más cercano del centro de datos "east" también usado para información,
// pero recurrir a un servidor en el centro de datos "west"
$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'));
// Preferir el servidor más cercano del centro de datos "east", luego un servidor del
// centro de datos "west", y finalmente recurrir a preferencia sin conjunto de etiquetas
$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'));
?>
Ejemplo #2 Establecer las preferencias de lectura con sintaxis de array para conjuntos de etiquetas
<?php
$m = new MongoClient('mongodb://rs1.example.com,rs2.example.com', array(
'replicaSet' => 'rs',
));
// Preferir el servidor más cercano sin preferencia de etiqueta
$m->setReadPreference(MongoClient::RP_NEAREST, array());
// Elegir el servidor más cercano en el centro de datos "east"
$m->setReadPreference(MongoClient::RP_NEAREST, array(
array('dc' => 'east'),
));
// Preferir el servidor más cercano del centro de datos "east" también usado para información,
// pero recurrir a un servidor en el centro de datos "west"
$m->setReadPreference(MongoClient::RP_NEAREST, array(
array('dc' => 'east', 'use' => 'reporting'),
array('dc' => 'west'),
));
// Preferir el servidor más cercano del centro de datos "east", luego un servidor del
// centro de datos "west", y finalmente recurrir a preferencia sin conjunto de etiquetas
$m->setReadPreference(MongoClient::RP_NEAREST, array(
array('dc' => 'east'),
array('dc' => 'west'),
array(),
));
?>