[+/-]
Die MySQL-Replikation wird unter Verwendung von drei Threads
implementiert: einem auf dem Master und zweien auf dem Slave. Wenn
eine START SLAVE
-Anweisung auf einem
Slave-Server abgesetzt wird, erstellt der Slave einen I/O-Thread,
der eine Verbindung zum Master herstellt und ihn auffordert, die
in seinen Binärlogs aufgezeichneten Änderungen zu senden. Der
Master erstellt daraufhin einen Thread, um die Inhalte des
Binärlogs an den Slave zu senden. Dieser Thread erscheint als
Binlog Dump
in der Ausgabe von SHOW
PROCESSLIST
auf dem Master. Der Slave-I/O-Thread liest
die Aktualisierungen, die der Binlog
Dump
-Thread des Masters sendet, und kopiert diese in
lokale Dateien, die Relay-Logs heißen und
sich im Datenverzeichnis des Slaves befinden. Der dritte Thread
ist der SQL-Thread, den der Slave erstellt, um die Relay-Logs zu
lesen und die enthaltenen Aktualisierungen auszuführen.
In der vorhergehenden Beschreibung wurden drei Threads pro Master/Slave-Verbindung beschrieben. Ein Master, der mehrere Slaves hat, erstellt einen Thread pro aktuell angeschlossenem Slave, und jeder Slave hat seine eigenen I/O- und SQL-Threads.
Der Slave verwendet zwei Threads, d. h., das Lesen der Updates vom Master und ihre Ausführung können auf zwei unabhängige Tasks verteilt werden. Auf diese Weise wird der Task zum Lesen der Anweisungen auch dann nicht verlangsamt, wenn die Anweisungsausführung selbst langsam erfolgt. Wenn beispielsweise der Slave-Server eine Zeit lang nicht ausgeführt wurde und dann gestartet wird, kann sein I/O-Thread schnell alle Inhalte des Binärlogs vom Master holen – und zwar auch dann, wenn der SQL-Thread nicht mitkommt. Sollte der Slave beendet werden, bevor der SQL-Thread alle erhaltenen Anweisungen ausgeführt hat, so hat der I/O-Thread zumindest alles abgerufen, d. h., eine sichere Kopie der Anweisungen ist lokal in den Relay-Logs auf dem Slave gespeichert und kann beim nächsten Start des Servers direkt ausgeführt werden. Auf diese Weise kann der Master-Server seine Binärlogs schneller bereinigen, da er nicht mehr warten muss, bis der Slave die Inhalte abgerufen hat.
Die SHOW PROCESSLIST
-Anweisung vermittelt
Informationen dazu, welche replikationsbezogenen Vorgänge auf
Master und Slave ablaufen. Das folgende Beispiel veranschaulicht,
wie die drei Threads in der Ausgabe von SHOW
PROCESSLIST
erscheinen.
Auf dem Master-Server sieht die Ausgabe von SHOW
PROCESSLIST
wie folgt aus:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 2
User: root
Host: localhost:32931
db: NULL
Command: Binlog Dump
Time: 94
State: Has sent all binlog to slave; waiting for binlog to
be updated
Info: NULL
Hierbei ist Thread 2 ein Binlog
Dump
-Replikations-Thread für einen angeschlossenen
Slave. State
gibt an, dass alle anhängigen
Aktualisierungen an den Slave gesendet wurden und der Master
darauf wartet, dass neue Änderungen stattfinden. Wenn keine
Binlog Dump
-Threads auf einem Master vorhanden
sind, bedeutet dies, dass die Replikation nicht ausgeführt wird,
d. h., es sind derzeit keine Slaves angebunden.
Auf dem Slave-Server sieht die Ausgabe von SHOW
PROCESSLIST
wie folgt aus:
*************************** 1. row *************************** Id: 10 User: system user Host: db: NULL Command: Connect Time: 11 State: Waiting for master to send event Info: NULL *************************** 2. row *************************** Id: 11 User: system user Host: db: NULL Command: Connect Time: 11 State: Has read all relay log; waiting for the slave I/O thread to update it Info: NULL
Hieraus ist ersichtlich, dass Thread 10 der I/O-Thread ist, der
mit dem Master-Server kommuniziert. Thread 11 ist der SQL-Thread,
der die Updates verarbeitet, die in den Relay-Logs gespeichert
sind. Zum Zeitpunkt der Ausführung von SHOW
PROCESSLIST
waren beide Threads beschäftigungslos und
warteten auf weitere Aktualisierungen.
Der Wert in der Spalte Time
zeigt ggf., wie
groß der Rückstand zwischen Slave und Master ist. Siehe auch
Abschnitt 6.11, „Replikation: häufig gestellte Fragen“.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.