Drupal Master / Slave Replication

10

Skonfigurowałem dwa serwery MySQL z replikacją Master / Slave dla bazy danych drupal i potwierdziłem, że bazy danych są zsynchronizowane i replikują się.

Usiłuję teraz wskazać drupal na obie bazy danych w zasadzie w celu przełączenia awaryjnego / redundancji. To znaczy, jeśli muszę zrestartować nasz główny serwer bazy danych, nie chcę, aby nasza strona uległa awarii. (Przejście tylko do odczytu jest dopuszczalne podczas scenariuszy awarii)

Na podstawie następującego artykułu . Zmodyfikowałem settings.phpw następujący sposób:

$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',
);

Konfiguracja jest w porządku, dopóki nie zamknę master (usługa mysqld stop) - kiedy to zrobię, moja strona pukuje:

PDOException: SQLSTATE [HY000] [2013] Utracono połączenie z serwerem MySQL podczas „odczytu początkowego pakietu komunikacyjnego”, błąd systemowy: 111 w drupal_is_denied () (wiersz 1895 /www/include/bootstrap.inc). Dodatkowy

PDOException: SQLSTATE [HY000] [2013] Utracono połączenie z serwerem MySQL podczas „odczytu początkowego pakietu komunikacyjnego”, błąd systemowy: 111 w dblog_watchdog () (wiersz 141 /www/modules/dblog/dblog.module).

Jaka jest sztuczka, aby to zadziałało?

Ćwiek
źródło

Odpowiedzi:

6

Odnośnie Master / Master (wysoka dostępność) możliwe jest równoważenie obciążenia, gdy żaden master nie jest wyłączony.

Poniższe spowoduje, że wszystkie zapisy przejdą do master1, a wszystkie odczyty przejdą do master2. Jeśli master1 zawiedzie, wszystkie zapytania przejdą do master2. Jeśli master2 zawiedzie, wszystkie zapytania przejdą do master1.

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

Poniższe spowoduje, że wszystkie zapytania przejdą do master1. Jeśli master1 zawiedzie, wszystkie zapytania przejdą do master2:

'master' => array('master1', 'master2')
'slave' => array('master1', 'master2')
Tomasz
źródło
Dziękuję za tę odpowiedź. Rozumiem, że jest dość stary i może być nieaktualny. Czy masz jakieś wskazówki dotyczące implementacji tego samego w najnowszej wersji Drupala?
Gaurav Ojha
4

Z korzyścią dla innych - najlepiej, jak udało mi się to znaleźć - po wyjęciu z pudełka Drupal 7 nie wydaje się mieć wbudowanej funkcji wysokiej dostępności bazy danych.

Możesz skonfigurować dwa serwery mysql w konfiguracji master / slave, ale najlepiej będzie wysyłać wszystkie zapisy do master i wszystkie odczyty do slave. Zapewnia to rozkład obciążenia surowego, ale nie przełączanie awaryjne.

To znaczy, że jeśli główny serwer mysql przestanie działać, wszystkie zakłady są wyłączone - strona spada z brzydkim komunikatem o błędzie, narzekając, że PHP nie może dotrzeć do głównej bazy danych.

Tradycyjnie, jak rozumiem, sposobem na rozwiązanie tego problemu za pomocą innego oprogramowania jest użycie klastrów mysql ndb lub proxy mysql - ale po lekkim przeczytaniu - technologie te najwyraźniej nie działają dobrze z Drupalem.

Natknąłem się jednak na moduł Drupala o nazwie auto-slave ( http://drupal.org/project/autoslave ). Nie jest powszechnie używany (istnieje 12 stron aktywnie go wykorzystujących zgodnie ze statystykami), ale wydaje się, że jest w stanie robić to, co chcemy. Można go skonfigurować na różne sposoby:

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 (wysoka dostępność)

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 (Wysoka dostępność / Wysoka wydajność)

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)

Do tej pory pomyślnie skonfigurowaliśmy pierwszy (Master / Slave). Będę próbował następnie ustawić Master / Master / Slave.

Mam nadzieję, że pomoże to komuś innemu.

Ćwiek
źródło
To bardzo pomogło. :)
esafwan