Heim  >  Artikel  >  Datenbank  >  Nutzen Sie die integrierten Replikationsfunktionen von MySQL, um die Verfügbarkeit zu optimieren

Nutzen Sie die integrierten Replikationsfunktionen von MySQL, um die Verfügbarkeit zu optimieren

黄舟
黄舟Original
2016-12-14 09:33:58995Durchsuche

Die interne Replikationsfunktion von MySQL wird zwischen zwei oder mehr Servern eingerichtet und durch Festlegen der Master-Slave-Beziehung zwischen ihnen erreicht. Einer von ihnen fungiert als Master-Server und der andere als Slave-Server. Ich werde im Detail besprechen, wie man zwei Server konfiguriert und einen zum Master und den anderen zum Slave macht. Und beschreiben Sie den Vorgang des Wechsels zwischen ihnen. Ich habe den Konfigurationseinstellungsprozess für MySQL Version 3.23.23 durchgeführt und auch den Test für diese Version durchgeführt. MySQL-Entwickler empfehlen, dass es am besten ist, die neueste Version zu verwenden und dass sowohl Master- als auch Slave-Server dieselbe Version verwenden. Gleichzeitig handelt es sich bei MySQL Version 3.23 noch um eine Betaversion, und diese Version ist möglicherweise nicht abwärtskompatibel. Aus diesem Grund verwende ich diese Version auf tatsächlichen Websites noch nicht. Ein Vorteil der Fehlertoleranz besteht darin, dass der Server aktualisiert werden kann, ohne dass Abfragen unterbrochen werden.

Schritt 1: Hauptserver konfigurieren
Für den Rest dieses Artikels werde ich zwei Server angeben. A (IP ist 10.1.1.1) dient als Hauptserver (als Host bezeichnet). B (IP ist 10.1.1.2) dient als Backup-Server (wird als Backup-Server bezeichnet).

Der Implementierungsprozess der Replikationsfunktion von MySQL ist wie folgt: Der Standby-Computer (B) stellt eine Verbindung zum Host-Computer (A) her, liest dann das binäre Aktualisierungsprotokoll des Host-Computers und führt die Änderungen dann in seinem zusammen eigene Datenbank. Der Standby-Computer benötigt ein Benutzerkonto, um eine Verbindung zum Host herzustellen. Erstellen Sie daher ein Konto auf dem Host und erteilen Sie ihm nur FILE-Berechtigungen wie folgt:

GRANT FILE ON *.* TO reple@10.1.1.2 IDENTIFIED BY Passwort ;

Damit sich der Standby-Computer mit dem Hauptcomputer verbinden kann, muss FLUSH PRIVILEGES auf dem Hauptcomputer ausgeführt werden, aber keine Sorge, wir werden den Server im Folgenden stoppen Schritte.

Jetzt benötigen wir einen Snapshot der Host-Datenbank und konfigurieren den Host so, dass Binäraktualisierungsprotokolle generiert werden können. Bearbeiten Sie zunächst die Datei my.cnf, um die Protokollierung von Binäraktualisierungen zu ermöglichen. Fügen Sie also irgendwo unterhalb des Abschnitts [mysqld] eine Zeile hinzu: log-bin. Beim nächsten Serverstart generiert der Host ein binäres Aktualisierungsprotokoll (mit dem Namen -bin.). Um das Binäraktualisierungsprotokoll gültig zu machen, fahren Sie das MySQL-Dienstprogramm herunter, verschieben Sie dann alle Datenbankverzeichnisse auf dem Host in ein anderes Verzeichnis und starten Sie dann mysqld neu.
Bitte stellen Sie sicher, dass Sie alle Datenbanken erhalten haben. Andernfalls wird beim Kopieren eine Tabelle aufgrund eines Fehlers beendet, wenn sie auf dem Hauptcomputer, aber nicht auf dem Standby-Computer vorhanden ist. Jetzt haben Sie einen Snapshot Ihrer Daten und ein binäres Protokoll aller Änderungen an der Datenbank seit der Erstellung des Snapshots. Bitte beachten Sie, dass MySQL-Datendateien (*.MYD, *.MYI und *.frm) vom Dateisystem abhängig sind, sodass Sie nicht einfach eine Dateiübertragung durchführen können, beispielsweise von Solaris nach Linux. Wenn Sie sich in einer heterogenen Serverumgebung befinden, müssen Sie das Dienstprogramm mysqldump oder andere benutzerdefinierte Skripts verwenden, um einen Snapshot der Daten zu erhalten.

