Drupal Master / Slave Replikation

10

Ich habe zwei MySQL-Server mit Master / Slave-Replikation für die Drupal-Datenbank eingerichtet und bestätigt, dass die Datenbanken synchronisiert und repliziert sind.

Ich versuche jetzt, Drupal hauptsächlich für Failover- / Redundanzzwecke auf beide Datenbanken zu verweisen. Wenn ich unseren primären Datenbankserver neu starten muss, möchte ich nicht, dass unsere Site ausfällt. (In Fehlerszenarien ist es akzeptabel, schreibgeschützt zu sein.)

Basierend auf dem folgenden Artikel . Ich habe settings.phpwie folgt geändert :

$databases['default']['default'] = array(
  'driver' => 'mysql',
  'database' => 'sdrupal',
  'username' => 'drupal',
  'password' => 'topsecret',
  'host' => 'masterdb.ptp.local',
);
$databases['default']['slave'][] = array(
  'driver' => 'mysql',
  'database' => 'sdrupal',
  'username' => 'drupal',
  'password' => 'topsecret',
  'host' => 'slavedb.ptp.local',
);

Die Konfiguration ist in Ordnung, bis ich den Master herunterfahre (Service mysqld stop) - wenn ich das tue, kotzt meine Site:

PDOException: SQLSTATE [HY000] [2013] Verbindung zum MySQL-Server beim Lesen des ersten Kommunikationspakets unterbrochen, Systemfehler: 111 in drupal_is_denied () (Zeile 1895 von /www/includes/bootstrap.inc). Zusätzlich

PDOException: SQLSTATE [HY000] [2013] Verbindung zum MySQL-Server beim Lesen des ersten Kommunikationspakets unterbrochen, Systemfehler: 111 in dblog_watchdog () (Zeile 141 von /www/modules/dblog/dblog.module).

Was ist der Trick, um diese Arbeit zu machen?

Brad
quelle

Antworten:

6

In Bezug auf Master / Master (Hochverfügbarkeit) ist ein Lastausgleich möglich, wenn kein Master ausgefallen ist.

Im Folgenden werden alle Schreibvorgänge an master1 und alle Lesevorgänge an master2 gesendet. Wenn master1 fehlschlägt, werden alle Abfragen an master2 gesendet. Wenn master2 fehlschlägt, werden alle Abfragen an master1 gesendet.

'master' => array('master1', 'master2')
'slave' => array('master2', 'master1')

Im Folgenden werden alle Abfragen an master1 gesendet. Wenn master1 fehlschlägt, gehen alle Abfragen an master2:

'master' => array('master1', 'master2')
'slave' => array('master1', 'master2')
Thomas
quelle
Vielen Dank für diese Antwort. Ich verstehe, dass dies ziemlich alt ist und möglicherweise veraltet ist. Haben Sie Tipps zur Implementierung derselben in der neuesten Version von Drupal?
Gaurav Ojha
4

Zum Nutzen anderer - so gut ich es herausfinden konnte - scheint Drupal 7 keine Datenbank-Hochverfügbarkeitsfunktion eingebaut zu haben.

Sie können zwei MySQL-Server in einer Master / Slave-Konfiguration einrichten. Am besten senden Sie jedoch alle Schreibvorgänge an den Master und alle Lesevorgänge an den Slave. Dies ermöglicht eine Rohlastverteilung, jedoch kein Failover.

Das heißt, wenn der Master-MySQL-Server ausfällt, sind alle Wetten deaktiviert - die Site fällt mit einer hässlichen Fehlermeldung aus, die sich darüber beschwert, dass PHP die Master-Datenbank nicht erreichen kann.

Soweit ich weiß, besteht die Möglichkeit, dies mit anderer Software zu beheben, darin, entweder MySQL-ndb-Cluster oder MySQL-Proxy zu verwenden - aber nach einigem Lesen funktionieren diese Technologien anscheinend nicht gut mit Drupal.

Ich bin jedoch auf ein Drupal-Modul namens Auto-Slave gestoßen ( http://drupal.org/project/autoslave ). Es ist nicht weit verbreitet (es gibt 12 Websites, die es laut Statistik aktiv nutzen), aber es scheint in der Lage zu sein, das zu tun, was wir wollen. Es kann auf verschiedene Arten konfiguriert werden:

Master / Slave

Writes go to Master
Reads go to Slave

Drawbacks:
If master is down, the durpal site displays a prominent message that the site is in "read only" mode.

Master / Master (Hochverfügbarkeit)

Read and Writes go to master1 (primary) unless its unavailable.
If master1 is unavailable, reads and writes go to master2 (secondary)

Drawbacks:
There is no load distribution. All load (reads and writes) go to either master1 or to master2

Master / Master / Slave (Hochverfügbarkeit / Hochleistung)

Writes go to Master1 (primary) unless its down then they go to Master2
Reads go to the slave unless its down
Drawbacks:
Requires a minimum of three database servers (master/master/slave)

Bisher haben wir den ersten (Master / Slave) erfolgreich eingerichtet. Ich werde als nächstes versuchen, Master / Master / Slave einzurichten.

Hoffentlich hilft das jemand anderem.

Brad
quelle
Das hat sehr geholfen. :)
Esafwan