Aller au contenu

Réplication asynchrone dans MongoDB#

Principe de réplication asynchrone#

  • Réplication
    • synchronisation des données entre serveurs pour assurer la cohérence
  • Asynchrone
    • réplication se produit sans attendre la confirmation du serveur secondaire
  • Replica set
    • groupe de serveurs participant à la réplication
  • Membre primaire
    • accepte les écritures, réplique les données vers les secondaires
  • Membres secondaires
    • copient les données du primaire, peuvent devenir primaires si besoin

Avantages et inconvénients de la réplication asynchrone#

Avantages#

  • Haute disponibilité :
    • Récupération rapide en cas de défaillance du serveur primaire
    • Basculement automatique vers un nouveau primaire en cas de défaillance
  • Équilibrage de la charge de lecture
    • Répartition des requêtes de lecture entre les membres
  • Tolérance aux pannes
    • Préservation des données même en cas de panne d'un serveur

Inconvénients#

  • Latence de réplication
    • données peuvent être légèrement en retard sur les membres secondaires
  • Incohérence temporaire
    • état des données peut varier entre les membres du replica set

Mécanismes internes de la réplication asynchrone#

  • Oplog
    • journal des opérations effectuées sur le membre primaire, base de la réplication
  • Tailing
    • processus par lequel les membres secondaires suivent l'Oplog, et appliquent les modifications
  • Initial sync
    • processus de copie initiale des données du primaire vers un nouveau membre secondaire
  • Heartbeats
    • messages périodiques entre les membres pour vérifier leur état

Oplog : structure et fonctionnement#

  • Collection MongoDB : "local.oplog.rs"
  • Stocke les opérations sous forme de documents BSON
  • Oplog circulaire : taille fixe, écrase les anciennes opérations lorsque la limite est atteinte
  • Accès à l'oplog : db.getReplicationInfo() (informations sur l'oplog), db.printReplicationInfo() (format lisible)
  • Exemple d'opération dans l'oplog : { "ts" : Timestamp(1628004626, 1), "t" : NumberLong("1"), "h" : NumberLong("0"), "v" : 2, "op" : "i", "ns" : "test.collection", "ui" : UUID("..."), "wall" : ISODate("..."), "o" : { "_id" : ObjectId("..."), "field" : "value" } }
  • Champs importants :
    • "ts" (timestamp),
    • "op" (type d'opération),
    • "ns" (namespace),
    • "o" (opération)