Schritt 2: Konfigurieren Sie die Backup-Maschine
Lassen Sie uns fortfahren. Stoppen Sie das MySQL-Dienstprogramm auf dem Standby-Computer und verschieben Sie das vom Host-Computer kopierte Datenbankverzeichnis in das Datenverzeichnis auf dem Standby-Computer. Bitte stellen Sie sicher, dass Sie den Besitzer und die Gruppe des Verzeichnisses auf die entsprechenden Werte des MySQL-Benutzers ändern und den Dateimodus auf 660 (nur für den Besitzer und die Gruppe lesbar und beschreibbar) und das Verzeichnis selbst auf 770 ändern (nur für den Besitzer und die Gruppe) lesbar, beschreibbar und ausführbar).

Weiter. Starten Sie das MySQL-Dienstprogramm auf dem Backup-Computer und vergewissern Sie sich, dass MySQL ordnungsgemäß funktioniert. Führen Sie einige ausgewählte Abfragen aus (keine Aktualisierungen oder Einfügen von Abfragen), um zu sehen, ob der im ersten Schritt erhaltene Daten-Snapshot erfolgreich ist. Fahren Sie dann das MySQL-Dienstprogramm herunter, nachdem der Test erfolgreich war.

Konfigurieren Sie den Host, auf den auf dem Standby-Computer zugegriffen werden muss, um Änderungen vom Host zu empfangen. Daher müssen Sie die Datei my.cnf auf dem Server bearbeiten und die folgenden Zeilen im Abschnitt [mysqld] hinzufügen:

master-host=10.1.1.1
master-user=replicate
master-password=passwort

Nach dem Starten des Standby-Dienstprogramms überprüft das Standby-Dienstprogramm den in der Datei my.cnf angegebenen Host auf Änderungen und führt diese Änderungen in seiner eigenen Datenbank zusammen. Der Standby-Computer verwaltet die Aktualisierungsdatensätze des Hosts, die aus der Datei „master.info“ des Hosts empfangen werden. Der Status des Standby-Threads kann über den SQL-Befehl SHOW SLAVE-STATUS angezeigt werden. Wenn bei der Verarbeitung des Binärprotokolls auf dem Standby-Computer ein Fehler
auftritt, führt dies dazu, dass der Thread des Standby-Computers beendet wird und eine Meldung in der *.err-Protokolldatei generiert wird. Anschließend kann der Fehler behoben und der Standby-Thread mit der SQL-Anweisung SLAVE START neu gestartet werden. Der Thread setzt die Verarbeitung dort fort, wo die Verarbeitung des Host-Binärprotokolls aufgehört hat.

Zu diesem Zeitpunkt sollten die auf dem Hauptcomputer aufgetretenen Datenänderungen auf den Standby-Computer kopiert worden sein. Zum Testen können Sie einen Datensatz auf dem Hauptcomputer einfügen oder aktualisieren und diesen Datensatz auf dem Standby-Computer auswählen Maschine.

Jetzt haben wir diese Master-Slave-Beziehung von Maschine A zu Maschine B, die es uns ermöglicht, alle Anfragen an Maschine B umzuleiten, wenn Maschine A möglicherweise abstürzt, aber wenn Maschine A wiederhergestellt wird, haben wir keine Möglichkeit, die Änderungen an Maschine A wiederherzustellen. Um dieses Problem zu lösen, erstellen wir eine Master-Slave-Beziehung von Maschine B zu Maschine A.

