Documents "tombstone"
Les documents tombstone sont de petits documents qui sont conservés dans une base de données à la place du document original qui est supprimé. Ils permettent de répliquer la suppression.
Une fois la réplication terminée, les documents tombstone ne sont plus requis. La compression automatique garantit que seule la quantité minimale de données sera conservée et transférée au cours de la réplication. Néanmoins, les documents de la pierre tombale ne sont pas automatiquement supprimés, les documents de base ne sont pas automatiquement supprimés.
Au fil du temps, au fur et à mesure que des documents sont créés et supprimés, le nombre de documents tombstone augmente. Chaque document tombstone est petit, mais peu à peu, ils contribuent à l'utilisation de l'espace disque de la base de données et au temps de requête pour l'index principal. Pour limiter ces effets, vous pouvez décider de retirer les documents tombstone.
Retrait simple des documents "tombstone"
Pour retirer des documents tombstone manuellement, procédez comme suit :
- Créez une base de données devant contenir les documents requis.
La nouvelle base de données contiendra tous les documents sauf les documents tombstone.
- Configurez une réplication filtrée afin de répliquer des documents depuis la base de données d'origine dans la nouvelle base de données.
Configurez le filtre pour que les documents associés à l'attribut "_deleted" ne soient pas répliqués.
-
Une fois la réplication terminée, changez votre logique d'application pour utiliser la nouvelle base de données.
-
Vérifiez que vos applications fonctionnent correctement avec la nouvelle base de données.
Une fois que vous avez constaté que tout fonctionne correctement, vous pouvez supprimer l'ancienne base de données, si vous le souhaitez.
En général, essayez de concevoir et d'implémenter vos applications en vue de procéder à un nombre de suppressions nécessaires minimal.
Voici un exemple de filtre permettant d'extraire les documents supprimés au cours d'une réplication :
{
"_id": "_design/filters",
"filters": {
"deleted_filter": "function(doc, req) { return !doc._deleted; };"
}
}
Retrait avancé des documents tombstone
La technique de retrait simple fonctionne bien si les documents ne sont pas mis à jour dans la base de données source pendant la réplication.
Si des mises à jour sont effectuées pendant la réplication, il se peut qu'un document complet soit répliqué dans la base de données cible comme prévu, mais qu'il soit également supprimé de la base de données source et qu'il fasse place à un document tombstone. Le problème, c'est que le document tombstone n'est pas répliqué dans la base de données cible étant donné qu'il est exclu par le filtre. Par conséquent, le document qui a été supprimé de la base de données source n'est pas supprimé de la base de données cible, ce qui génère une incohérence.
Une solution consiste à procéder à une suppression plus avancée des pierres tombales en utilisant une fonction validate_doc_update.
Une fonction validate_doc_update est stockée dans un document de conception. La fonction est exécutée à chaque fois qu'un document est mis à jour dans la base de données. Elle peut être utilisée pour empêcher les mises à jour de
document non valides ou non autorisées.
La fonction opère à l'aide des paramètres suivants :
- La nouvelle version du document
- La version en cours du document dans la base de données
- Un contexte utilisateur, qui donne des détails sur l'utilisateur qui a fourni le document mis à jour.
La fonction inspecte la demande pour déterminer si la mise à jour peut avoir lieu. Si la mise à jour est acceptable, la fonction renvoie une valeur. Si la mise à jour n'est pas acceptable, un objet erreur adéquat est renvoyé. En particulier,
si l'utilisateur n'est pas autorisé à effectuer la mise à jour, un objet erreur unauthorized est renvoyé avec un message d'erreur explicatif. De même, il se peut que la mise à jour demandée ne soit pas autorisée pour une raison
quelconque, par exemple lorsque certaines zones obligatoires ne figurent pas dans le nouveau document. Dans ce cas, un objet erreur forbidden est renvoyé, également avec un message d'erreur explicatif.
Pour le retrait des documents tombstone, une fonction validate_doc_update adaptée fonctionne comme suit :
- Si la mise à jour consiste à appliquer une modification à un document existant (
oldDoc) dans la base de données cible, la fonction autorise la modification en renvoyant une valeur.
En effet, la mise à jour a affecté un document qui a été copié dans la base de données cible pendant la réplication, mais a ensuite changé dans la base de données source pendant la réplication. Il est possible que le changement ait été une opération
DELETE qui a généré un enregistrement tombstone dans la base de données cible. L'enregistrement tombstone est retiré par un processus de réplication ultérieur. 2. La base de données cible ne contient aucune copie du document actuel
et le document à mettre à jour possède la propriété _deleted (qui indique qu'il s'agit d'un document tombstone). Le document mis à jour doit donc être un document tombstone qui a été rencontré auparavant, si bien que la mise à
jour de la base de données cible doit être rejetée.
Voici un exemple de fonction JavaScript validate_doc_update rejetant les documents supprimés qui ne se trouvent pas déjà dans la base de données cible :
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.
}
Pour utiliser une fonction validate_doc_update afin de retirer des documents tombstone :
- Arrêtez la réplication de la base de données source vers la base de données cible.
- Si approprié, supprimez la base de données cible, puis créez une nouvelle base de données cible.
- Ajoutez une fonction
validate_doc_updateadaptée, conformément à l'exemple fourni. - Ajoutez-la à un document de conception dans la base de données cible.
- Redémarrez la réplication entre la base de données source et la (nouvelle) base de données cible.
- Une fois la réplication terminée, changez votre logique d'application pour utiliser la nouvelle base de données.
- Vérifiez que vos applications fonctionnent correctement avec la nouvelle base de données.
Une fois que vous avez constaté que tout fonctionne correctement, vous pouvez supprimer l'ancienne base de données, si vous le souhaitez.
Voici une variante de l'utilisation de la fonction validate_doc_update pour supprimer les documents tombstone, le cas échéant.
- Ajoutez des métadonnées aux documents tombstone, par exemple pour enregistrer la date de suppression.
- Utilisez la fonction pour inspecter les métadonnées et autoriser les documents de suppression s'ils doivent être appliqués à la base de données cible.
Cette vérification permet de garantir une réplication correcte de la suppression.
Incidence sur les performances du retrait de documents tombstone
Les documents tombstone sont utilisés pour assurer une suppression plus cohérente des documents dans les bases de données. Cet objectif est particulièrement important pour les appareils mobiles : Sans documents tombstone, une suppression peut ne pas se répliquer correctement sur un périphérique mobile, avec comme résultat le fait que les documents risquent de ne jamais être supprimés de l'unité.
Si vous recréez une base de données, par exemple une nouvelle cible pour la réplication, les clients qui utilisent la base de données cible doivent réexaminer toutes les modifications car il se peut que les numéros de séquence de base de données diffèrent.
Si vous utilisez une fonction validate_doc_update, évitez de répliquer cette fonction sur les clients. Cette règle permet d'éviter les effets secondaires indésirables résultant de la présence de la fonction sur le client.
Les fonctions des bibliothèques de synchronisation IBM Cloudant ne répliquent pas les documents de conception ; par conséquent, la réplication des fonctions validate_doc_update ne devrait pas poser problème pour IBM Cloudant. Toutefois, d'autres clients peuvent répliquer les documents de conception ou les fonctions validate_doc_update, ce qui peut potentiellement générer des effets secondaires indésirables.