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.php
w 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?
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
Master / Master (wysoka dostępność)
Master / Master / Slave (Wysoka dostępność / Wysoka wydajność)
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.
źródło