Documentos con "marcadores de exclusión"
Los documentos con marcadores de exclusión son pequeños documentos que se mantienen en su lugar dentro de una base de datos cuando se suprime el documento original. Su objetivo es permitir que se pueda replicar la supresión.
Cuando finaliza la réplica, los marcadores de exclusión ya no son necesarios. La compactación automática ayuda a garantizar que solo se conserve y transfiera la cantidad mínima de datos durante la réplica. No obstante, los documentos de las lápidas no se eliminan automáticamente.
Con el tiempo, a medida que los documentos se crean y se suprimen, el número de documentos con marcadores de exclusión aumenta. Cada marcador de exclusión es pequeño, pero gradualmente se suman al uso del espacio de disco de base de datos y al tiempo de consulta del índice primario. Para reducir estos efectos, puede ser recomendable eliminar los marcadores de exclusión.
Eliminación simple de documentos con "marcadores de exclusión"
Para eliminar manualmente los marcadores de exclusión, siga los pasos siguientes:
- Crear una base de datos para que contenga los documentos necesarios.
La nueva base de datos está pensada para contener todos los documentos excepto los documentos con marcadores de exclusión.
- Configure una réplica filtrada para replicar documentos de la base de datos original en la nueva base de datos.
Configure el filtro para que los documentos con el atributo "_deleted" no se repliquen.
-
Cuando finalice la réplica, cambie la lógica de la aplicación para que utilice la nueva base de datos.
-
Verifique que las aplicaciones funcionan correctamente con la nueva base de datos.
Cuando esté satisfecho y considere que todo funciona correctamente, quizás desee suprimir la base de datos antigua.
En general, intente diseñar e implementar sus aplicaciones de modo que realicen la cantidad mínima necesaria de supresión.
Consulte un filtro de ejemplo para excluir documentos suprimidos durante una réplica:
{
"_id": "_design/filters",
"filters": {
"deleted_filter": "function(doc, req) { return !doc._deleted; };"
}
}
Eliminación avanzada de documentos con marcadores de exclusión
La técnica de eliminación simple funciona bien si los documentos no se actualizan en la base de datos de origen mientras se realiza la réplica.
Si se realizan actualizaciones durante la réplica, es posible que un documento completo se replique en la base de datos de destino del modo habitual y que también se suprima de la base de datos de origen, dejando una marca de exclusión. El problema es que la marca de exclusión no se replica en la base de datos de destino porque el filtro excluye la marca de exclusión. Por lo tanto, el documento que se ha suprimido de la base de datos de origen no se suprime de la base de datos de destino, lo que provoca una incoherencia.
Una solución es hacer una eliminación más avanzada de las lápidas utilizando una función validate_doc_update.
Una función validate_doc_update se almacena en un documento de diseño. La función se ejecuta cada vez que se actualiza un documento en la base de datos. La función se puede utilizar para evitar actualizaciones de documento no válidas
o no autorizadas.
La función funciona con los parámetros siguientes:
- La nueva versión del documento.
- La versión actual del documento en la base de datos.
- Un contexto de usuario, que proporciona detalles sobre el usuario que ha proporcionado el documento actualizado.
La función inspecciona la solicitud para determinar si se permite que continúe la actualización. Si la actualización es aceptable, la función devuelve un resultado. Si la actualización no es aceptable, se devuelve el objeto de error correspondiente.
En particular, si el usuario no tiene autorización para realizar la actualización, se devuelve el objeto de error unauthorized, junto con un mensaje de error explicativo. Paralelamente, es posible que no se permita la actualización
solicitada por algún motivo, como por ejemplo cuando faltan algunos campos obligatorios en el nuevo documento. En ese caso, se devuelve el objeto de error forbidden, de nuevo con un mensaje de error explicativo.
Para la eliminación de marcadores de exclusión, una función validate_doc_update adecuada funcionará tal como se indica a continuación:
- Si la actualización es para aplicar un cambio a un documento existente (
oldDoc) dentro de la base de datos de destino, la función permite el cambio devolviendo un resultado.
El motivo es que la actualización ha afectado a un documento que se ha copiado en la base de datos de destino durante la réplica, pero luego ha cambiado en la base de datos de origen durante la réplica. Es posible que el cambio fuera una operación
DELETE, lo que daría como resultado un registro de marcador de exclusión en la base de datos de destino. El registro de marcador de exclusión se elimina mediante un proceso de réplica posterior en algún momento del futuro. 2.
La base de datos de destino no tiene una copia del documento actual y el documento que se va a actualizar tiene la propiedad _deleted (que indica que es un marcador de exclusión). Por lo tanto, el documento actualizado debe ser
un marcador de exclusión y se ha encontrado antes, por lo que debe rechazarse la actualización de la base de datos de destino.
Consulte una función validate_doc_update de JavaScript para rechazar documentos suprimidos que no están ya presentes en la base de datos de destino:
function(newDoc, oldDoc, userCtx) {
// any update to an existing doc is OK
if(oldDoc) {
return;
}
// reject tombstones for docs we don’t know about
if(newDoc["_deleted"]) {
throw({forbidden : "Deleted document rejected"});
}
return; // Not strictly necessary, but clearer.
}
Para utilizar una función validate_doc_update para eliminar documentos con marcadores de exclusión:
- Detener la réplica entre el origen y la base de datos de destino.
- Si procede, suprima la base de datos de destino y luego cree una nueva base de datos de destino.
- Añada una función
validate_doc_updateadecuada, similar a la del ejemplo proporcionado. - Añádala a un documento de diseño en la base de datos de destino.
- Reinicie la réplica entre el origen y la base de datos de destino (nueva).
- Cuando finalice la réplica, cambie la lógica de la aplicación para que utilice la nueva base de datos.
- Verifique que las aplicaciones funcionan correctamente con la nueva base de datos.
Cuando esté satisfecho y considere que todo funciona correctamente, quizás desee suprimir la base de datos antigua.
A continuación se proporciona una variación de uso de la función validate_doc_update para eliminar los documentos con marcadores de exclusión si es posible.
- Añada algunos metadatos a los documentos con marcadores de exclusión, por ejemplo para registrar la fecha de supresión.
- Utilice la función para inspeccionar los metadatos y permitir que se supriman los documentos si se deben aplicar a la base de datos de destino.
Esta comprobación ayuda a garantizar una correcta réplica de la supresión.
Implicaciones en el rendimiento de la eliminación de marcadores de exclusión
Los marcadores de exclusión se utilizan para suprimir de forma más coherente documentos de bases de datos. Este propósito es especialmente importante para los dispositivos móviles: Sin documentos de marcador de exclusión, es posible que una supresión no se replique correctamente en un dispositivo móvil, con el resultado de que es posible que los documentos no se supriman nunca del dispositivo.
Si vuelve a crear una base de datos, por ejemplo, un nuevo destino para una réplica. Los clientes que utilicen la base de datos de destino como servidor deben volver a pasar por todos los cambios, ya que es probable que los números de secuencia de la base de datos sean diferentes.
Si está utilizando una función validate_doc_update, evite replicar esa función en los clientes. Esta regla sirve para evitar la posibilidad de efectos secundarios no deseados resultantes de tener la función en el cliente.
Las bibliotecas de sincronización de IBM Cloudant no replican los documentos de diseño, por lo que la réplica de funciones validate_doc_update no suele ser un problema
para IBM Cloudant. Sin embargo, es posible que otros clientes repliquen los documentos de diseño o las funciones validate_doc_update, lo que podría dar lugar a efectos secundarios no deseados.