Schritt 3: Erstellen Sie eine gegenseitige Master-Slave-Beziehung
Fügen Sie zunächst in der Datei my.cnf auf Maschine B log-bin zum Abschnitt [mysqld] hinzu, starten Sie dann mysqld neu und erstellen Sie dann ein Benutzerkonto, das die Replikationsfunktion darauf ausführen kann, verwenden Sie:

GRANT FILE ON *.* TO Replicate@10.1.1.1 IDENTIFIED BY Password;

Führen Sie den Befehl FLUSH PRIVILEGES auf Maschine B aus, um die neue Autorisierungstabelle nach dem Hinzufügen des Replikationsbenutzers zu laden, und kehren Sie dann zu Maschine A zurück. Hinzufügen Fügen Sie die folgenden Zeilen zu my.cnf hinzu:

master-host=10.1.1.2
master-user=replicate
master-password=password

Starten Sie Maschine A nach dem Dienst neu Programm, jetzt haben wir eine gegenseitige Master-Slave-Beziehung zwischen Maschine A und Maschine B. Unabhängig davon, auf welchem ​​Server ein Datensatz aktualisiert oder eingefügt wird, wird er auf den anderen Server kopiert. Hinweis: Ich bin mir nicht sicher, wie schnell ein Standby-Computer binäre Protokolländerungen zusammenführen kann, daher ist die Verwendung dieser Methode zum Lastausgleich von Einfüge- oder Aktualisierungsanweisungen möglicherweise keine gute Idee.

Schritt 4: Ändern Sie Ihr Datenbankverbindungsprogramm
Nachdem Sie nun eine gegenseitige Beziehung zwischen Maschine A und Maschine B hergestellt haben, müssen Sie das Datenbankverbindungsprogramm ändern, damit Sie von dieser Methode profitieren können. Die folgende Funktion versucht zunächst, eine Verbindung zu Maschine A herzustellen. Wenn die Verbindung nicht hergestellt werden kann, wird eine Verbindung zu Maschine B hergestellt.


/**************************************************** ****
Funktion db_connect()

gibt bei Erfolg eine Link-ID zurück, bei Fehler false
********************* *************************************/
function db_connect(){
$username = "replUser";
$password = "password";
$primary = "10.1.1.1";
$backup = "10.1.1.2";

# Versuch, eine Verbindung zum Primärserver herzustellen
if(!$link_id = @mysql_connect($primary, $username, $password ))
# Verbindungsversuch zum Secondary
$link_id = @mysql_connect($secondary, $username, $password)
return $link_id;
}

?>

Ich habe den Prozess zum Herstellen einer Datenbankverbindung mit der oben genannten Technologie in zwei Situationen getestet: Zum einen ist das Haupt-MySQL-Dienstprogramm heruntergefahren, aber der Server läuft noch, und zum anderen ist der Hauptserver heruntergefahren. Wenn nur mysqld heruntergefahren wird, wird die Verbindung sofort auf die Backup-Maschine übertragen. Wenn jedoch der gesamte Server heruntergefahren wird, gibt es eine unendliche Wartezeit (ich habe die Verfolgung nach zwei Minuten aufgegeben – eine sehr kurze Aufmerksamkeitsspanne), weil PHP sucht nach einem Server, der nicht existiert. Im Gegensatz zur Funktion fsockopen verfügt die Funktion mysql_connect leider nicht über einen Timeout-Parameter, wir können jedoch fsockopen verwenden, um ein Timeout zu simulieren.

Schritt 5: Ein verbessertes Datenbankverbindungsprogramm

