Que método de espelhamento do MySQL devo usar para isso?

2

Estou executando um serviço de hospedagem de aplicativos da Web (basicamente hospedando fóruns de graça) e tenho dois servidores remotos à minha disposição. O código para o aplicativo é armazenado em ambos os servidores e não é um problema, mas estou querendo saber como lidar com os bancos de dados.

Quando alguém acessa um site * .example-host.com, eles são enviados para um dos dois servidores e ambos devem ser capazes de carregar os fóruns a partir de um banco de dados. O banco de dados também deve ter acesso de gravação, para quando novos membros registrarem ou postarem tópicos, etc.

O principal requisito é a velocidade, mas o tempo de atividade também é importante (se um servidor sair, o site ainda deve funcionar).

Eu tenho algumas opções, mas sou inexperiente e não tenho certeza sobre o que fazer:

1) [PHP] Divida os registros do fórum 50:50 entre os dois servidores. Se um servidor não possui o registro para um fórum solicitado, ele pode solicitá-lo do outro pelo MySQL remoto e carregá-lo. Essa ideia parecia boa, até que percebi que, em 50% do tempo, os usuários estariam esperando muito mais tempo para que as páginas fossem carregadas. Também percebi que, se um dos servidores falisse, metade dos fóruns ficaria inacessível e os registros teriam que ser desativados.

2) [MySQL] Duplicação principal dupla. Isso tentaria espelhar os dois bancos de dados e soa perfeito, mas ouvi dizer que pode ser muito problemático. Eu não sei o quão rápido isso é.

3) [MySQL] Use uma replicação padrão, distribua consultas somente leitura em nós e consultas de leitura / gravação para o mestre. Isso parece uma boa opção, mas, novamente, não tenho certeza da velocidade. Eu também não sei o que aconteceria se o servidor master fosse desativado.

Se você tiver outras sugestões, poste-as:)

    
por Matt 14.06.2010 / 23:47

1 resposta

3

A solução 1 está perto de sharding , mas toda a arquitetura precisa ser considerada e projetada para realizar isso da melhor maneira. O sharding geralmente apresenta instalações em grande escala, empurrando os limites das plataformas de tecnologia.

A solução 2 ou replicação master dupla seria aplicável, mas como seus links são fisicamente separados, seria arriscado fazer com que o aplicativo apontasse dinamicamente para o banco de dados. Você desejaria escolher um banco de dados e, se o banco de dados falhasse, redirecionar manualmente o aplicativo para o novo banco de dados. O failover automático do aplicativo introduz o risco de divisão do cérebro. Você pode tirar instantâneos noturnos dos bancos de dados secundários para backups.

Conforme descrito na solução 3, a replicação é frequentemente usada para distribuir a carga somente leitura para diferentes servidores de banco de dados. Também permite usar diferentes mecanismos e configurações para as consultas de leitura. Por exemplo, o MyISAM pode ser mais rápido para consultas de somente leitura.

A replicação geralmente está sujeita apenas às limitações de hardware físico, sejam recursos da rede ou do sistema. A menos que você esteja armazenando dados binários no banco de dados em grande escala, eu não me preocuparia com atrasos de replicação sob carga normal.

Sendo que o seu principal requisito é a velocidade, eu primeiro me concentro na configuração e nos recursos do sistema local. As chances são otimizações substanciais podem ser feitas lá.

As soluções automáticas de alta disponibilidade são normalmente melhor localizadas em um único ambiente físico e, em caso de extrema falha, soluções manuais podem ser aplicadas para ativar o site fisicamente separado.

Estou generalizando com base em uma pilha LAMP e me concentrando em aplicativos da Web. Diferentes aplicações, protocolos e tecnologias mudam um pouco as coisas, mas no que diz respeito aos servidores e bancos de dados da Web, o que eu descrevo é mais aplicável em geral.

    
por 15.06.2010 / 05:23