Overview
En esta guía, puede aprender cómo configurar las opciones de preocupación de escritura, preocupación de lectura y preferencia de lectura para modificar la forma en que la biblioteca PHP de MongoDB ejecuta operaciones de creación, lectura, actualización y eliminación (CRUD) en conjuntos de réplicas.
Puede establecer opciones de preocupación de escritura, preocupación de lectura y preferencia de lectura en los siguientes niveles:
Cliente, que establece el valor predeterminado 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 le permiten personalizar la consistencia causal y la disponibilidad de los datos en sus conjuntos de réplicas. Para ver una lista completa de las opciones de preferencia de lectura, preocupación de lectura y preocupación de escritura, consulte las siguientes guías en el manual de MongoDB Server:
Configurar operaciones de lectura y escritura
Puede controlar cómo la biblioteca enruta las operaciones de lectura configurando una preferencia de lectura. También puede controlar cómo la biblioteca espera la confirmación de las operaciones de lectura y escritura en un conjunto de réplicas configurando preocupaciones de lectura y escritura.
Esta sección muestra cómo configurar la preferencia de lectura, la preocupación de lectura y la preocupación de escritura en varios niveles pasando un parámetro de matriz 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 sesión
MongoDB\Driver\Session::startTransaction(): Configura los ajustes a nivel de transacción
MongoDB\Client::getDatabase(): Configura los ajustes a nivel de base de datos
MongoDB\Client::getCollection(): Configura los ajustes a nivel de colección
Configuración del cliente
Este ejemplo muestra cómo establecer la preferencia de lectura, la preocupación de lectura y la preocupación de escritura de un MongoDB\Client instancia pasando una matriz al constructor. El código configura los siguientes ajustes:
secondaryPreferencia de lectura: las operaciones de lectura recuperan datos de los miembros del conjunto de réplicas secundariaslocalPreocupación 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éplicas2Preocupación de escritura: el miembro principal y uno secundario del conjunto de réplicas deben 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 cadena. Al configurar los ajustes de lectura y escritura en cualquier otro nivel, debe 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 configurar la preferencia de lectura, la preocupación de lectura y la preocupación de escritura de una sesión pasando una matriz 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.LOCALPreocupación 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éplicasMAJORITYPreocupación de escritura: la mayoría de 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 configurar la preferencia de lectura, la preocupación de lectura y la preocupación de escritura de una transacción pasando una matriz al método startTransaction(). El código configura los siguientes ajustes:
PRIMARYPreferencia de lectura: las operaciones de lectura recuperan datos del miembro del conjunto de réplicas principalMAJORITYPreocupación 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 conjunto de réplicas1Preocupación de escritura: el miembro principal del conjunto de réplicas debe reconocer la operación de escritura
$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, la preocupación de lectura y la preocupación de escritura de una base de datos llamada test_database pasando una matriz de opciones al método getDatabase(). 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.AVAILABLEPreocupación 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éplicasMAJORITYPreocupación de escritura: la mayoría de los miembros del conjunto de réplicas deben reconocer la operación de escritura
$db = $client->getDatabase('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 establecer la preferencia de lectura, la preocupación de lectura y la preocupación de escritura de una colección llamada test_collection pasando una matriz de opciones al método getCollection(). El código configura los siguientes ajustes:
SECONDARY_PREFERREDPreferencia de lectura: Las operaciones de lectura recuperan datos de los miembros del conjunto de réplicas secundarias o de los miembros primarios si no hay secundarios disponiblesAVAILABLEPreocupación 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->getCollection('test_database', 'test_collection', [ 'readPreference' => new ReadPreference(ReadPreference::SECONDARY_PREFERRED), 'readConcern' => new ReadConcern(ReadConcern::AVAILABLE), 'writeConcern' => new WriteConcern(0), ]);
Configuraciones de lectura avanzadas
Esta sección muestra cómo personalizar aún más la configuración de la operación de lectura de las siguientes maneras:
Conjuntos de etiquetas
El servidor MongoDB permite aplicar etiquetas clave-valor a los miembros del conjunto de réplicas según los criterios que se elijan. Posteriormente, se pueden usar esas etiquetas para seleccionar uno o más miembros para una operación de lectura.
De forma predeterminada, la biblioteca PHP de MongoDB ignora las etiquetas al elegir un miembro para leer. Para indicarle que prefiera ciertas etiquetas, páselas como parámetro al constructor de la clase MongoDB\Driver\ReadPreference. A continuación, establezca el objeto MongoDB\Driver\ReadPreference como valor de la opción de base de datos readPreference.
Supongamos que está conectado a un conjunto de réplicas que contiene miembros alojados en varios centros de datos de Estados Unidos. Este ejemplo de código establece la opción readPreference en un conjunto de etiquetas que indica a test_database que prefiera las lecturas de los miembros del conjunto de réplicas secundario en el siguiente orden:
Miembros del centro de datos de Nueva York (
['dc' => 'ny'])Miembros del centro de datos de San Francisco (
['dc' => 'sf'])Cualquier miembro secundario (
[])
$readPreference = new ReadPreference( ReadPreference::RP_SECONDARY, [ ['dc' => 'ny'], ['dc' => 'sf'], [], ], ); $db = $client->getDatabase( 'test_database', ['readPreference' => $readPreference], );
Equilibrio de carga
Al conectarse a un clúster fragmentado o a un conjunto de réplicas, la biblioteca PHP utiliza el balanceo de carga para gestionar las solicitudes de lectura y escritura. El balanceo de carga permite a la biblioteca distribuir estas solicitudes entre varios servidores para evitar la sobrecarga de ninguno y garantizar un rendimiento óptimo.
Al conectarse a un clúster fragmentado, la biblioteca PHP determina la instancia más cercana mongos calculando cuál tiene el menor tiempo de ida y vuelta en la red. Luego, la biblioteca determina la ventana de latencia sumando el mongos tiempo de ida y vuelta promedio de esta instancia al valor de localThresholdMS. La biblioteca distribuye las solicitudes entre hasta dos instancias aleatorias mongos dentro de la ventana de latencia. Para cada solicitud, la biblioteca elige el servidor con la menor operationCount carga operativa determinando su valor.
Al conectarse a un conjunto de réplicas, la biblioteca PHP primero selecciona los miembros del conjunto según sus preferencias de lectura. A continuación, sigue el mismo proceso descrito en el párrafo anterior. Tras calcular la ventana de latencia, selecciona hasta dos miembros aleatorios del conjunto de réplicas que se encuentren dentro de la ventana y elige el miembro con el valor operationCount más bajo para recibir la solicitud.
Tip
Para obtener más información sobre el equilibrio de carga, consulte Sharded Cluster Balancer en el manual de MongoDB Server.
Para aprender a personalizar el comportamiento de selección del servidor de la biblioteca, consulte Opciones de selección y descubrimiento de servidor en la guía Especificar opciones de conexión.
Umbral local
La biblioteca PHP utiliza el valor de umbral local para calcular la ventana de latencia para la selección del servidor. Este valor determina los servidores que pueden recibir solicitudes de lectura y escritura.
De forma predeterminada, la biblioteca solo utiliza instancias mongos o miembros del conjunto de réplicas cuyos tiempos de ping están a menos de 15 milisegundos del servidor más cercano. Para distribuir las lecturas entre servidores con latencias más altas, pase una matriz de opciones al constructor MongoDB\Client que establece 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 biblioteca PHP MongoDB distribuye lecturas entre los miembros coincidentes dentro de 35 milisegundos del tiempo de ping del miembro más cercano.
Nota
La biblioteca PHP de MongoDB ignora el valor localThresholdMS al comunicarse con un conjunto de réplicas a través de una mongos instancia. En este caso, utilice la opción de línea de comandos localThreshold.
Documentación de la API
Para obtener más información sobre cualquiera de los métodos o tipos analizados en esta guía, consulte la siguiente documentación de la API de la biblioteca:
Para obtener más información sobre el startTransaction() método, consulte MongoDB\Driver\Session::startTransaction() en la documentación de la API de extensión.