Detaillierte Erklärung des Server-ID-Beispiels bei der MySQL-Master-Slave-Synchronisierung

Detaillierte Erklärung des Server-ID-Beispiels bei der MySQL-Master-Slave-Synchronisierung

Vorwort

Wenn wir einen MySQL-Cluster erstellen, müssen wir natürlich die Master-Slave-Synchronisierung der Datenbank abschließen, um die Datenkonsistenz sicherzustellen. Es gibt viele Möglichkeiten der Master-Slave-Synchronisierung, darunter ein Master und mehrere Slaves, verkettete Master-Slaves und mehrere Master und mehrere Slaves. Sie können sie entsprechend Ihren Anforderungen einrichten. Solange Sie jedoch eine Master-Slave-Synchronisierung benötigen, müssen Sie auf die Konfiguration der Server-ID achten, da sonst Ausnahmen bei der Master-Slave-Replikation auftreten.

Bei der Steuerung der Datenbankdatenreplikation und der Protokollverwaltung gibt es zwei wichtige Konfigurationen: Server-ID und Server-UUID, die sich auf binäre Protokolldateidatensätze und globale Transaktionskennungen auswirken.

Server-ID-Konfiguration

Wenn Sie eine Master-Slave-Topologie verwenden, achten Sie darauf, für alle MySQL-Instanzen eine eindeutige Server-ID anzugeben. Der Standardwert ist 0. Wenn die Server-ID = 0 ist, zeichnet der Master weiterhin Binärprotokolle auf, lehnt jedoch alle Slave-Verbindungen ab. Der Slave lehnt Verbindungen zu anderen Instanzen ab.

Die Server-ID der MySQL-Instanz ist eine globale Variable und kann direkt angezeigt werden:

mysql> Variablen wie „%server_id%“ anzeigen;
+---------------+-----------+
| Variablenname | Wert |
+---------------+-----------+
| Server-ID | 171562767 |
+---------------+-----------+
1 Zeile im Satz (0,00 Sek.)

Wir können die globale Variable Server-ID direkt online ändern, die Änderung wird jedoch nicht sofort wirksam. Denken Sie daher daran, den Dienst nach der Änderung neu zu starten. Nach dem Neustart wird die Systemkonfigurationsdatei erneut gelesen, wodurch die vorherige Änderung ungültig wird. Daher wird empfohlen, die Konfigurationsdatei zu ändern und den Dienst neu zu starten, anstatt sie online zu ändern:

#meine.cnf
[mysqld]
#Replikation
log-bin=mysql-bin
Server-ID = 171562767
sync_binlog=1
binlog-ignore-db=mysql
binlog-ignore-db=informationsschema

Server-ID-Verwendung

Die Server-ID wird zur Identifizierung der Datenbankinstanz verwendet, um Endlosschleifen von SQL-Anweisungen in verketteten Master-Slave- oder Multi-Master-Multi-Slave-Topologien zu verhindern:

  • Markieren Sie die Quellinstanz des Binlog-Ereignisses
  • Filtern Sie das Binärprotokoll der Hauptdatenbank. Wenn die Server-ID identisch ist, überspringen Sie die Ereignisausführung, um eine Endlosschleifenausführung zu vermeiden.
  • Wenn replicate-same-server-id=1 gesetzt ist, werden alle Ereignisse ausgeführt, dies kann jedoch zu einer Endlosschleife von SQL-Anweisungen führen.

Lassen Sie uns anhand von zwei Beispielen verdeutlichen, warum die Server-ID nicht wiederholt werden sollte:

Wenn die Server-ID der Primär- und Standby-Datenbanken dupliziert werden

Da replicate-same-server-id=0 standardmäßig ist, überspringt die Slave-Datenbank alle mit der Master-Datenbank synchronisierten Daten, was zu Inkonsistenzen zwischen Master- und Slave-Daten führt.

Wenn die Server-IDs zweier Standby-Datenbanken dupliziert werden

Dies führt dazu, dass die Verbindung zwischen der Slave-Datenbank und der Master-Datenbank von Zeit zu Zeit getrennt wird, was zu einer großen Anzahl von Ausnahmen führt. Gemäß dem Design von MySQL werden die Master- und Slave-Datenbanken über einen Ereignismechanismus verbunden und synchronisiert. Wenn bei einer neuen Verbindung die Server-ID identisch ist, trennt die Master-Datenbank die vorherige Verbindung und registriert die neue Verbindung erneut. Wenn Datenbank A mit der Hauptdatenbank verbunden ist, stellt Datenbank B eine Verbindung zu ihr her, wodurch die Verbindung zu Datenbank A getrennt wird. Datenbank A stellt dann die Verbindung wieder her und dieser Zyklus wiederholt sich, was zu einer großen Menge an abnormalen Informationen führt.

Regeln zum Generieren der Server-ID

Da die Server-ID nicht dieselbe sein kann, wenn wir 10 Instanzen haben, wie können wir sicherstellen, dass jede Instanz anders ist? Es gibt mehrere häufig verwendete Methoden:

  • Zufallszahlen
  • Zeitstempel
  • IP-Adresse + Port
  • Zentrale Verteilung im Management Center und Generierung einer Self-Increment-ID

