Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Soluções de dimensionamento para MySQL (replicação, clustering)


Tenho lido MUITO sobre as opções disponíveis. Eu também pus as mãos no MySQL 2ª edição de alto desempenho, que eu recomendo.

Isto é o que eu consegui juntar:

Agrupamento


O clustering no sentido geral é a distribuição de carga entre muitos servidores que aparecem para um aplicativo externo como um servidor.

Cluster NDB MySQL


O MySQL NDB Cluster é um mecanismo de armazenamento distribuído, na memória e sem compartilhamento com replicação síncrona e particionamento automático de dados (desculpe-me, peguei emprestado literalmente do livro High Performance, mas eles o colocaram muito bem lá). Pode ser uma solução de alto desempenho para alguns aplicativos, mas os aplicativos da Web geralmente não funcionam bem nele.

O principal problema é que, além de consultas muito simples (que tocam apenas uma tabela), o cluster geralmente terá que procurar dados em vários nós, permitindo que a latência da rede se infiltre e diminua significativamente o tempo de conclusão das consultas. Como o aplicativo trata o cluster como um computador, ele não pode dizer de qual nó buscar os dados.

Além disso, o requisito de memória não é viável para muitos bancos de dados grandes.

Sequoia Contínua


Esta é outra solução de cluster para MySQL, que atua como um middleware em cima do servidor MySQL. Oferece replicação síncrona, balanceamento de carga e failover. Ele também garante que as solicitações sempre obtenham os dados da cópia mais recente, escolhendo automaticamente um nó que tenha os dados atualizados.

Li algumas coisas boas nele, e no geral parece bastante promissor.

Federação


A federação é semelhante ao agrupamento, então eu a puxei aqui também. O MySQL oferece federação por meio do mecanismo de armazenamento federado. Semelhante à solução de cluster NDB, funciona bem apenas com consultas simples - mas ainda pior o cluster para as complicadas (já que a latência da rede é muito maior).

Replicação e balanceamento de carga


MySQL tem a capacidade de criar replicações de um banco de dados em diferentes servidores. Isso pode ser usado para muitas coisas - dividir a carga entre servidores, backups dinâmicos, criar servidores de teste e failover.

A configuração básica da replicação envolve um servidor mestre manipulando principalmente gravações e um ou mais escravos manipulando somente leituras. Uma variação mais avançada é a do master-master configuração, que permite escalar gravações também por ter vários servidores gravando ao mesmo tempo.

Cada configuração tem seus prós e contras, mas um problema que todos compartilham é o atraso de replicação - como a replicação do MySQL é assíncrona, nem todos os nós têm os dados mais recentes o tempo todo. Isso exige que o aplicativo esteja ciente da replicação e incorpore consultas com reconhecimento de replicação para funcionar conforme o esperado. Para alguns aplicativos, isso pode não ser um problema, mas se você sempre precisa dos dados mais recentes, as coisas ficam um pouco complicadas.

A replicação requer algum balanceamento de carga para dividir a carga entre os nós. Isso pode ser tão simples quanto algumas modificações no código do aplicativo ou usar soluções dedicadas de software e hardware.

Fragmentação e particionamento


A fragmentação é uma abordagem comumente usada para dimensionar soluções de banco de dados. Você divide os dados em fragmentos menores e os distribui em diferentes nós de servidor. Isso exige que o aplicativo esteja ciente da modificação no armazenamento de dados para funcionar com eficiência, pois precisa saber onde encontrar as informações necessárias.

Existem estruturas de abstração disponíveis para ajudar a lidar com fragmentação de dados, como Hibernate Shards , uma extensão para o Hibernate ORM (que infelizmente está em Java. Estou usando PHP). HiveDB é outra solução que também suporta o rebalanceamento de shard.

Outros

Esfinge


Esfinge é um mecanismo de pesquisa de texto completo, que pode ser usado para muito mais do que pesquisas de teste. Para muitas consultas, é muito mais rápido que o MySQL (especialmente para agrupamento e classificação), e pode consultar sistemas remotos em paralelo e agregar os resultados - o que o torna muito útil no uso com fragmentação.

Em geral, o sphinx deve ser usado com outras soluções de dimensionamento para obter mais hardware e infraestrutura disponíveis. A desvantagem é que, novamente, você precisa que o código do aplicativo esteja ciente da esfinge para usá-la com sabedoria.

Resumo


As soluções de dimensionamento diferem dependendo das necessidades do aplicativo que precisa. Para nós e para a maioria dos aplicativos da Web, acredito que a replicação (provavelmente multimestre) é o caminho a seguir com um balanceador de carga distribuindo a carga. A divisão de áreas problemáticas específicas (tabelas enormes) também é essencial para poder escalar horizontalmente.

Também vou dar uma chance ao Continuent Sequoia e ver se ele pode realmente fazer o que promete, pois envolverá a menor quantidade de alterações no código do aplicativo.