Frage

Ich habe eine Datenbank bekommt, die ich als Backup zu replizieren beabsichtige (Performance ist kein Problem im Moment).

Wir haben die Replikation korrekt eingerichtet und getestet und alles war in Ordnung.

Dann stellten wir fest, dass sie alle Schreibvorgänge in den temporären Tabellen repliziert, die in der Tat dazu geführt, dass die Replikation von einem Tag im Wert von Daten fast zwei Stunden für den Standby-Slave hat.

Der Grund dafür ist, dass wir es alle 15 Minuten synchronisiert, um sicherzustellen, einige der Daten in unserem db über Cronjob neu berechnen (es dauert ca. 3 Minuten insgesamt, so ist es nicht akzeptabel, diese Operationen während einer Web-Anfrage zu tun; stattdessen speichern wir nur die Änderungen ohne zu versuchen, etwas, während in der Web-Anfrage neu zu berechnen, und dann die ganze Arbeit in der Masse tun). Um effizient, dass die Daten zu verarbeiten, verwenden wir temporäre Tabellen (wie viele Abhängigkeiten gibt es).

Nun, das erste Problem ist, dass temporäre Tabellen nicht bestehen, wenn wir den Slave neu starten, während es in der Mitte der Verarbeitung von Transaktionen ist, dass diese temporäre Tabelle verwenden. Das kann durch den Verzicht auf temporäre Tabellen vermieden werden, obwohl dies seine eigenen Probleme hat.

Das ernstere Problem ist, dass der Slave leicht in weniger als einer halben Stunde aufholen könnte, wenn es nicht für alle diese erneute Berechnung war (was es tut einer nach dem anderen, so dass es keinen Vorteil, die Daten für den Wiederaufbau alle 15 Minuten ... und Sie können es buchstäblich sehen, stecken an, sagen 1115, nur schnell zu fangen, habe bei 1130 etc stecken).

Eine Lösung, die wir mit aufkommen ist aus der replizierten db alle, dass ein erneuten Berechnung zu bewegen, so dass der Slave nicht repliziert wird. Aber es hat den Nachteil, dass wir die Tabellen beschneiden haben würden es schließlich Updates, unsere Sklaven in-Effekt „kastriert“ machen, das heißt. müssten wir alles auf sie neu zu berechnen, bevor wir es tatsächlich nutzen könnten.

Hat jemand ein ähnliches Problem und / oder wie würden Sie es lösen? Bin ich etwas fehlt offensichtlich?

War es hilfreich?

Lösung

Ich habe mit der Lösung kommen. Es nutzt replicate-do-db von Nick erwähnt. Schreibt sie hier falls jemand nach unten hatte ein ähnliches Problem.

Das Problem mit nur mit replicate- (Wild-) tut * Optionen in diesem Fall (wie gesagt, verwenden wir temporäre Tabellen eine zentrale Tabelle neu zu besiedeln) ist, dass Sie entweder temporäre Tabellen und besiedeln der mittleren ohne Daten ignorieren (was weitere Probleme, da alle Anfragen verursacht auf dem zentralen Tisch unter Berufung ist up-to-date zu unterschiedlichen Ergebnissen führen wird), oder Sie ignorieren die zentrale Tabelle, die ein ähnliches Problem hat. Ganz zu schweigen davon, müssen Sie mysql nach dem Hinzufügen einer dieser Optionen neu starten, um my.cnf. Wir wollten etwas, das all jene Fälle (und Zukunft ist) ohne die Notwendigkeit eines weiteren Neustart abdecken würde.

Also, was haben wir uns entschlossen zu tun, ist die Datenbank in der „realen“ aufzuspalten und eine „Arbeitsbereich“ Datenbanken. Nur die „echte“ Datenbank repliziert wird (ich denke, Sie auf einem Kongress des Tabellennamen entscheiden konnten, für die Replikation-wild-do-table-Syntax verwendet werden).

Alle die temporäre Tabelle Arbeit geschieht in „Arbeitsbereich“ db, und die Abhängigkeit oben erwähnte Problem zu vermeiden, werden wir nicht die zentrale Tabelle auffüllen, indem Sie INSERT (die in „real“ db sitzt) ... SELECT oder RENAME TABLE, sondern die tmp Tabellen abfragen, um eine Art von einem diff auf der Live-Tabelle zu generieren (dh. INSERT-Anweisungen für neue Zeilen erzeugen, DELETE für die alten und zu aktualisieren, wo erforderlich).

Auf diese Weise die nur Abfragen, die genau das Updates repliziert werden, die erforderlich sind, nichts anderes, das heißt. einige (die meisten?) der Abfragen Neuberechnung alle fünfzehn Minuten hapenning vielleicht nicht einmal seinen Weg machen schuften, und diejenigen, die überhaupt minimal und nicht rechenintensiv sein, nur das tun, wird einfach Einfügungen und Löschungen.

Andere Tipps

In MySQL ab 5.0 glaube ich, können Sie Tabelle Platzhalter tun spezifische Tabellen zu replizieren. Es gibt eine Reihe von Befehlszeilenoptionen, die eingestellt werden können, aber Sie können auch tun dies über Ihre MySQL-Konfigurationsdatei.

[mysqld]
replicate-do-db    = db1
replicate-do-table = db2.mytbl2
replicate-wild-do-table= database_name.%
replicate-wild-do-table= another_db.%

Die Idee ist, dass Sie es sagen, keine Tabellen andere als die replizieren Sie angeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top