Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Snapshot des EBS-Volumes, das für die Replikation verwendet wird

Obwohl es eine gute Idee ist, die Datenbank zu sperren und das Dateisystem einzufrieren, wenn Sie den Snapshot initiieren, dauert der eigentliche API-Aufruf zum Initiieren des Snapshots nur den Bruchteil einer Sekunde, sodass Ihre Datenbank und Ihr Dateisystem nicht lange gesperrt/eingefroren sind.

Abgesehen davon gibt es noch ein paar andere Überlegungen, die Sie nicht erwähnt haben:

  1. Wenn Sie versuchen, die Sperre für die Datenbank zu erstellen, muss sie möglicherweise warten, bis andere Anweisungen abgeschlossen sind, bevor die Sperre gewährt wird. Während dieser Zeit kann Ihre ausstehende Sperre weitere Anweisungen enthalten, um zu warten, bis Sie die Sperre erhalten und freigeben. Dies kann zu Unterbrechungen des Anweisungsflusses in Ihrer Produktionsdatenbank führen.

  2. Nachdem Sie die Erstellung des Snapshots initiiert haben, kann Ihre Anwendung/Datenbank das Dateisystem auf dem Volume verwenden, aber wenn Sie viele Schreibvorgänge haben, kann es zu einem hohen iowait kommen, das manchmal ausreicht, um Ihre Anwendung merklich zu verlangsamen. Der Grund dafür ist, dass der Hintergrund-Snapshot-Prozess einen Block nach S3 kopieren muss, bevor er einen Schreibvorgang in diesen Block auf dem aktiven Volume zulässt.

Ich löse das erste Problem, indem ich eine Sperre und eine Zeitüberschreitung anfordere, wenn sie nicht schnell gewährt wird. Ich warte dann ein bisschen und versuche es immer wieder, bis ich die Sperre bekomme. Geeignete Zeitüberschreitungen und Wiederholungsverzögerungen können je nach Datenbanklast variieren.

Ich löse das zweite Problem, indem ich die häufigen, konsistenten Snapshots auf dem Slave statt auf dem Master durchführe, so wie Sie es vorgeschlagen haben. Ich empfehle immer noch, gelegentliche Snapshots gegen den Master durchzuführen, einfach um seine intrinsische Haltbarkeit zu verbessern (eine tiefe EBS-Eigenschaft), aber diese Snapshots müssen nicht mit Sperren oder Einfrieren durchgeführt werden, da Sie sie nicht für Backups verwenden werden.

Ich empfehle auch die Verwendung eines Dateisystems, das Flushing and Freezing (XFS) unterstützt. Andernfalls erstellen Sie Snapshots von gesperrten Tabellen in MySQL, die möglicherweise noch nicht einmal alle ihre Blöcke auf dem EBS-Volume haben, oder andere Teile des Dateisystems könnten im Snapshot geändert und inkonsistent sein.

Falls Sie interessiert sind, ich habe Open-Source-Software veröffentlicht, die die von mir gesammelten Best Practices in Bezug auf die Erstellung konsistenter EBS-Snapshots mit MySQL und XFS (beides optional) durchführt.

Um Ihre letzte Frage zu beantworten, wird die Replikation durch das Sperren von Tabellen im Master nicht unterbrochen. In meiner Snapshot-Software spüle ich auch die Tabellen mit Lesesperre, um sicherzustellen, dass sich alles auf der Festplatte befindet, von der ein Snapshot erstellt wird, und ich füge das Schlüsselwort "LOCAL" hinzu, damit der Flush nicht auf potenzielle Slaves repliziert wird.