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)