mirror of
https://github.com/php/doc-es.git
synced 2026-03-25 16:02:13 +01:00
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@331073 c90b9560-bf6c-de11-be94-00142212c4b1
416 lines
15 KiB
XML
416 lines
15 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: fa909446a4cf15b5829ca87417db5ebcffc32a5c Maintainer: seros Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
|
|
<chapter xml:id="mongo.writeconcerns" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<title>Asuntos de Escritura (Write Concerns)</title>
|
|
|
|
<para>
|
|
MongoDB proporciona diferentes maneras de seleccionar la duración de una escritura a
|
|
la base de datos. Estas formas se llaman <literal>Asuntos de
|
|
Escritura</literal> y lo abarcan todo: desde ignorar completamente todos los errores,
|
|
a seleccionar específicamente qué servidores son necesarios para confirmar la escritura
|
|
antes de devolver la operación.
|
|
</para>
|
|
<para>
|
|
Cuando una a escritura (como con <methodname>MongoCollection::insert</methodname>,
|
|
<methodname>MongoCollection::update</methodname>, y
|
|
<methodname>MongoCollection::remove</methodname>) se le proporciona una opción de
|
|
Asunto de Escritura (<literal>"w"</literal>), el controlador enviará la consulta a MongoDB
|
|
y luego proseguirá con un comando <literal>getLastError</literal>
|
|
(<acronym>GLE</acronym>) con la opción de Asunto de Escritura al mismo tiempo.
|
|
El servidor solo devuelve cuando la condición de Asunto de Escritura se verifica que se
|
|
cumple, o la consulta expira (controlado con la
|
|
opción<literal>"wtimeout"</literal>, <literal>10000</literal> milisegundos
|
|
es lo predeterminado).
|
|
</para>
|
|
|
|
<warning>
|
|
<para>
|
|
Incluso si un comando <literal>getLastError</literal> expira, los datos
|
|
habrán sido escritos probablemente en el servidor primario y serán
|
|
replicados a todos los secundarios una vez se hayan finalizado con ellos.
|
|
</para>
|
|
<para>
|
|
La típica razón para que una expiración ocurra es si se especifica un Asunto de
|
|
Escritura que requiera confirmación de más servidores de los que estén disponibles
|
|
en ese momento.
|
|
</para>
|
|
</warning>
|
|
|
|
<para>
|
|
Cuando se usan escrituras reconocidas y el conjunto de réplica ha fallado, el controlador
|
|
se desconectará automáticamente del primario, lanzando una excepción, e
|
|
intentará encontrar un nuevo primario en la siguiente operación (una aplicación debe
|
|
decidir si reintentar o no la operación en el nuevo primario).
|
|
</para>
|
|
<para>
|
|
Cuando se usan escrituras no reconocidas (w=0) y el conjunto de réplica ha fallado,
|
|
no hay manera de que el controlador esté al tanto del campo, por lo que continuará
|
|
y fallará en la escritura silenciosamente.
|
|
</para>
|
|
<para>
|
|
El Asunto de Escritura predeterminado para <classname>MongoClient</classname> es
|
|
<literal>1</literal>: operaciones de escritura reconocidas.
|
|
</para>
|
|
|
|
|
|
<para>
|
|
<table xml:id="mongo.writeconcerns.options">
|
|
<title>Asuntos de Escritura disponibles</title>
|
|
<tgroup cols="3">
|
|
<thead>
|
|
<row>
|
|
<entry>Asunto de Escritura</entry>
|
|
<entry>Significado</entry>
|
|
<entry>Descripción</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<!--
|
|
<row>
|
|
<entry>w=-1</entry>
|
|
<entry>Errors ignored</entry>
|
|
<entry>No errors, including network errors, will be checked at all</entry>
|
|
</row>
|
|
-->
|
|
<row>
|
|
<entry>w=0</entry>
|
|
<entry>Sin reconocimiento</entry>
|
|
<entry>A una escritura no le seguirá una llamada a <acronym>GLE</acronym>, por lo que no será verificada ("dispara y olvida")</entry>
|
|
</row>
|
|
<row>
|
|
<entry>w=1</entry>
|
|
<entry>Con reconocimiento</entry>
|
|
<entry>El servidor reconocerá la escritura (el primario en una configuración de conjunto de réplica)</entry>
|
|
</row>
|
|
<row>
|
|
<entry>w=N</entry>
|
|
<entry>Reconocimiento por parte del conjunto de réplica</entry>
|
|
<entry>El servidor primario reconocerá la escritra, que
|
|
será replicada a <literal>N-1</literal> secundarios.</entry>
|
|
</row>
|
|
<row>
|
|
<entry>w=majority</entry>
|
|
<entry>Reconociemiento por la mayoría</entry>
|
|
<entry>La escritura será reconocia por la mayoría del conjunto de réplica (primario inclusive). Es un string reservado especial.</entry>
|
|
</row>
|
|
<row>
|
|
<entry>w=<tag set></entry>
|
|
<entry>Reconocimiento por parte del conjunto de etiquetas del conjunto de réplica</entry>
|
|
<entry>La escritura será reconocida por miembros de conjunto de etiquetas completo</entry>
|
|
</row>
|
|
<row>
|
|
<entry>j=true</entry>
|
|
<entry>Con diario</entry>
|
|
<entry>El primario reconocerá la escritura y el diario será volcado a disco</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</table>
|
|
</para>
|
|
|
|
<simplesect xml:id="mongo.writeconcerns.setting">
|
|
<title>Usar WriteConcerns</title>
|
|
<para>
|
|
Cada método que causa escrituras
|
|
(<methodname>MongoCollection::insert</methodname>,
|
|
<methodname>MongoCollection::update</methodname>,
|
|
<methodname>MongoCollection::remove</methodname>, y
|
|
<methodname>MongoCollection::batchInsert</methodname>) permite un argumento
|
|
opcional para enviar un conjunto de opciones al servidor de MongoDB. Con este array
|
|
de opciones se puede establecer el WriteConcern como ilustra el siguiente ejemplo:
|
|
</para>
|
|
<example>
|
|
<title>Pasar un WriteConcern a una operación de escritura</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
// Establecer w=0 para insertar:
|
|
$colección->insert($someDoc, array("w" => 0));
|
|
|
|
// Establecer w=majority para acutalizar:
|
|
$colección->update($someDoc, $someUpdates, array("w" => "majority"));
|
|
|
|
// Establecer w=5 y j=true para eliminar:
|
|
$colección->update($someDoc, array("w" => 5, "j" => true));
|
|
|
|
// Establecer w="AllDCs" para batchInsert:
|
|
$colección->update(array($someDoc1, $someDoc2), array("w" => "AllDCs"));
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
Además de establecer WriteConcerns por operación como un argumento de opción, es
|
|
también posible establecer un WriteConcern predeterminado de diferentes formas.
|
|
</para>
|
|
<para>
|
|
La primera forma es a través de la <link
|
|
linkend="mongo.mongoclient.construct.parameters">cadena
|
|
de conexión</link>. La cadena de conexión acpeta las opciones
|
|
<literal>journal</literal>, <literal>w</literal>, y
|
|
<literal>wTimeoutMS</literal>:
|
|
</para>
|
|
<example>
|
|
<title>WriteConcerns en cadena de conexión</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$m = new MongoClient("mongodb://localhost/?journal=true&w=majority&wTimeoutMS=20000");
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
|
|
<para>
|
|
Desde la versión 1.5 del controlador, también es posible llamar a
|
|
<methodname>MongoDB::setWriteConcern</methodname> y a
|
|
<methodname>MongoCollection::setWriteConcern</methodname> para establecer un WriteConcern
|
|
predeterminado para todas las operaciones creadas desde ese objeto
|
|
<classname>MongoDB</classname> o <classname>MongoCollection</classname>
|
|
específico:
|
|
</para>
|
|
<example>
|
|
<title>MongoDB::setWriteConcern y MongoCollection::setWriteConcern</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$m = new MongoClient("mongodb://localhost/");
|
|
$d = $m->demoDb;
|
|
$c = $d->demoCollection;
|
|
|
|
// Establecer w=3 en el objeto de base de datos con un tiempo de espera de 25000ms
|
|
$d->setWriteConcern(3, 25000);
|
|
|
|
// Establecer w=majority en el objeto de colección sin cambiar el tiempo de espera
|
|
$c->setWriteConcern("majority");
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</simplesect>
|
|
|
|
<simplesect xml:id="mongo.writeconcerns.unacknowledged">
|
|
<title>Escrituras no reconocidas</title>
|
|
<para>
|
|
Al no requerir que el servidor reconozca las escrituras, estas se pueden realizar
|
|
extremadamente rápido, pero no se sabrá si realmente han tenido éxito.
|
|
Las escritura puede fallas por varias razones: si hay problemas de red, si un
|
|
servidor de bases de datos falla, o si la escritura simplemente no era válida (p.ej., al
|
|
escribir en una colección de sistema, o errores de clave duplicada).
|
|
</para>
|
|
<para>
|
|
Durante el desarrollo, siempre se deberían usar escrituras reconocidas (para evitar
|
|
errores inadvertidos, tales como errores de sintaxis, operadores no válidos, errores de clave duplicada
|
|
, etc.). En la producción, las escrituras no reconocidas se pueden usar para datos "no importantes". Estos
|
|
varían según la aplicación, pero generalmente son datos automáticos (al contrario de generados
|
|
por el usuario), como el rastreo de clics o ubicaciones GPS, donde se pueden obtener
|
|
miles de registros por segundo.
|
|
</para>
|
|
<para>
|
|
Es muy recomendable realizar una escritura reconocida al final de una serie
|
|
de escrituras no reconocidas. Esto no incurrirá en una penalización muy grande
|
|
de redimiento, pero aún se puede capturar cualquier error que pudiera
|
|
ocurrir.
|
|
</para>
|
|
<example xml:id="mongo.writeconcerns.unacknowledged-example">
|
|
<title>Asunto de escritura no reconocido, seguido de una escritura reconocida</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$colección->insert($documento, array("w" => 0));
|
|
$colección->update($criterios, $nuevonObj, array("w" => 0));
|
|
$colección->insert($otraCosa, array("w" => 0));
|
|
try {
|
|
$colección->remove($something, array("w" => 1));
|
|
} catch(MongoCursorException $e) {
|
|
/* Manejar la excepción... */
|
|
/* Aquí se debería emitir consultas find() en los IDs generados para
|
|
$otraCosa y $documento, para verificar que han sido escritos en la base de datos
|
|
e intentar resolver dónde ocurrió algo en la serie. */
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<para>
|
|
Si la última escritura lanza una excepción, se sabrá que hay un problema
|
|
en la base de datos.
|
|
</para>
|
|
</example>
|
|
</simplesect>
|
|
|
|
<simplesect xml:id="mongo.writeconcerns.acknowledged">
|
|
<title>Escrituras reconocidas</title>
|
|
<para>
|
|
Este tipo de operaciones de escritura se asegura de que la base de datos ha
|
|
aceptado la operación de escritura antes de indicar que ha tenido éxito. Si la escritura
|
|
falla, lanzará una <classname>MongoCursorException</classname> con una
|
|
explicación del fallo. El comportamiento predeterminado dee <classname>MongoClient</classname>
|
|
es reconocer la escritura (w=1).
|
|
</para>
|
|
<para>
|
|
Es posible especificar cuántos miembros de un conjunto de réplica tienen que
|
|
reconocer la escritura (esto es, tiene que replicarla) antes de que la escritura se
|
|
estime como reconocida y la operación devuelve.
|
|
<example xml:id="mongo.writeconcerns.acknowledged-example">
|
|
<title>Escrituras reconocidas</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
// Forzar el reconocimiento por parte del primario solamente
|
|
$colección->insert($doc, array("w" => 1));
|
|
|
|
// Forzar el reconocimiento por parte del primario, y otro miembro del
|
|
// conjunto de réplica
|
|
$colección->insert($doc, array("w" => 2));
|
|
|
|
// Forzar el reconocimiento por parte del primario, y otros seis miembros del
|
|
// conjunto de réplica (probablemente nunca debería hacer esto):
|
|
$colección->insert($doc, array("w" => 7));
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<para>
|
|
Recuerde seleccionar el Asunto de Escritura con cuidado. Si se tiene un
|
|
conjunto de réplica con 5 miembros y se selecciona un Asunto de Escritura de
|
|
<literal>4</literal>, se corre el riesgo de bloquear la escritura para siempre cuando
|
|
un miembro del conjunto de réplica se desconecte por matenimiento o por un corte temporal
|
|
de la red.
|
|
</para>
|
|
</example>
|
|
</para>
|
|
<warning>
|
|
<para>
|
|
El paso de un valor de tipo string al Asunto de Escritura posee un significado específico
|
|
(Reconocimiento por parte del conjunto de etiquetas del conjunto de réplica). Tenga cuidado de
|
|
<emphasis>NO</emphasis> usar valores de tipo string para números (esto es,
|
|
<literal>array("w" => "1")</literal>) ya que serán tratados como el nombre de un conjunto de
|
|
etiquetas.
|
|
</para>
|
|
</warning>
|
|
</simplesect>
|
|
|
|
<simplesect xml:id="mongo.writeconcerns.majority.acknowledged">
|
|
<title>Escrituras reconocidas por la mayoría</title>
|
|
<para>
|
|
Usar la opción de Asunto de Escritura <literal>majority</literal> es la forma
|
|
recomendada para escrituras que requieren sobrevidir al apocalipsis, ya que se asegurá
|
|
de que la mayoría del conjunto de réplica tendrá la escritura y, por lo tanto, se
|
|
garantizará que sobrevivirá a todos los escenarios de corte sospechosos usuales.
|
|
</para>
|
|
<example xml:id="mongo.writeconcerns.majority.acknowledged-example">
|
|
<title>Escritura reconocida por la mayoría</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$colección->insert($documento, array("w" => "majority"));
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</simplesect>
|
|
|
|
<!-- FIXME
|
|
<simplesect xml:id="mongo.writeconcerns.tagset">
|
|
<title>ReplicaSet TagSet Acknowledged</title>
|
|
</simplesect>
|
|
-->
|
|
|
|
<simplesect xml:id="mongo.writeconcerns.journal">
|
|
<title>Escrituras con diario</title>
|
|
<para>
|
|
Al conectarse a un conjunto de réplica, el Asunto de Escritura predeterminado es hacer
|
|
que solamente el servidor primario reconozca al escritura. Hay, sin embargo, una ventata de
|
|
100 ms hasta que la escritura se escriba en el diario y sea volcada al disco. Es posible forzar
|
|
a que la escritura sea escrita en el diario antes de que sea reconocia estableicendo la
|
|
opción <literal>j</literal>:
|
|
<example xml:id="mongo.writeconcerns.journalled">
|
|
<title>Escritura reconocida y esctrita en el diario</title>
|
|
<para>Forzar el volcado del diatio</para>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$opciones = array(
|
|
"w" => 1,
|
|
"j" => true,
|
|
);
|
|
try {
|
|
$colección->insert($documento, $opciones);
|
|
} catch(MongoCursorException $e) {
|
|
/* manejar la excpeción */
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
</simplesect>
|
|
|
|
<simplesect role="seealso">
|
|
&reftitle.seealso;
|
|
<simplelist>
|
|
<member>
|
|
<link xlink:href="&url.mongodb.docs;applications/replication/#replica-set-write-concern">MongoDB WriteConcern docs</link>
|
|
</member>
|
|
</simplelist>
|
|
</simplesect>
|
|
|
|
<simplesect role="changelog">
|
|
&reftitle.changelog;
|
|
<informaltable>
|
|
<tgroup cols="2">
|
|
<thead>
|
|
<row>
|
|
<entry>&Version;</entry>
|
|
<entry>&Description;</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>1.3.0</entry>
|
|
<entry>
|
|
Se introdujo <classname>MongoClient</classname>, cuyo comportamiento predeterminado es
|
|
<link linkend="mongo.writeconcerns.acknowledged">reconocer</link> escrituras.
|
|
La obsoleta <classname>Mongo</classname> no reconoce las escrituras de forma
|
|
predeterminada.
|
|
</entry>
|
|
</row>
|
|
<row>
|
|
<entry>1.3.0</entry>
|
|
<entry>
|
|
La opción de escritura <literal>"safe"</literal> ahora es obsoleta y no
|
|
está disponible con la nueva clase <classname>MongoClient</classname>.
|
|
Use la opción <literal>"w"</literal> en su lugar.
|
|
</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
</simplesect>
|
|
|
|
</chapter>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|
|
|