...

Réplication de la base de données dans l'hébergement : maître-esclave vs. multi-maître

Réplication de la base de données décide, dans le domaine de l'hébergement, de la disponibilité des applications en cas de charge croissante et de la rapidité avec laquelle elles peuvent à nouveau écrire et lire après des perturbations. Je montre clairement la différence entre Master-Slave et Multi-Master, y compris le réglage, les stratégies de basculement et les scénarios d'utilisation appropriés.

Points centraux

Les aspects clés suivants m'aident à choisir la bonne stratégie de réplication.

  • Maître-esclave: des writes simples, des reads évolutifs, des responsabilités claires.
  • Multi-Master: Ecritures distribuées, disponibilité accrue, mais gestion des conflits.
  • GTIDs & Failover : des commutations plus rapides et des chemins de réplication plus propres.
  • Réalité de l'hébergement: la latence, le stockage et le réseau influencent la cohérence.
  • Suivi & Tuning : les métriques, les temps de rattrapage et les réglages binlog en un coup d'œil.

Ce que la réplication apporte à l'hébergement

J'utilise la réplication pour Disponibilité répartir les charges de lecture et permettre des fenêtres de maintenance sans pannes. Les topologies maître-esclave centralisent les écritures, tandis que plusieurs réplicas gèrent les lectures en masse et réduisent ainsi les temps de réponse. Les variantes multi-maîtres permettent des écritures réparties, ce qui réduit les latences dans les configurations globales et permet de supporter plus facilement une perte de nœud. Pour les piles web de WordPress, les moteurs de boutique ou les API, cela signifie plus de tampons contre les pics de trafic et une récupération plus rapide après des incidents. Si l'on prévoit une croissance horizontale au-delà de la simple réplication, on la relie progressivement avec Sharding et réplication, pour répartir plus largement les données et la charge, et Mise à l'échelle de rendre la planification possible.

Maître-esclave : fonctionnement et points forts

Dans une configuration maître-esclave, je n'écris systématiquement que sur le Master, tandis que les esclaves se chargent des accès en lecture et suivent les binlogs. La répartition claire des rôles permet d'éviter les conflits d'écriture et de maintenir la clarté du modèle. Cela convient parfaitement à de nombreux scénarios d'hébergement avec une part élevée de lecture, comme les catalogues de produits, les portails de contenu ou les tableaux de bord de reporting. Selon les besoins, j'ajoute d'autres esclaves sans modifier la distance d'écriture. Je prévois des tampons pour les retards de réplication, afin que les rapports ou les caches soient cohérents malgré de courts retards. Résultats livrer.

MySQL maître-esclave, étape par étape

Je démarre sur le master avec un logging binaire et un identifiant unique server-id, pour que les esclaves puissent suivre : Dans my.cnf, je mets server-id=1, log_bin=mysql-bin, en option binlog_do_db pour la réplication filtrée. Ensuite, je crée un utilisateur de réplication dédié et je limite ses droits au strict nécessaire. Pour la synchronisation initiale, je crée un dump avec --master-data, Je l'importe sur l'esclave et je mémorise le fichier journal et la position. Sur l'esclave, je définis server-id=2, activez le journal de relais et connectez-le à l'adresse suivante CHANGER DE MAÎTRE EN ...suivi de START SLAVE. Avec SHOW SLAVE STATUS\N je considère Seconds_Behind_Master et réagis si le retard augmente.

Optimisations pour les environnements d'hébergement

Pour un basculement propre, j'active GTIDs et simplifie ainsi les commutations sans avoir à réajuster péniblement les positions des logs. Je route les lectures de manière ciblée via des couches proxy comme ProxySQL ou la logique de l'application afin d'éviter les points chauds et d'augmenter le taux d'utilisation du cache. Avec sync_binlog=1 je sécurise les binlogs contre les crashs, tandis que des valeurs modérées de sync_relay_log Atténuer les surcharges d'écriture sans laisser le retard s'étendre. Je fais attention aux capacités d'E/S, car les SSD lents ou les pools de stockage partagés font grimper le retard. Pour les audits et la conformité, je ferme les canaux de réplication avec des TLS et garde les clés séparées du chemin des données.

Multi-Master : quand cela fait-il sens ?

