Drupal Master / Slave Replication


10

Я настроил два сервера MySQL с репликацией Master / Slave для базы данных drupal и подтвердил, что базы данных синхронизируются и реплицируются.

Сейчас я пытаюсь указать drupal на обе базы данных в основном для целей аварийного переключения / резервирования. То есть, если мне нужно перезагрузить наш основной сервер базы данных, я не хочу, чтобы наш сайт закрывался. (Переход только для чтения допустим в сценариях сбоев)

На основании следующей статьи . Я изменил settings.phpследующим образом:

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

Конфигурация в порядке, пока я не выключу мастер (остановка службы mysqld) - когда я это делаю, мой сайт рвет:

PDOException: SQLSTATE [HY000] [2013] Потерянное соединение с сервером MySQL при «чтении исходного пакета связи», системная ошибка: 111 в drupal_is_denied () (строка 1895 из /www/includes/bootstrap.inc). дополнительный

PDOException: SQLSTATE [HY000] [2013] Потеряно соединение с сервером MySQL при «чтении начального пакета связи», системная ошибка: 111 в dblog_watchdog () (строка 141 из /www/modules/dblog/dblog.module).

Какой трюк, чтобы заставить это работать?

Ответы:


6

Относительно Master / Master (Высокая доступность) возможно выполнить балансировку нагрузки, когда ни один мастер не выключен.

Следующее действие заставит все записи перейти на master1, а все чтения - на master2. В случае сбоя master1 все запросы будут отправлены на master2. В случае сбоя master2 все запросы будут переданы master1.

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

Следующее сделает все запросы перейти к master1. Если master1 завершится неудачно, все запросы перейдут к master2:

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

Спасибо за этот ответ. Я понимаю, что это довольно старый и может быть устаревшим. Есть ли у вас какие-либо советы по реализации того же самого в последней версии Drupal?
Гаурав

4

Для блага других - насколько я смог узнать - из коробки в Drupal 7, похоже, не встроена возможность высокой доступности базы данных.

Вы можете настроить два сервера mysql в конфигурации «ведущий / ведомый», но лучше всего будет отправить все записи на ведущий и все чтения на ведомый. Это обеспечивает грубое распределение нагрузки, но не отказоустойчивость.

То есть, если главный сервер mysql выходит из строя, все ставки выключаются - сайт закрывается с ужасным сообщением об ошибке, сообщающим, что PHP не может добраться до главной базы данных.

Традиционно, как я понимаю, способ решения этой проблемы с другим программным обеспечением состоит в том, чтобы использовать либо кластеры mysql ndb, либо прокси-сервер mysql - но после прочтения немного - эти технологии явно не очень хорошо работают с Drupal.

Однако я наткнулся на модуль Drupal, называемый auto-slave ( http://drupal.org/project/autoslave ). Он не используется широко (есть 12 сайтов, активно использующих его согласно статистике), но, похоже, он может делать то, что мы хотим. Это может быть настроено различными способами:

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.

Мастер / Мастер (Высокая доступность)

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 (Высокая доступность / Высокая производительность)

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)

Пока что мы успешно установили первый (Master / Slave). Я собираюсь попытаться настроить Master / Master / Slave дальше.

Надеюсь, это поможет кому-то еще.


Это очень помогло. :)
esafwan
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.