Como posso ter 2 servidores de banco de dados para o meu site?

5

Eu tenho um site que tem tráfego pesado e meu servidor de banco de dados (mysql) está recebendo tráfego pesado em horas de espiada. Em vez de atualizar para um servidor melhor, estou pensando em ter dois servidores de banco de dados trabalhando juntos para que o tráfego pesado possa ser "dividido".

Minha pergunta é como isso pode acontecer? Como 1 banco de dados pode ser manipulado por 2 máquinas diferentes? Qual é a prática comum de conseguir algo assim e o que você sugere que eu faça?

Meu servidor web como se comunicará com os servidores de banco de dados? O servidor da Web deve se comunicar apenas com um deles ou com os dois?

    
por mr didodido 16.02.2011 / 20:11

6 respostas

6

Você tem algumas opções a considerar para melhorar o desempenho do seu banco de dados, não apenas incluindo o dimensionamento.

  • Otimize as configurações do MySQL - Existem dezenas de parâmetros de configuração que podem ter um impacto drástico no desempenho do MySQL. Certifique-se de investigar esta opção antes de decidir se realmente precisa escalar.
  • Otimize o aplicativo - Como o Paul mencionou, certifique-se de que seu aplicativo esteja se comportando de maneira razoável. Se você não usar os índices e consultas adequados, terá um desempenho ruim, independentemente do número de servidores e desperdiça dinheiro / tempo a longo prazo.
  • Ampliação - Obter uma máquina maior pode ser uma solução mais simples, dependendo do nível de hardware em que você está no momento. Para cada aplicativo, no entanto, há algum ponto em que será mais fácil / melhor começar a expandir (replicação / fragmentação).
  • Replication - A configuração usual é ter um servidor mestre e vários servidores escravos. O Mestre recebe todas as solicitações de gravação e qualquer um dos escravos pode atender a solicitações de leitura. Isso é bom para casos em que você espera muito mais leituras que gravações.
  • Sharding - Cada um dos vários servidores MySQL manipula uma parte do banco de dados geral. Por exemplo, os usuários a-d estão no db1, e-i no db2, etc .... Acredito que isso seja tratado na camada de aplicação e não no próprio MySQL.

Os itens acima estão na ordem em que eu os investigaria, embora isso dependa da aplicação e de seus requisitos. Por exemplo, se você também quisesse adicionar redundância para uma configuração de alta disponibilidade, a replicação provavelmente seria a escolha óbvia.

    
por 16.02.2011 / 22:09
4

Alguém postou um link para uma configuração do mysql livejournal. Eles disseram que é melhor ficar com um grande servidor em vez de agrupá-lo.

Analise os slides de um dos caras do livejournal aqui: link

Minha sugestão é começar a otimizar suas consultas e seus índices. Isso reduziu minha carga de 4 para 0,5. Incrível, né? Adicionando apenas índices extras.

HTH

    
por 16.02.2011 / 21:09
2

Cluster deles.

    
por 16.02.2011 / 20:23
2

O que você normalmente quer que aconteça aqui é que todas as suas operações write sempre vão para a mesma (master), e você usa alguma forma de replicação para sincronizar os novos dados do master para os escravos . Em seguida, você pode usar um balanceador de carga para distribuir consultas de leitura entre os vários servidores físicos disponíveis, com o entendimento de que, para determinadas situações, esses servidores podem estar um pouco desatualizados. O balanceador de carga também precisa ser inteligente o suficiente para saber que certos tipos de consultas precisam ser atendidos no servidor mestre, para que, por exemplo, quando eu adicionar essa postagem ao Stack Overflow, não precise esperar que a replicação seja atualizada minha nova postagem, se eu acabar carregar equilibrado para um servidor secundário. Em suma, o aplicativo precisa ser escrito para estar ciente disso também. Você não pode simplesmente ativar uma opção no banco de dados e fazer com que tudo funcione.

    
por 16.02.2011 / 21:17
2

A linha inferior provavelmente ficará melhor se você atualizar o servidor. A execução de dois bancos de dados ao vivo adiciona muita complexidade e não vale o custo relativamente pequeno do hardware. Sistemas realmente grandes usam coisas como o Oracle RAC para executar o mesmo banco de dados em várias máquinas, mas ainda não se parece com sua zona de cluster de servidor de um milhão de dólares. Ter uma espera quente é sempre uma boa ideia e você pode usar a replicação para mantê-la pronta.

    
por 16.02.2011 / 22:17
1
  1. Você pode dividir a leitura e gravar SQLs no nível do aplicativo. Configurar uma replicação com dois servidores que você tem no aplicativo (suponho que você está usando uma classe para lidar com leitura, gravação, conexão ao servidor de banco de dados) em qualquer lugar você tem escrever, excluir, substituir, atualizar SQL tê-los conectar ao seu servidor mestre e tudo que você lê SQLs se conectam ao servidor escravo. Você pode tirar a carga de leituras do seu servidor mestre.
  2. Com a aplicação da estrutura de replicação, você também precisa otimizar suas tabelas (index, ..) e também as consultas para obter o desempenho máximo. Também não se esqueça de ajustar seus parâmetros de replicação e monitorar o tráfego de servidores e se você vir mais SQLs de leitura do que escreve, então no futuro você pode adicionar o segundo servidor slave ao seu arquiteto.
  3. Se você estiver usando a solução de replicação, não se esqueça de que sua versão do MySQL escrava deve ser da mesma versão que master ou superior, caso contrário a replicação será interrompida em algum momento.
  4. A replicação é uma estrutura agradável e comum, mas, com isso, também há desafios. Como se a replicação fosse interrompida, você deve saber como iniciar o escravo do ponto de interrupção para que os dois servidores estejam em sincronia.
  5. Se fosse eu, eu tentaria otimizar meus SQLs e Consultas e tabelas primeiro, monitorar meu tráfego e ver se eu tenho mais de ler ou escrever SQLs e basear-me nisso eu tomaria a etapa de aninhamento.
por 17.02.2011 / 17:45

Tags