J'utilise Multi-Master lorsque je dois répartir géographiquement des writes ou lorsqu'un seul write est nécessaire. Nœuds ne peut plus supporter de charge d'écriture. Tous les nœuds acceptent les modifications, se les propagent mutuellement et compensent ainsi plus facilement les pannes. Le prix à payer est la gestion des conflits : les mises à jour simultanées de la même ligne nécessitent des règles, par exemple des "last writer wins", des fusions côté application ou des séquences transactionnelles. Dans les charges de travail sensibles à la latence, par exemple les passerelles de paiement ou les backends SaaS globaux, la configuration peut réduire considérablement les temps de réaction. J'évalue à l'avance si mon application tolère les conflits et si je peux fournir des informations claires et précises. Stratégies pour la résolution.

MySQL Multi-Master en pratique

Je mise sur la réplication basée sur GTID parce qu'elle simplifie les canaux et le basculement, et Erreur les rendre visibles plus rapidement. La réplication multi-source me permet d'injecter plusieurs maîtres dans un nœud, par exemple pour des évaluations centrales ou l'agrégation. Pour les véritables topologies de pairs, je définis des stratégies de clés peu conflictuelles, je vérifie les offsets d'auto-incrément et je réduis les timestamps dérivants. J'observe les pics de latence, car les écritures parallèles à travers les régions augmentent les efforts de coordination et peuvent coûter du débit. Sans un monitoring propre et des règles d'exploitation claires, je ne mettrais pas les multi-masters en production. commutent.

Tableau comparatif : maître-esclave vs. multi-maître

Le tableau suivant résume les principales différences et me facilite la tâche. Décision dans le quotidien de l'hébergement.

Critère Maître-esclave Multi-Master
Écrits Un master traite tous les Opérations d'écriture Tous les nœuds acceptent les writes
Consistance Strict, conflits improbables Plus doux, conflits possibles
Mise à l'échelle Reads très extensible Reads et Writes extensibles
Frais d'installation Aisément maîtrisable Plus d'efforts et plus de règles
Cas d'utilisation typiques Blogs, boutiques, reporting Apps globales, APIs critiques en termes de latence

Haute disponibilité, RTO/RPO et sécurité

Je définis clairement RTO/RPO-et aligne la réplication sur ces cibles : Combien de temps la restauration peut-elle durer, combien de données puis-je perdre ? La réplication synchrone ou semi-synchrone peut réduire les pertes, mais elle a un coût en termes de latence et de débit. Les sauvegardes ne remplacent pas la réplication, elles la complètent pour la restauration ponctuelle et les états historiques. Je vérifie régulièrement les tests de restauration, car seule une sauvegarde testée compte dans la pratique. Pour une planification propre, je renvoie à mon guide sur les RTO/RPO dans l'hébergement, Les chiffres clés doivent être adaptés à la réalité de l'entreprise et à ses besoins. Risques correspondent.

Chemin de mise à l'échelle : du nœud individuel au cluster

Je commence souvent avec un seul Master, J'ajoute un réplica pour les lectures et les sauvegardes, puis j'évolue progressivement. Si la part des lectures augmente, j'ajoute des esclaves supplémentaires et je complète la configuration avec la mise en cache. Si la capacité d'écriture ne suffit plus, je prévois des chemins multimaîtres, je vérifie les risques de conflit et j'ajoute l'idempotence à l'application. Lors de transformations importantes, je migre avec des stratégies de rolling, des phases Blue/Green ou Dual-Write et je tiens des réserves à disposition pour les rollbacks. Pour les conversions sans panne, j'utilise le guide de Migrations à temps de descente zéro, pour que les utilisateurs n'aient pas à Interruptions sentir.

Réglage des performances : latence, E/S et mise en cache

J'observe la latence sur le réseau, les IOPS sur le stockage et les pics de CPU sur les Nœuds, car ces trois facteurs contrôlent le retard de la réplication. Une couche Redis ou Memcached locale prend les lectures de la pile et maintient les esclaves déchargés. Je fractionne les grosses transactions pour éviter les inondations de binlogs et réduire les arrêts de commit. Pour les charges de travail lourdes en écriture, j'augmente modérément les tampons de logs innodb et je régule les intervalles de flux sans compromettre la durabilité. Je maintiens les plans de requêtes propres, car de mauvais index entraînent des coûts élevés aussi bien pour les maîtres que pour les esclaves. Scans.

Prévention et résolution des conflits dans Multi-Master

