Sollte ein MySQL-Replikations-Slave so eingestellt sein, dass er nur gelesen werden kann?


22

Ich habe die Replikation auf Percona Server 5.5 , indem Sie laufen bekam diese Anleitung und fragte mich , ob ich noch hinzufügen sollte read-only=1meiner Sklaven , my.cnfum es nur zu lesen zu machen?

In diesem Handbuch wird die Replikation für die MySQL-Tabelle eingerichtet, damit Benutzer repliziert werden. Ich verwende jedoch hauptsächlich den Slave, um MySQL-Speicherauszüge zu erstellen. Im Notfall wird er so konfiguriert, dass er Master ist es ständig?


+1 für die oft übersehene Erinnerung, dass Slaves schreibgeschützt sind.
RolandoMySQLDBA

Antworten:


31

Wenn ein Slave schreibgeschützt ist , ist er nicht zu 100% von der Welt abgeschirmt.

Laut MySQL-Dokumentation auf read-only

Diese Variable ist standardmäßig deaktiviert. Wenn es aktiviert ist, lässt der Server keine Aktualisierungen zu, außer von Benutzern, die über das SUPER-Privileg verfügen, oder (auf einem Slave-Server) von Aktualisierungen, die von Slave-Threads durchgeführt wurden. In Replikations-Setups kann es nützlich sein, read_only auf Slave-Servern zu aktivieren, um sicherzustellen, dass Slaves Aktualisierungen nur vom Master-Server und nicht von Clients akzeptieren.

Somit kann jeder mit SUPER-Privileg nach Belieben zu einem solchen Slave lesen und schreiben ...

Stellen Sie sicher, dass alle nicht privilegierten Benutzer nicht über das SUPER-Privileg verfügen.

Wenn Sie alle SUPER-Berechtigungen auf einmal widerrufen möchten, führen Sie dies auf Master und Slave aus:

UPDATE mysql.user SET super_priv='N' WHERE user<>'root';
FLUSH PRIVILEGES;

In Bezug auf den Slave behält sich SUPER das Recht vor, nur rootSchreibvorgänge auszuführen, für die ansonsten Einschränkungen bestehen würden, und verhindert, dass Nicht-Privilegierte Schreibvorgänge ausführen.

UPDATE 2015-08-28 17:39 EDT

Ich habe kürzlich erfahren, dass MySQL 5.7 super_read_only einführt .

Dadurch werden SUPER- Benutzer in ihren Tracks gestoppt, da in den 5.7-Dokumenten angegeben ist

Wenn die Systemvariable read_only aktiviert ist, lässt der Server Clientaktualisierungen nur von Benutzern zu, die über die Berechtigung SUPER verfügen. Wenn die Systemvariable super_read_only ebenfalls aktiviert ist, verhindert der Server Clientaktualisierungen auch von Benutzern mit SUPER. In der Beschreibung der Systemvariablen read_only finden Sie eine Beschreibung des schreibgeschützten Modus sowie Informationen zur Interaktion von read_only und super_read_only.

Änderungen an super_read_only auf einem Master-Server werden nicht auf Slave-Server repliziert. Der Wert kann auf einem Slave-Server unabhängig von der Einstellung am Master eingestellt werden.

super_read_only wurde in MySQL 5.7.8 hinzugefügt.


1
Ist es also empfehlenswert, Slaves schreibgeschützt zu machen?
XRef

6
Ja, dies ist die beste Vorgehensweise
RolandoMySQLDBA

1
Wie kann ich die Berichtsdatenbank auf dem Slave mit Daten verwenden, die aus der Betriebsdatenbank mit schreibgeschützter Option aggregiert wurden?
Geany

3

Sollte ein MySQL-Replikations-Slave so eingestellt sein, dass er nur gelesen werden kann?

Ja, Sie sollten Slave-Server mit verfügbaren R / O- Modi ausführen . Zuvor privilegierte Benutzer konnten die Daten eines solchen Slaves sowieso ändern, aber später bekamen sie auch ihren R / O-Beschränkungsknopf.

Warum es wichtig ist - Fehlschlagen beim Schreiben ist besser als Bedauern bei falschen Schreibvorgängen, die dazu führen könnten, dass der Slave aufgrund einfacher Datenprobleme oder aufgrund von Schlüsselkonflikten, die die Replikation unterbrechen würden, unbrauchbar wird (kein tatsächlicher Slave mehr).

Es gibt auch Software für die Orchestrierung / Lastverteilung, die den R / O-Status der Server in Pools berücksichtigt, die für die ordnungsgemäße Weiterleitung von Anforderungen zwischen diesen Servern konfiguriert wurden.

Das ist Sicherheit. Benutze es.


1

Das Problem hier, einschließlich MySQL 8.0, ist, dass MySQL Sie nicht zwingt, Einstellungen read_only = ONvorzunehmen , wenn Sie den start slaveBefehl ausführen . Warum ist ein Problem? Da fast alle MySQL-Datenbankadministratoren ihre Slaves in RO verwenden, um eine Beschädigung der Daten zu verhindern, gibt es immer einen Datenbankadministrator, der versehentlich eine SQL-Anweisung falsch ausführt, mit der Daten auf einem Slave geändert werden, oder eine App, die seine Konfiguration nicht ändert. Wenn ich auf Slaves schreiben möchte, weil es mehrere Schemata hat und ich Schreibvorgänge für dieses Schema read_onlyausführen muss, muss der Befehl intelligenter sein, und wir müssen einen Befehl ausführen read_only for schema. Dies kann bei Multi-Master-Servern und Slaves, die a Replicate_Ignore_DB. Im Moment müssen Sie die Steuerung also manuell vornehmen und sehr vorsichtig sein.

Genießen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.