4 Stimmen

Mysql-Replikation bei gemeinsamem Hosting

Ich muss eine Mysql-Replikation durchführen. Einige Informationen:

  • Ich habe zwei Datenbankinstanzen im Shared Hosting, daher kann ich Mysql Replication nicht verwenden (ich habe keinen Zugriff auf die Konfigurationsdateien).
  • Da es sich um ein gemeinnütziges Projekt handelt (Bildung), können wir uns keine eigenen Server leisten.
  • Wenn der Hauptserver für ein paar Minuten ausfällt, ist das im Allgemeinen nicht so schlimm, aber es gibt bestimmte Tage, an denen wir WIRKLICH eine Backup-Lösung brauchen, die mit dem Hauptserver synchronisiert ist (zeitlich begrenzte Ereignisse der Website).

Im Moment verwendet das System eine Revisionsnummer für jede Zeile jeder Tabelle, und wir überprüfen regelmäßig, ob sich diese Nummer geändert hat (und aktualisieren die entsprechenden Zeilen). Das ist ziemlich langsam.

Ich stelle mir vor, dass jede SELECT/INSERT/UPDATE-Abfrage in einer bestimmten Tabelle protokolliert wird und der "Slave-Server" den "Master-Server" in regelmäßigen Abständen nach dem Inhalt dieser Tabelle fragt und die entsprechenden Abfragen durchführt.

Was ist Ihre Meinung zu dieser Idee?

Ich weiß, es ist nicht perfekt, ein Server könnte ausfallen, bevor alle Abfragen propagiert werden, aber ich möchte die möglichen Probleme zu minimieren, mit so wenigen Zeilen Code wie möglich.

Wie ließe sich das am besten umsetzen?

  • Im php-Code kann ich bei jedem SELECT/INSERT/UPDATE eine weitere Einfügung in eine bestimmte Tabelle vornehmen (ich füge einfach die Abfrage ein)
  • Mit einem Auslöser?

3voto

w5m Punkte 2228

Ich habe erfolgreich eine Kombination aus Triggern und einer föderierten Tabelle verwendet, um die Replikation von Daten aus einer MyISAM-Tabelle auf einem Server in eine MyISAM-Tabelle auf einem anderen Server in einer gemeinsam genutzten Hosting-Umgebung zu simulieren.

Alle Einfügungen/Änderungen/Löschungen in meiner Master-Tabelle werden über AFTER INSERT / AFTER UPDATE / AFTER DELETE-Trigger in meine Verbundtabelle auf demselben Server repliziert. Diese Verbundtabelle überträgt dann die Änderungen in eine Tabelle auf einem anderen Server.

Es ist nicht mein Verdienst, diesen Ansatz entwickelt zu haben, denn er wurde sehr hilfreich dokumentiert von RolandoMySQLDBA bei Serverfehlern:
Kann eine MySQL-Stored-Procedure auf einem entfernten Backup-MySQL-Server einfügen/aktualisieren? .

Hier sind die Schritte, die ich durchgeführt habe:

Auf SERVER2...

  • Ich habe eine Tabelle erstellt (nennen wir sie sklav_tabelle ) mit Spalten die mit denen in der Master-Tabelle übereinstimmen (nennen wir sie master_table ) auf SERVER1.

Auf SERVER1...

  • Ich habe eine Tabelle erstellt (nennen wir sie föderierte_tabelle ) mit Spalten, die mit denen in master_table mit der Angabe einer FEDERATED Speicher-Engine und eine CONNECTION String als Referenz sklav_tabelle auf SERVER2... CONNECTION='mysql://username:password@SERVER2:port/database/slave_table';

  • Ich fügte hinzu AFTER INSERT , AFTER UPDATE y AFTER DELETE Auslöser für master_table die SQL-Befehle enthielt, um...
    INSERT INTO federated_table VALUES (NEW.id,NEW.title); ,
    UPDATE federated_table SET id=NEW.id,title=NEW.title WHERE id=OLD.id; y
    DELETE FROM federated_table WHERE id=OLD.id; beziehungsweise.

Ich hoffe, das hilft jemandem, der sich in einer ähnlichen Situation befindet.

1voto

sreimer Punkte 4794

Zwei Ideen:

  1. Ein Cron, der die max(ID)s in den Tabellen der Sicherungsdatenbank findet und dann alle darüber hinausgehenden Datensätze in der Hauptdatenbank abruft.

  2. Um den Vorschlag aus meinem Kommentar aufzunehmen, duplizieren Sie Ihre Schreibvorgänge direkt in die zweite Datenbank, anstatt die Abfragen in eine Tabelle zu schreiben. Dies kann ein wenig Overhead verursachen, ist aber vielleicht am einfachsten zu implementieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X