J'évite les conflits en séparant logiquement les zones d'écriture, par exemple par Mandant, région ou espace de clés. Les décalages d'auto-incrément (p. ex. 1/2/3 pour trois nœuds) empêchent les collisions de clés primaires. Lorsque des mises à jour simultanées sont inévitables, je documente des règles claires, par exemple les "last writer wins" ou les fusions côté application. Des écritures idéalement poreuses et des consommateurs dédupliquants protègent contre les doubles traitements. En outre, j'enregistre les informations d'audit afin de pouvoir prendre rapidement des décisions en cas de litige. suivre de pouvoir.

Dépistage des erreurs : Ce que je vérifie en premier

En cas de retard, je vérifie Seconds_Behind_Master, les threads I/O et SQL et les tailles de logs de relais. Je regarde les tailles et les formats de binlog, car STATEMENT vs. ROW peut modifier massivement le volume. Les métriques de stockage telles que les temps de flux et les files d'attente montrent si les disques SSD sont utilisés au maximum de leur capacité ou s'ils ralentissent. Si les GTID sont actifs, je compare les transactions appliquées et manquantes par canal. En cas d'urgence, j'arrête et je démarre le réplicateur de manière ciblée afin de résoudre les blocages, et je corrige ensuite seulement les Configuration.

Modèles de cohérence et Read-after-Write

Avec la réplication asynchrone, je planifie consciemment consistance éventuelle est activée. Pour les actions des utilisateurs avec un feedback direct, je sécurise Lecture après écriture, Je peux ainsi éviter que les sessions d'écriture ne soient liées au maître pendant un court laps de temps ou que les lectures ne soient retardées. J'utilise des indicateurs d'application (par exemple „stickiness“ pendant 2 à 5 secondes) et je contrôle Seconds_Behind_Master, avant d'autoriser une réplique à effectuer des lectures critiques. Sur les répliques, je place read_only=ON et super_read_only=ON, pour éviter que des écritures accidentelles ne glissent. Avec des niveaux d'isolation bien choisis (LECTURE RÉPÉTABLE vs. READ COMMITTED), j'évite que de longues transactions ralentissent le fil Apply.

Topologies : étoile, cascade et fan-out

Outre l'étoile classique (tous les esclaves tirent directement du maître), je mise sur réplication en cascade, Je peux aussi utiliser des nœuds de secours lorsque de nombreux réplicas sont nécessaires ou que les liens WAN sont limités. Pour cela, j'active sur les nœuds intermédiaires log_slave_updates=ON, pour qu'elles servent de source pour les répliques en aval. De cette manière, je décharge l'E/S maître et répartis mieux la bande passante. Je fais attention aux niveaux de latence supplémentaires : Chaque cascade augmente potentiellement le retard et exige une surveillance étroite. Pour les configurations globales, je combine des hubs régionaux avec de courtes distances et je garde au moins deux réplicas par région pour la maintenance et les réparations. Basculement prêt.

Basculement planifié et non planifié

Je documente une claire Processus de promotion1) Arrêter les écritures sur le master ou tourner le flux de trafic en lecture seule, 2) Choisir le réplica candidat (lag le plus bas, GTIDs complets), 3) Promouvoir le réplica et read_only 4) réaligner les nœuds restants. Contre Cerveau divisé je me protège avec un guidage clair (par ex. commutation VIP/DNS avec des TTL courts) et des blocages automatiques. Les outils d'orchestration aident, mais je pratique régulièrement les chemins manuels. Je garde des runbooks, des alarmes et des Drills pour que personne ne doive improviser en cas d'urgence.

Les GTID en pratique : pierres d'achoppement et guérison

Pour les GTID, j'active enforce_gtid_consistency=ON et gtid_mode=ON de manière progressive. J'utilise auto-position, pour faciliter le changement de source, et évitez les filtres de réplication sur les routes GTID, car ils rendent le débogage difficile. Si errant transactions (transactions qui existent sur un réplica mais pas sur la source), je les identifie par la différence de gtid_executed et la source et nettoie de manière contrôlée - pas à l'aveuglette avec des purges. Je planifie la conservation de Binlog de manière à ce que les reconstructions soient possibles sans lacunes et je vérifie la cohérence de gtid_purged.

Parallélisation et débit sur les réplicas

