Drupal Master / Slave Replication

10

He configurado dos servidores MySQL con replicación Master / Slave para la base de datos drupal y he confirmado que las bases de datos están sincronizadas y replicadas.

Ahora estoy tratando de apuntar drupal a ambas bases de datos básicamente para fines de failover / redundancia. Es decir, si necesito reiniciar nuestro servidor de base de datos principal, no quiero que nuestro sitio se caiga. (Ir a solo lectura es aceptable durante situaciones de falla)

Basado en el siguiente artículo . He modificado de la settings.phpsiguiente manera:

$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 configuración está bien hasta que apago el master (service mysqld stop) - cuando hago eso, mi sitio vomita:

PDOException: SQLSTATE [HY000] [2013] Se perdió la conexión con el servidor MySQL en 'lectura del paquete de comunicación inicial', error del sistema: 111 en drupal_is_denied () (línea 1895 de /www/includes/bootstrap.inc). Adicional

PDOException: SQLSTATE [HY000] [2013] Se perdió la conexión con el servidor MySQL en 'lectura del paquete de comunicación inicial', error del sistema: 111 en dblog_watchdog () (línea 141 de /www/modules/dblog/dblog.module).

¿Cuál es el truco para hacer que esto funcione?

Puntilla
fuente

Respuestas:

6

Con respecto a Master / Master (Alta disponibilidad) es posible hacer un equilibrio de carga cuando ningún maestro está inactivo.

Lo siguiente hará que todas las escrituras vayan a master1 y todas las lecturas vayan a master2. Si master1 falla, todas las consultas irán a master2. Si master2 falla, todas las consultas irán a master1.

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

Lo siguiente hará que todas las consultas vayan a master1. Si master1 falla, todas las consultas irán a master2:

'master' => array('master1', 'master2')
'slave' => array('master1', 'master2')
Thomas
fuente
Gracias por esta respuesta Entiendo que esto es bastante viejo y puede estar desactualizado. ¿Tiene algún consejo para implementar lo mismo en la última versión de Drupal?
Gaurav Ojha
4

Para el beneficio de otros, lo mejor que he podido encontrar, Drupal 7 no parece tener ninguna capacidad de alta disponibilidad de base de datos integrada.

Puede configurar dos servidores mysql en una configuración maestro / esclavo, pero lo mejor que puede hacer es enviar todas las escrituras al maestro y todas las lecturas al esclavo. Eso proporciona una distribución de carga bruta pero no una conmutación por error.

Es decir, si el servidor mysql maestro deja de funcionar, todas las apuestas están apagadas: el sitio deja de funcionar con un mensaje de error feo quejándose de que PHP no puede llegar a la base de datos maestra.

Tradicionalmente, según tengo entendido, la forma de abordar esto con otro software es usar mysql ndb clusters o mysql proxy, pero después de leer un poco, estas tecnologías aparentemente no funcionan bien con Drupal.

Sin embargo, me topé con un módulo de Drupal llamado auto-esclavo ( http://drupal.org/project/autoslave ). No se usa ampliamente (hay 12 sitios que lo usan activamente de acuerdo con las estadísticas), pero parece ser capaz de hacer lo que queremos. Se puede configurar de varias maneras:

Maestro-esclavo

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 (Alta disponibilidad)

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

Maestro / Maestro / Esclavo (Alta disponibilidad / Alto rendimiento)

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)

Hasta ahora hemos configurado el primer (Maestro / Esclavo) con éxito. Voy a intentar configurar Master / Master / Slave a continuación.

Esperemos que esto ayude a alguien más.

Puntilla
fuente
Esto ayudó mucho. :)
esafwan