Alle oben genannten Methoden sind in Ordnung, achten Sie jedoch darauf, den Maximalwert 2^32-1 nicht zu überschreiten. Der Wert sollte vorzugsweise >2 sein. Die Methode, die ich verwende, besteht aus den letzten beiden Ziffern der IP-Adresse + der lokalen MySQL-Instanznummer. Wenn Sie jedoch Docker zum Verwalten mehrerer Instanzen verwenden, wie generieren Sie dies? Können Sie sich vorstellen, ob es eine elegante Lösung gibt?

Server-UUID-Konfiguration

Der MySQL-Dienst erstellt und generiert automatisch die Server-UUID-Konfiguration:

  • Lesen Sie die UUID in der Datei ${data_dir}/auto.cnf
  • Wenn es nicht existiert, erstellen Sie die Datei automatisch, generieren Sie eine neue UUID und lesen Sie sie
Shell> cat ~/mysql/data/auto.cnf
[Auto]
server-uuid=fd5d03bc-cfde-11e9-ae59-48d539355108

Der Konfigurationsstil von auto.cnf ähnelt my.cnf, aber diese Datei enthält nur einen automatischen Konfigurationsblock und eine Server-UUID-Konfigurationszeile. Es wird automatisch erstellt. Ändern Sie den Inhalt daher nicht.

In der Master-Slave-Topologie können Master und Slave die UUID des jeweils anderen kennen. Verwenden Sie „show slave hosts“ auf dem Master und „show slave status“ auf dem Slave, um das Feld „Master_UUID“ anzuzeigen.

Der Parameter Server-UUID ersetzt nicht den Parameter Server-ID. Sie haben unterschiedliche Funktionen. Wenn beim Synchronisieren der Master- und Slave-Instanzen die Server-UUID der Master- und Slave-Instanzen identisch sind, wird ein Fehler gemeldet und das System wird beendet. Wir können den Fehler jedoch vermeiden, indem wir replicate-same-server-id=1 festlegen (nicht empfohlen).

Verweise

  • 17.1.6 Replikations- und Binärprotokollierungsoptionen und -variablen: https://dev.mysql.com/doc/ref...
  • So generieren Sie eine eindeutige Server-ID: https://www.jb51.net/article/169550.htm

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Zwei Möglichkeiten zur Lösung des Problems, dass die MySQL-Master-Slave-Datenbank nicht synchronisiert wird
  • Master-Slave-Synchronisationskonfiguration der Mysql-Datenbank
  • Dieser Artikel zeigt Ihnen das Prinzip der MySQL Master-Slave-Synchronisation
  • So führen Sie MySQL in einer Docker-Umgebung aus und aktivieren Binlog, um die Master-Slave-Synchronisierung zu konfigurieren
  • MySQL Master-Slave-Synchronisation, Implementierungsprinzip des Transaktions-Rollbacks
  • Detaillierte Erläuterung des tatsächlichen Prozesses der Master-Slave-Synchronisierung der MySQL-Datenbank
  • Master-Slave-Synchronisationskonfiguration und Lese-/Schreibtrennung der MySQL-Datenbank
  • Prinzip und Anwendung der MySQL-Master-Slave-Synchronisation

<<:  So implementieren Sie die automatische Ansible-Installation und -Konfiguration von httpd im Linux-System

>>:  Der gesamte Prozess der Realisierung der Website-Internationalisierung mit Vite2 und Vue3

Artikel empfehlen

CentOS 7.x Docker verwendet die Overlay2-Speichermethode

Bearbeiten Sie /etc/docker/daemon.json und fügen ...

So bedienen Sie Datei- und Ordnerberechtigungen unter Linux

Linux-Dateiberechtigungen Überprüfen wir zunächst...

Analysieren Sie CSS, um die Farbfunktion des Bildthemas zu extrahieren (Tipps)

Hintergrund Alles begann, als ein Klassenkamerad ...

Schritte zum Übertragen des neuen Kernels auf das Linux-System

1. Laden Sie das Ubuntu16.04-Image und den entspr...

So kaufen Sie einen Server und richten ihn zunächst ein

Ich habe eine Weile nicht mit Servern gearbeitet....

JavaScript Canvas realisiert dynamische Punkt- und Linieneffekte

In diesem Artikel wird der spezifische Code für J...

Was tun, wenn der Auto-Increment-Primärschlüssel in MySQL aufgebraucht ist?

Im Vorstellungsgespräch sollten Sie folgende Szen...

So verwenden Sie weniger im WeChat-Applet (optimale Methode)

Vorwort Ich bin es gewohnt, Less/Sass zu schreibe...

Wie setze ich eine Unterstreichung in HTML? So unterstreiche ich Text in HTML

Früher bestand das Unterstreichen in HTML darin, ...

Beispiel für eine geplante MySQL-Datenbanksicherung

Dieser Artikel beschreibt das Beispiel eines gepl...

Videojs+Swiper realisiert Taobao-Produktdetailkarussell

In diesem Artikel wird der spezifische Code von v...