Overview
En esta guía, podrás aprender cómo configurar las opciones de nivel de confirmación de escritura (write concern), nivel de consistencia de lectura y preferencia de lectura para modificar la forma en que la librería PHP de MongoDB ejecuta las operaciones de crear, leer, actualizar y borrar (CRUD) en los sets de réplicas.
Puedes establecer las opciones de nivel de confirmación de escritura (write concern), nivel de consistencia de lectura y preferencia de lectura en los siguientes niveles:
Cliente, que establece el por defecto para todas las ejecuciones de operaciones, a menos que se anule
sesión
transacción
Database
Colección
Esta lista también indica el orden creciente de precedencia de la configuración de opciones. Por ejemplo, si estableces un nivel de consistencia de lectura para una transacción, este anulará un nivel de consistencia de lectura heredado del cliente.
Estas opciones permiten personalizar la coherencia causal y la disponibilidad de los datos en tus sets de réplicas. Para ver una lista completa de las opciones de preferencia de lectura, nivel de consistencia de lectura y nivel de confirmación de escritura (write concern), consulta las siguientes guías en el manual del MongoDB Server:
Configurar operaciones de lectura y guardar
Puedes controlar cómo la librería dirige las operaciones de lectura estableciendo una preferencia de lectura. También puedes controlar cómo la librería espera el reconocimiento de las operaciones de lectura y escritura en un set de réplicas configurando los niveles de confirmación de lectura y el nivel de confirmación de escritura (write concern).
Esta sección muestra cómo configurar la preferencia de lectura, el nivel de consistencia de lectura y el nivel de confirmación de escritura (write concern) en varios niveles pasando un parámetro de arreglo de opciones a cualquiera de los siguientes métodos:
MongoDB\Client::__construct(): Configura los ajustes a nivel de cliente
MongoDB\Client::startSession(): Configura los ajustes a nivel de cliente
MongoDB\Driver\Session::startTransaction(): Configura los ajustes a nivel de transacción
MongoDB\Client::selectDatabase(): Configura ajustes a nivel de base de datos.
MongoDB\Cliente::selectCollection(): Configura los ajustes a nivel de colección.
Configuración del cliente
Este ejemplo muestra cómo establecer la preferencia de lectura, el nivel de consistencia de lectura y el nivel de confirmación de escritura (write concern) de un MongoDB\Client instancia pasando un arreglo al constructor. El código configura la siguiente configuración:
secondarypreferencia de lectura: Las operaciones de lectura recuperan datos de miembros secundarios del conjunto de réplicaslocalnivel de consistencia de lectura: Las operaciones de lectura devuelven los datos más recientes de la instancia sin garantizar que los datos se hayan escrito en la mayoría de los miembros del conjunto de réplicas2nivel de confirmación de escritura (write concern): el primario/a y uno secundario del set de réplicas debe confirmar la operación de escritura
$clientOptions = [ 'readPreference' => 'secondary', 'readConcernLevel' => 'local', 'w' => '2', ]; $client = new Client('mongodb://localhost:27017', $clientOptions);
Alternativamente, se pueden especificar los ajustes de lectura y guardado en el URI de conexión, que se pasa como un parámetro al constructor MongoDB\Client:
$uri = 'mongodb://localhost:27017/?readPreference=secondary&readConcernLevel=local&w=2'; $client = new Client($uri);
Nota
Las opciones de cliente readPreference, readConcernLevel y w aceptan valores de string. Al configurar los ajustes de lectura y guardado en cualquier otro nivel, deberás asignar valores de tipo MongoDB\Driver\ReadPreference, MongoDB\Driver\ReadConcern y MongoDB\Driver\WriteConcern a las opciones correspondientes.
Configuración de sesión
Este ejemplo muestra cómo establecer la preferencia de lectura, el nivel de consistencia de lectura y el nivel de confirmación de escritura (write concern) de una sesión al pasar un arreglo al método startSession(). El código configura los siguientes ajustes:
PRIMARY_PREFERREDpreferencia de lectura: Las operaciones de lectura recuperan datos desde el miembro principal del set de réplicas, o desde miembros secundarios si el principal no está disponible.LOCALnivel de consistencia de lectura: Las operaciones de lectura devuelven los datos más recientes de la instancia sin garantizar que los datos se hayan escrito en la mayoría de los miembros del conjunto de réplicasMAJORITYnivel de confirmación de escritura (write concern): La mayoría de todos los miembros del conjunto de réplicas deben reconocer la operación de escritura
$sessionOptions = [ 'readPreference' => new ReadPreference(ReadPreference::PRIMARY_PREFERRED), 'readConcern' => new ReadConcern(ReadConcern::LOCAL), 'writeConcern' => new WriteConcern(WriteConcern::MAJORITY), ]; $session = $client->startSession($sessionOptions);
Configuración de transacciones
Este ejemplo muestra cómo establecer la preferencia de lectura, el nivel de consistencia de lectura y el nivel de confirmación de escritura (write concern) de una transacción pasando un arreglo al método startTransaction(). El código configura la siguiente configuración:
PRIMARYpreferencia de lectura: las operaciones de lectura recuperan datos del miembro principal del set de réplicasMAJORITYnivel de consistencia de lectura: Las operaciones de lectura devuelven los datos más recientes de la instancia que se han escrito en la mayoría de los miembros del set de réplicas.1nivel de confirmación de escritura (write concern): The primary set de réplicas must acknowledge the write operation
$transactionOptions = [ 'readPreference' => new ReadPreference(ReadPreference::PRIMARY), 'readConcern' => new ReadConcern(ReadConcern::MAJORITY), 'writeConcern' => new WriteConcern(1), ]; $session->startTransaction($transactionOptions);
Configuración de la base de datos
Este ejemplo muestra cómo configurar la preferencia de lectura, el nivel de consistencia de lectura y el nivel de confirmación de escritura (write concern) de una base de datos llamada test_database pasando un arreglo de opciones al método selectDatabase(). El código configura los siguientes ajustes:
PRIMARY_PREFERREDpreferencia de lectura: Las operaciones de lectura recuperan datos desde el miembro principal del set de réplicas, o desde miembros secundarios si el principal no está disponible.AVAILABLEnivel de consistencia de lectura: Las operaciones de lectura devuelven los datos más recientes de la instancia sin garantizar que los datos se hayan escrito en la mayoría de los miembros del conjunto de réplicasMAJORITYnivel de confirmación de escritura (write concern): La mayoría de todos los miembros del conjunto de réplicas deben reconocer la operación de escritura
$db = $client->selectDatabase('test_database', [ 'readPreference' => new ReadPreference(ReadPreference::PRIMARY_PREFERRED), 'readConcern' => new ReadConcern(ReadConcern::AVAILABLE), 'writeConcern' => new WriteConcern(WriteConcern::MAJORITY), ]);
Configuración de la colección
Este ejemplo muestra cómo configurar la preferencia de lectura, el nivel de consistencia de lectura y el nivel de confirmación de escritura (write concern) de una colección llamada test_collection pasando un arreglo de opciones al método selectCollection(). El código configura la siguiente configuración:
SECONDARY_PREFERREDpreferencia de lectura: Las operaciones de lectura recuperan datos de los miembros secundarios del conjunto de réplicas o de los miembros primarios si no hay secundarios disponiblesAVAILABLEnivel de consistencia de lectura: Las operaciones de lectura devuelven los datos más recientes de la instancia sin garantizar que los datos se hayan escrito en la mayoría de los miembros del conjunto de réplicas0nivel de confirmación de escritura (write concern): no se solicita confirmación de la operación de escritura
$collection = $client->selectCollection('test_database', 'test_collection', [ 'readPreference' => new ReadPreference(ReadPreference::SECONDARY_PREFERRED), 'readConcern' => new ReadConcern(ReadConcern::AVAILABLE), 'writeConcern' => new WriteConcern(0), ]);
Configuraciones avanzadas de lectura
Esta sección muestra cómo personalizar aún más la configuración de tu operación de lectura de las siguientes maneras:
Conjuntos de etiquetas
El MongoDB Server le permite aplicar etiquetas clave-valor a los miembros del set de réplicas según cualquier criterio que elija. Luego, puedes utilizar esas etiquetas para dirigirte a uno o más miembros para una operación de lectura.
Por defecto, la Librería PHP de MongoDB ignora las etiquetas al elegir un nodo del cual leer. Para indicar a la librería PHP de MongoDB que prefiera ciertas etiquetas, pásalas como un parámetro al constructor de tu clase MongoDB\Driver\ReadPreference. Luego, configura el objeto MongoDB\Driver\ReadPreference como valor de la opción de base de datos readPreference.
Supón que estás conectado a un set de réplicas que contiene nodos alojados en varios centros de datos en todo Estados Unidos. Este ejemplo de código establece la opción readPreference en un conjunto de etiquetas que instruyen a test_database a preferir las lecturas de los miembros secundarios del set de réplicas en el siguiente orden:
Nodos del centro de datos de Nueva York (
['dc' => 'ny'])Nodos del centro de datos de San Francisco (
['dc' => 'sf'])Cualquier miembro secundario (
[])
$readPreference = new ReadPreference( ReadPreference::RP_SECONDARY, [ ['dc' => 'ny'], ['dc' => 'sf'], [], ], ); $db = $client->selectDatabase( 'test_database', ['readPreference' => $readPreference], );
Equilibrio de carga
Al conectar a un clúster o a un set de réplicas, la librería PHP utiliza balanceo de carga para gestionar las solicitudes de lectura y escritura. El balanceo de carga permite que la librería distribuya estas solicitudes en múltiples servidores para evitar sobrecargar un único servidor y asegurar un rendimiento óptimo.
Al conectarse a un clúster particionado, la librería PHP determina la instancia mongos más cercana calculando cuál tiene el menor tiempo de ida y vuelta en la red. A continuación, la librería determina la ventana de latencia sumando el tiempo medio de viaje de ida y vuelta de este mongos al valor localThresholdMS. La librería equilibra la carga de las solicitudes a través de hasta dos instancias aleatorias de mongos que se encuentren dentro de la ventana de latencia. Para cada solicitud, la librería elige el servidor con menor carga de operación determinando su valor operationCount.
Al conectarse a un set de réplicas, la librería PHP primero selecciona los miembros del set de réplicas de acuerdo con su preferencia de lectura. Luego, la librería sigue el mismo proceso descrito en el párrafo anterior. Después de calcular la ventana de latencia, la librería selecciona hasta dos nodos aleatorios del set de réplicas que entren en la ventana y elige al nodo con el valor operationCount más bajo para recibir la solicitud.
Tip
Para obtener más información sobre el balanceo de carga, consulte Balanceador de clúster en el manual de MongoDB Server.
Para aprender cómo personalizar el comportamiento de selección de servidores de la librería, consulta Opciones de Selección y Descubrimiento de Servidor en la guía Especificar Opciones de Conexión.
Umbral local
La librería PHP emplea el valor de umbral local para calcular la ventana de latencia para la selección del servidor. Este valor determina los servidores que son elegibles para recibir solicitudes de lectura y guardado.
Por defecto, la librería utiliza solo mongos instancias o miembros de set de réplicas cuyos tiempos de ping estén dentro de 15 milisegundos del servidor más cercano. Para distribuir las lecturas entre servidores con latencias más altas, pasa un arreglo de opciones al constructor MongoDB\Client que establezca la opción localThresholdMS.
El siguiente ejemplo especifica un umbral local de 35 milisegundos:
$options = [ 'replicaSet' => 'repl0', 'readPreference' => new ReadPreference(ReadPreference::RP_SECONDARY_PREFERRED), 'localThresholdMS' => 35, ]; $client = new Client('mongodb://localhost:27017', [], $options);
En el ejemplo anterior, la librería PHP de MongoDB distribuye las lecturas entre los nodos coincidentes dentro de 35 milisegundos del tiempo de ping del nodo más cercano.
Nota
La librería PHP de MongoDB ignora el valor de localThresholdMS al comunicarse con un set de réplicas a través de una instancia de mongos. En este caso, utiliza la opción de línea de comando localThreshold.
Documentación de la API
Para obtener más información sobre cualquiera de los métodos o tipos tratados en esta guía, consulta la siguiente documentación de la API de la librería:
Para obtener más información sobre el método startTransaction(), consulte MongoDB\Driver\Session::startTransaction() en la documentación de la API de la extensión.