/**************************************************** ****
Funktion db_connect_plus()

gibt bei Erfolg eine Link-ID zurück, bei Fehler false
********************* *************************************/
function db_connect_plus(){
$username = "username";
$ passwort = "passwort";
$primary = "10.1.1.1";
$backup = "10.1.1.2";
$timeout = 15; // Zeitüberschreitung in Sekunden

if ($fp = fsockopen($primary, 3306, &$errno, &$errstr, $timeout)){
fclose($fp);
return $link = mysql_connect($primary, $username, $password );
}
if($fp = fsockopen($secondary, 3306, &$errno, &$errstr, $timeout)){
fclose($fp);
return $ link = mysql_connect($secondary, $username, $password);
}

return 0;
}

?>

Diese neue verbesserte Funktion bietet uns mit einer einstellbaren Timeout-Funktion, die der mysql_connect-Funktion fehlt. Wenn die Verbindung sofort fehlschlägt, was der Fall ist, wenn die Maschine „lebendig“, mysqld jedoch „down“ ist, wird die Funktion sofort auf den zweiten Server verschoben. Die obige Funktion ist recht robust. Testen Sie sie, bevor Sie versuchen, eine Verbindung herzustellen, um zu sehen, ob das Dienstprogramm den angegebenen Port überwacht. Lassen Sie Ihr Skript nach einer akzeptablen Zeitspanne ablaufen, damit Sie Fehlerbedingungen angemessen behandeln können. Wenn Sie den Standardport 3306 ändern, stellen Sie bitte sicher, dass Sie auch die Portnummer ändern.

Schlussfolgerungen und Kommentare
Stellen Sie zunächst sicher, dass Sie einen vollständigen Datenschnappschuss erhalten. Wenn Sie vergessen, eine Tabelle oder Datenbank zu kopieren, wird das Standby-Programm angehalten. Der Zeitpunkt, zu dem der Snapshot erstellt wird, ist entscheidend. Sie sollten sicherstellen, dass die binäre Protokollierungsfunktion deaktiviert ist, bevor Sie die Datendateien kopieren. Wenn die Binärprotokollfunktion vor der Erstellung des Snapshots aktiviert ist, wird der Thread auf dem Standby-Computer möglicherweise angehalten, da der Thread beim Versuch, wichtige Datensätze zu importieren, möglicherweise aufgrund doppelter Primärschlüssel anhält. Am besten befolgen Sie die in Teil 2 besprochene Lösung: Schließen, Kopieren, Neustart der Binärprotokollfunktion zulassen.

Möglicherweise möchten Sie den Replikationsprozess auf die ursprüngliche Weise konfigurieren und zum richtigen Zeitpunkt auf den Standby-Computer achten, um sicherzustellen, dass der Standby-Computer mit dem Master-Computer synchronisiert ist.

Ich habe die Lastausgleichsleistung eines Systems, das die Replikationsfunktion verwendet, nicht getestet, aber ich wäre bei der Verwendung eines solchen Systems zum Ausgleich von Einfügungen und Aktualisierungen flexibel. Wenn beispielsweise zwei Datensätze auf zwei Servern denselben auto_increment-Wert ergeben, bei welchem ​​Datensatz stoppt der Standby-Thread? Ein Problem wie dieses würde dazu führen, dass der Lastausgleich schreibgeschützt gehandhabt wird, wobei ein Server alle Einfügungen und Aktualisierungen übernimmt, während eine Reihe von Standbys (ja, Sie können mehrere vom Master getrennte Standbys haben) alle Auswahlen verarbeiten.

Ich freue mich sehr, dass MySQL bereits über einige Funktionen des Replikationssystems verfügt und die Konfiguration sehr einfach ist. Auf diese Weise können Sie damit beginnen, zusätzliche Sicherheit gegen außer Kontrolle geratene Ereignisse zu bieten. Ich habe die Replikationsfunktion, die ich getestet und verwendet habe, nur gestreift, sie wird jedoch in Teil 11 der MySQL-Onlinedokumentation ausführlicher erklärt. .

Das Obige ist der Inhalt der Verwendung der integrierten Replikationsfunktion von MySQL zur Optimierung der Verfügbarkeit. Wenn Sie mehr Inhalte erhalten möchten, achten Sie bitte auf die chinesische PHP-Website (www.php.cn)!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn