Mestre Drupal / Replicação Escrava

10

Configurei dois servidores MySQL com replicação Master / Slave para o banco de dados drupal e confirmei que os bancos de dados estão sincronizados e replicados.

Agora estou tentando apontar drupal para os dois bancos de dados basicamente para fins de failover / redundância. Ou seja, se eu precisar reiniciar nosso servidor de banco de dados primário, não quero que nosso site seja desativado. (Somente leitura é aceitável durante cenários de falha)

Com base no seguinte artigo . Eu modifiquei da settings.phpseguinte maneira:

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

A configuração está boa até eu desligar o master (service mysqld stop) - quando faço isso, meu site vomita:

PDOException: SQLSTATE [HY000] [2013] Perdeu a conexão com o servidor MySQL ao 'ler o pacote de comunicação inicial', erro do sistema: 111 em drupal_is_denied () (linha 1895 de /www/includes/bootstrap.inc). Adicional

PDOException: SQLSTATE [HY000] [2013] Conexão perdida com o servidor MySQL ao 'ler o pacote de comunicação inicial', erro do sistema: 111 em dblog_watchdog () (linha 141 de /www/modules/dblog/dblog.module).

Qual é o truque para fazer isso funcionar?

Brad
fonte

Respostas:

6

Em relação ao mestre / mestre (alta disponibilidade) é possível fazer o balanceamento de carga quando nenhum mestre está inoperante.

A seguir, todas as gravações vão para master1 e todas as leituras para master2. Se master1 falhar, todas as consultas irão para master2. Se master2 falhar, todas as consultas irão para master1.

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

A seguir, todas as consultas serão direcionadas para master1. Se master1 falhar, todas as consultas irão para master2:

'master' => array('master1', 'master2')
'slave' => array('master1', 'master2')
Thomas
fonte
Obrigado por esta resposta. Entendo que isso é bastante antigo e pode estar desatualizado. Você tem alguma dica para implementar o mesmo na versão mais recente do Drupal?
Gaurav Ojha
4

Para o benefício de outras pessoas - o melhor que pude descobrir - pronto, o Drupal 7 não parece ter nenhum recurso de alta disponibilidade do banco de dados embutido.

Você pode configurar dois servidores mysql em uma configuração mestre / escravo, mas o melhor a fazer é enviar todas as gravações para o mestre e todas as leituras para o escravo. Isso fornece distribuição de carga bruta, mas não failover.

Ou seja, se o servidor master do mysql cair, todas as apostas serão desativadas - o site será encerrado com uma mensagem de erro feia, reclamando que o PHP não pode acessar o banco de dados mestre.

Tradicionalmente, pelo que entendi, a maneira de lidar com isso com outro software é usar clusters mysql ndb ou proxy mysql - mas depois de ler um pouco - essas tecnologias aparentemente não funcionam bem com o Drupal.

No entanto, me deparei com um módulo Drupal chamado auto-slave ( http://drupal.org/project/autoslave ). Não é amplamente usado (existem 12 sites que o usam ativamente de acordo com as estatísticas), mas parece capaz de fazer o que queremos. Pode ser configurado de várias maneiras:

Senhor de escravos

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.

Mestre / Mestre (alta disponibilidade)

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

Mestre / Mestre / Escravo (Alta disponibilidade / Alto desempenho)

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)

Até agora, configuramos o primeiro (Mestre / Escravo) com êxito. Vou tentar configurar o Mestre / Mestre / Escravo a seguir.

Espero que isso ajude alguém.

Brad
fonte
Isso ajudou muito. :)
esafwan