Réplication maître / esclave Drupal


10

J'ai installé deux serveurs MySQL avec réplication maître / esclave pour la base de données drupal et j'ai confirmé que les bases de données sont synchronisées et répliquées.

J'essaie maintenant de pointer Drupal vers les deux bases de données essentiellement à des fins de basculement / redondance. C'est-à-dire que si je dois redémarrer notre serveur de base de données principal, je ne veux pas que notre site tombe en panne. (La lecture seule est acceptable pendant les scénarios d'échec)

Basé sur l' article suivant . J'ai modifié settings.phpcomme suit:

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

La configuration est correcte jusqu'à ce que j'arrête le maître (service mysqld stop) - quand je fais ça, mon site vomit:

PDOException: SQLSTATE [HY000] [2013] Connexion perdue au serveur MySQL lors de la «lecture du paquet de communication initial», erreur système: 111 dans drupal_is_denied () (ligne 1895 de /www/includes/bootstrap.inc). Additionnel

PDOException: SQLSTATE [HY000] [2013] Connexion perdue au serveur MySQL lors de la «lecture du paquet de communication initial», erreur système: 111 dans dblog_watchdog () (ligne 141 de /www/modules/dblog/dblog.module).

Quelle est l'astuce pour que cela fonctionne?

Réponses:


6

Concernant Master / Master (Haute disponibilité), il est possible de faire un équilibrage de charge quand aucun maître n'est en panne.

Ce qui suit fera passer toutes les écritures à master1 et toutes les lectures à master2. Si master1 échoue, toutes les requêtes iront à master2. Si master2 échoue, toutes les requêtes iront à master1.

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

Ce qui suit fera passer toutes les requêtes à master1. Si master1 échoue, toutes les requêtes iront à master2:

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

Merci pour cette réponse. Je comprends que c'est assez ancien et peut-être dépassé. Avez-vous des conseils pour l'implémenter dans la dernière version de Drupal?
Gaurav Ojha

4

Pour le bénéfice des autres - du mieux que j'ai pu trouver - Drupal 7 ne semble pas avoir de capacité de haute disponibilité de base de données intégrée.

Vous pouvez configurer deux serveurs mysql dans une configuration maître / esclave, mais le mieux qu'il fera sera d'envoyer toutes les écritures au maître et toutes les lectures à l'esclave. Cela fournit une distribution de charge brute mais pas de basculement.

C'est-à-dire que si le serveur mysql maître tombe en panne, tous les paris sont désactivés - le site tombe avec un message d'erreur laid se plaignant que PHP ne peut pas atteindre la base de données master.

Traditionnellement, si je comprends bien, la façon de résoudre ce problème avec d'autres logiciels consiste à utiliser les clusters mysql ndb ou le proxy mysql - mais après avoir lu un peu - ces technologies ne semblent pas bien fonctionner avec Drupal.

Cependant, je suis tombé sur un module Drupal appelé auto-esclave ( http://drupal.org/project/autoslave ). Il n'est pas très utilisé (12 sites l'utilisent activement selon les statistiques) mais il semble pouvoir faire ce que nous voulons. Il peut être configuré de différentes manières:

Maître d'esclave

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 (Haute disponibilité)

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

Maître / Maître / Esclave (Haute disponibilité / Haute performance)

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)

Jusqu'à présent, nous avons réussi à configurer le premier (maître / esclave). Je vais essayer de configurer Master / Master / Slave ensuite.

J'espère que cela aide quelqu'un d'autre.


Cela a beaucoup aidé. :)
esafwan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.