Maneiras de escalar automaticamente servidores MySQL?

8

Eu corro um site que tem picos de tráfego alto e, por causa disso, as soluções de dimensionamento automático são muito lucrativas para este caso. Atualmente, o servidor da web é capaz de dimensionar automaticamente horizontalmente, mas o gargalo está no servidor do MySQL.

  • Eu tentei com o Amazon RDS Multi-AZ, mas o banco de dados de 12 GB leva 15 minutos para atualizar com alguns minutos de inatividade. Ajudou bastante quando eu já sabia que um aumento de tráfego ocorreria em algum momento específico.
  • Eu também considerei Xeround. Esta é provavelmente a melhor solução, embora seja bastante cara para bancos de dados desse tamanho. De qualquer forma, não é uma opção, porque eu legalmente preciso que o banco de dados esteja na União Europeia.
  • Eu li sobre o Scalr, mas não tenho certeza se isso pode ser útil e como.
  • Vi que muitos provedores de hospedagem em nuvem oferecem soluções de escalabilidade vertical que eu acho que tem 0 de inatividade (não tenho certeza se isso é realmente possível, tanto quanto eu sei que eles usam o hipervisor Xen). Essa poderia ser uma solução, mas eu me pergunto se não há tempo de inatividade e como a configuração do MySQL (e muitas outras coisas no sistema operacional) são capazes de atualizar também sem tempo de inatividade.
  • Eu tentei com servidores escravos MySQL, mas não foi de todo útil.
  • Estou usando o memcache, o que ajuda muito, mas não é suficiente. Preciso atualizar por causa das gravações, não apenas por causa das leituras.

Alguma sugestão? Agradeço antecipadamente