Pour réduire l'apply-lag, j'augmente replica_parallel_workers en fonction du nombre de processeurs et choisis replica_parallel_type=LOGICAL_CLOCK, Les transactions qui s'y rapportent doivent rester ordonnées. Avec binlog_transaction_dependency_tracking=WRITESET j'augmente le parallélisme, car des écritures indépendantes peuvent être appliquées simultanément. J'observe les temps d'attente de deadlock et de lock sur les réplicas : un parallélisme excessif peut générer des mises à jour concurrentes. De plus, cela aide Commit de groupe sur le maître (flush-delays attachés) pour regrouper plus efficacement des transactions connexes - sans faire exploser la plage de latence P95.

Modifications de schémas sans temps d'arrêt

Je préfère DDL en ligne avec InnoDB (ALGORITHM=INPLACE/INSTANT, LOCK=NONE) pour porter les modifications des tables à travers la réplication sans bloquer les requêtes. Pour les très grandes tables, j'opte pour des méthodes basées sur des chunk, je divise les index et je garde un œil sur la charge binlog. Pour les multi-maîtres, je planifie strictement les fenêtres DDL, car les modifications de schéma concurrentes sont difficiles à guérir. Je teste les DDL sur un réplica, je mesure leur influence sur le lag et je ne fais ma promotion que lorsque le chemin de réplication reste stable.

Réplication retardée comme filet de protection

Contre les erreurs logiques (DROP/DELETE), je considère qu'une delayed Replica prêt, par exemple avec replica_sql_delay=3600. Je peux ainsi revenir à un état propre en une heure, sans devoir exécuter immédiatement un PITR à partir de sauvegardes. Je n'utilise jamais ce réplica pour des lectures ou des basculements - il s'agit d'un simple tampon de sécurité. J'automatise les recopies à partir de ce nœud afin de pouvoir remonter rapidement un nœud de lecture frais et actuel en cas d'urgence.

Mises à jour, compatibilité et fonctionnement

Je garde les versions source et cible proches l'une de l'autre et je mets à niveau en continud'abord les réplicas, ensuite le master. Je considère les environnements mixtes avec MySQL/MariaDB d'un œil critique, car les formats binlog et les fonctionnalités peuvent diverger. Je place binlog_row_image=MINIMAL là où c'est utile pour atténuer le volume de binlog et vérifier les dépendances d'application pour les déclencheurs ou les procédures stockées. Pour la compression des protocoles et des binlogs, je réduis la charge du WAN, mais je veille à ne pas dépasser les budgets CPU.

Observabilité et planification des capacités

Je définis les SLO pour Lag, les temps de récupération, les taux d'erreur et le débit. Les variables clés sont, entre autres, les transactions appliquées par seconde, les niveaux de remplissage du journal de relais, les files d'attente E/S, les temps d'attente de verrouillage et la latence du réseau. Je saisis la croissance du binlog, planifie binlog_expire_logs_seconds et je vérifie que les reconstructions respectent les délais de conservation. Sur les réplicas, je fixe des limites telles que max_connections et je surveille les interruptions pour éviter que les charges de lecture ne tombent dans le vide. Pour les coûts et la taille, je calcule les niveaux de fan-out, les besoins de stockage et les coûts. Charges de pointe contre des cibles RPO/RTO.

Sécurité et conformité des opérations de réplication

Je ferme des liens de bout en bout et sépare strictement les comptes d'opérateur, d'application et de réplication. Des audits réguliers des droits empêchent les utilisateurs de réplication de conserver des autorisations DDL/DML inutiles. Je protège les sauvegardes hors site par une gestion séparée des clés et je contrôle les chemins d'accès pour éviter les mouvements latéraux. Pour la protection des données, je respecte les règles de suppression et je réplique des enregistrements pseudonymisés ou minimisés si l'objectif le permet. Je partage les logs et les métriques selon le principe du moindre privilège, afin que la télémétrie ne soit pas utilisée à la légère. fuite produit.

En bref

Pour les scénarios d'hébergement, Master-Slave fournit une solution fiable pour la gestion des données. Base, Les lectures évoluent facilement et les conflits sont rares. Si les écritures globales, la faible latence et la tolérance aux pannes sont prioritaires, j'envisage des multimaîtres et je prévois des règles de résolution des conflits. Je combine les GTID, une surveillance propre et des sauvegardes bien pensées pour atteindre les objectifs de récupération en toute sécurité. En ajustant les paramètres binlog, de stockage et de requête, je réduis les retards et maintiens un débit élevé. Je choisis ainsi la topologie appropriée, j'évolue de manière contrôlée et je préviens les pannes pour les utilisateurs. invisible.

Derniers articles