Zillo
fonte
parece que você está com o mesmo problema que eu :( Você pode considerar a replicação multimestre ou tentar usar uma solução de banco de dados diferente para tabelas com gravações pesadas. Atualmente estou avaliando o voltdb, estou pensando em mover parcialmente as tabelas para o voltdb do mysql.
Niko SP
Você poderia adicionar mais detalhes sobre "Eu tentei com servidores escravos MySQL, mas não ajudou em nada". De que maneira você mudou sua arquitetura, o que esperava que não acontecesse?
nickgrim
1
O software que estamos usando já foi projetado para usar servidores escravos MySQL, se você o desejar, mas, apesar disso, não ajudou em nada. Eu acho que o memcache faz quase todo o trabalho escravo do MySQL (a maioria das leituras). Eu acho que o escravo do MySQL foi mais um problema do que algo positivo, mas de qualquer maneira depende de cada caso, provavelmente em alguns casos é útil, enquanto em outros não.
Zillo

Respostas:

4

Na verdade, uma solução mais simples seria tentar adicionar o Memcached à sua pilha para economizar na carga do banco de dados. Isso pode economizar drasticamente a carga e é muito mais simples do que tentar resolver o problema de levantar servidores rapidamente (baixa dificuldade) e, em seguida, calcular uma sincronização rápida do MySQL (dificuldade muito maior).

http://toblender.com/?s=memcached

Para resolver o problema de muitas gravações, a correção mais comum é adicionar memória ao servidor (um conjunto de trabalho maior pode ser mantido na RAM), colocar seu banco de dados em discos mais rápidos (os SSDs são uma boa solução, mas cara) ou fragmentar (que é caro em servidores e complexidade adicionais).

Outra maneira de reduzir a carga de gravação do banco de dados seria incorporar um armazenamento de dados na memória (como Redis) para lidar com dados que mudam com frequência e, se necessário, gravar periodicamente as alterações no seu banco de dados principal.

gWaldo
fonte
você poderia dar um exemplo de como o memcached ajudaria a reduzir a carga de gravação nos servidores mysql?
Niko SP
1
Desculpas; Eu não vi essa parte.
gWaldo
Resposta atualizada para solucionar problemas de latência de gravação.
gWaldo
Sua sugestão de SSD é valiosa e os SSDs não são necessariamente caros para um banco de dados tão pequeno. Mesmo com um banco de dados maior, o ZFS torna possível armazenar em cache todas as gravações diretamente no flash SLC.
Skyhawk
Você está certo; Os SSDs para um banco de dados de 12 GB não são caros. Eu estava pensando mais no caso geral do que nos parâmetros específicos do OP.
gWaldo
3

Você deve considerar o uso de uma topologia em estrela

Aqui está o que eu estou propondo

  • Um mestre de gravação (também conhecido como WM)
  • Um mestre de distribuição (aka DM)
  • Cinco (5) Read Slave Server (aka RSS)

Prepare a topologia como esta

Etapa 01: Configurar 5 RSS com essas opções comuns

[mysqld]
skip-innodb
key_buffer_size=1G

Isso fará com que todas as tabelas sejam criadas carregadas como MyISAM Storage Engine

Etapa 02: Configurar o DM e todos os servidores RS

  • mysqldump o esquema de todas as tabelas do WM para um arquivo schemadump
  • carregue o arquivo schemadump no DM e todos os 5 RSS
  • execute ALTER TABLE tblname ROW_FORMAT=Fixed;em todas as tabelas no RSS
  • execute ALTER TABLE tblname ENGINE=BLACKHOLE;em todas as tabelas no DM
  • somente dados mysqldump (usando --no-create-info) em um datadump
  • carregar datadump em todos os 5 RSS

Etapa 03: Configurar a replicação do DM para todos os 5 RSS

Etapa 04: configurar a replicação do WM para o DM

FIM DA CONFIGURAÇÃO

Aqui está como o seu mecanismo de leitura / gravação funciona

  • Todas as suas gravações (INSERTs, UPDATEs, DELETEs) ocorrem no WM
  • SQL é registrado nos logs binários do DM (nenhum dado real reside no DM)
  • Cada RSS é um Read Slave to the DM
  • Todas as suas leituras ocorrem no RSS

Agora, aqui está o problema ...

  • Você usa o RSS 1-4 para leituras inicialmente
  • Use o 5º RSS para criar outro RSS
    • Você corre service mysql stopno 5º RSS
    • Gire acima outro RSS
    • Copie / var / lib / mysql e /etc/my.cnf do 5º RSS para o RSS recém-criado
    • Você corre service mysql stopno 5º RSS
    • Você corre service mysql stopno novo RSS

Você pode usar o RSS nº 5 para ativar novos servidores repetidamente

Em uma nota lateral, não use o XEROUND para o WM ou DM, pois eles não suportam o mecanismo de armazenamento InnoDB ou BLACKHOLE.

Espero que essas idéias ajudem.

RolandoMySQLDBA
fonte
1

Se você usa o Innodb, deve considerar os multi-mestres Mysql gerenciados pelo Galera . Isso facilita a configuração do multi-master do mysql e facilita a "auto-escala" semi-automática.

Se esse é um aplicativo que você ou sua empresa está escrevendo, considere mudar para um design fragmentado (particionado) para o aplicativo. Mas o sharding pode ficar complicado. Aqui está um link para você começar.

Estou assumindo que você "afinou" os arquivos de configuração do mysql, como na memória apropriada alocada etc.

Agora não
fonte
1

Isso está em um rack que você controla ou está na nuvem? 12 GB é um banco de dados muito pequeno em relação ao tamanho dos discos disponíveis. Coloque-o em uma matriz RAID1 ou RAID10 de pequenos SSDs SLC e a latência de gravação desaparecerá.

O SSD da Intel 311 série 20GB SLC (US $ 120 cada) faria o trabalho de maneira brilhante.

Se o banco de dados fosse maior, você poderia obter resultados igualmente espetaculares movendo o banco de dados para um destino iSCSI em um servidor ZFS SAN (construído em hardware de servidor básico usando Nexenta, OpenIndiana, FreeNAS ou qualquer outra coisa) e configurando um espelho de SSDs semelhantes para seu cache de gravação do ZIL. Em todas as circunstâncias, exceto as mais extraordinárias, a Gigabit Ethernet é mais do que suficiente para mover o tráfego iSCSI do banco de dados.

Falcão do céu
fonte