Pergunta

Nas soluções de escala inicialização Eu estou trabalhando em que estamos agora a considerar para o nosso banco de dados. As coisas ficam um pouco confuso (para mim pelo menos) com o MySQL, que tem o MySQL Cluster , replicação e < a href = "http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-replication.html" rel = "noreferrer"> MySQL cluster de replicação (a partir de ver. 5.1.6 ), que é uma versão assíncrona do cluster MySQL. O manual do MySQL explica algumas das diferenças em sua conjunto FAQ , mas é difícil determinar a partir de quando usar um ou o outro.

Eu apreciaria qualquer aconselhamento de pessoas que estão familiarizados com as diferenças entre essas soluções e quais são os prós e contras, e quando você recomenda usar cada um.

Foi útil?

Solução

Eu tenho feito muita leitura sobre as opções disponíveis. Eu também tenho em minhas mãos High Performance MySQL 2ª edição, que eu recomendo.

Isto é o que eu consegui juntos peça:

Clustering

Clustering no sentido geral é distribuir carga entre vários servidores que parecem uma aplicação no exterior, como um servidor.

MySQL NDB Cluster

MySQL Cluster NDB é um, na memória, mecanismo de armazenamento compartilhado nada distribuído com replicação síncrona e partioning automática de dados (desculpe-me de me emprestar literalmente do livro High Performance, mas eles colocá-lo muito bem lá). Pode ser uma solução de alto desempenho para algumas aplicações, mas a aplicação web geralmente não funcionam bem nele.

O grande problema é que, além de consultas muito simples (que toque apenas uma tabela), o cluster terá geralmente para procurar dados sobre vários nós, permitindo a latência da rede para entrar e tempo de conclusão para baixo significativamente lento para consultas. Desde os deleites de aplicação do cluster como um computador, ele não pode dizer qual nó para buscar os dados.

Além disso, o in-memory requisito não é viável para muitos grandes bancos de dados.

Continuent Sequoia

Esta é uma outra solução de cluster para o 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 os pedidos sempre obter os dados a partir da cópia mais recente, escolhendo automaticamente um nó que tem os dados atualizados.

Eu li algumas coisas boas sobre ele, e no geral, soa muito promissor.

Federação

Federação é semelhante ao clustering, então eu puxou-lo aqui também. MySQL ofertas federação através do mecanismo de armazenamento federada. Semelhante à solução de cluster NDB, ele funciona bem com consultas simples única -., Mas ainda pior do cluster para os mais complicados (desde a latência da rede é muito maior)

replicação e balanceamento de carga

MySQL foi construído na capacidade de criar repetições de um banco de dados em servidores diferentes. Isso pode ser usado para muitas coisas -. Dividindo a carga entre servidores, backups quentes, criando servidores de teste e failover

A configuração básica de replicação envolve um servidor mestre manipulação principalmente escreve e um ou mais escravos manipulação lê apenas. Uma variação mais avançada é a de o configuração mestre-mestre, que permite que a escala como gravações bem por ter vários servidores escrevendo ao mesmo tempo.

Cada configuração tem seus prós e contras, mas um problema que todos compartilham é lag replicação - uma vez que a replicação do MySQL é assíncrona, e não todos os nós têm os dados mais frescos em todos os tempos. Isto requer a aplicação para estar ciente da replicação e incorporar consultas de replicação-aware para trabalhar como esperado. Para algumas aplicações isto pode não ser um problema, mas se você precisa sempre os mais frescos coisas de dados se um pouco complicado.

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

Sharding e partioning

Sharding é comumente abordagem utilizada para soluções de banco de dados de escala. Você dividir os dados em pedaços menores e espalhá-los em torno de diferentes nós de servidor. Isto requer a aplicação para estar ciente da modificação para o armazenamento de dados para trabalho de forma eficiente, como ele precisa saber onde encontrar as informações necessárias.

Existem estruturas de captação disponíveis para ajudar a lidar com sharding dados, como Hibernate Shards , um extensão para o Hibernate ORM(Que infelizmente está em Java. Eu estou usando PHP). HiveDB é outro tal solução, que também suporta o reequilíbrio caco.

Outros

Esfinge

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

Em esfinge geral deve ser usada com outras soluções de escala para obter mais do hardware e infra-estrutura disponível. A desvantagem é que mais uma vez é necessário o código do aplicativo para estar ciente de esfinge para usá-lo sabiamente.

Resumo

soluções de escala diferem dependendo das necessidades da aplicação que precisa dele. Para nós e para a maioria das aplicações web, acredito que a replicação (provavelmente multi-master) é o caminho a percorrer com um balanceador de carga distribuir a carga. Sharding de áreas problemáticas específicas (enormes tabelas) é também uma obrigação para ser capaz de escalar horizontalmente.

Eu também vou dar um tiro para Continuent Sequoia e ver se ele pode realmente fazer o que promete, uma vez que irá envolver o mínimo de alterações ao código do aplicativo.

Outras dicas

Disclaimer:. Eu não usei o MySQL Cluster, então eu só vou pelo que tenho ouvido

MySQL Cluster é uma solução de HA (alta disponibilidade). É rápido, porque é tudo na memória, mas é ponto de venda real é a disponibilidade. Não há nenhum ponto único de falha. Com a replicação, por outro lado, se o mestre vai para baixo, você tem que mudar realmente para a réplica, e pode haver uma pequena quantidade de tempo de inatividade. (Embora a solução DRBD é uma outra alternativa que tem alta disponibilidade)

Cluster requer que todo o seu ajuste de banco de dados na memória. Isso significa que cada máquina nas necessidades de cluster para ter memória suficiente para armazenar todo o banco de dados. Portanto, esta não é uma solução viável para grandes bancos de dados (ou pelo menos é uma solução muito caro).

Eu acho que a menos que HA é super importante (leia-se: provavelmente não), é mais incômodo (e dinheiro) do que realmente vale. A replicação é mais frequentemente o melhor caminho a percorrer.

Editar: eu esqueci de mencionar também que Cluster não permite chaves estrangeiras, e scans alcance são mais lento do que em outros motores. Aqui está um link que fala sobre Conhecido Limitações de MySQL Cluster

Existem algumas boas discussões sobre como as pessoas que mantêm drupal.org têm estruturado seus servidores de banco de dados:

Ambos são a partir de 2007, de modo que o suporte Clustering pode ser mais forte agora, mas no momento em que escolheu replicação.

A coisa legal sobre fazer a replicação é que é fácil. Basta configurar 2 caixas mysql, altere o serverID na segunda caixa, e em seguida, aponte a segunda caixa na primeira usando o mestre mudança de comando.

Aqui está a amostra relevante escravo my.cnf configuração

#
#       Log names
#

log-bin=binlog
relay-log=relaylog
log-error=errors.log

#
#       Log tuning
#

sync_binlog = 1
binlog_cache_size = 1M

#
#       Replication rules (what are we interested in listening for...)
#
#       In our replicants, we are interested in ANYTHING that isn't a permission table thing
#

replicate-ignore-db =      mysql
replicate-wild-ignore-table=mysql.%

#
#       Replication server ID
#

server-id      =        2

Certifique-se assim cada escravo obtém um serverID incrementado por 1 (tão próxima escravo é servidor 3)

configurar um nome de usuário e senha que o escravo pode se conectar em, Então corra mudança mestre para MASTER_HOST = 'x.x.x.x'; mudança mestre para MASTER_PASSWORD = "xxxxx";

e assim por diante.

Finalmente, execute "começar escravo";

Up vem seu escravo e começa a replicar. doce huh!

Isso pressupõe que você começar com 2 servidores vazios. Depois, você pode despejar o seu db para o servidor principal, e como ele carrega lá, ele também irá carregar no escravo.

Você pode verificar o status escravo executando:

Mostrar estado de escravo \ G

se divertir com ele .. soooo fácil ...

Ao fazer estudo High Availability me deparei com muitas soluções e, provavelmente, no nosso caso, que era o sistema mais intensivo de escrita, eu encontrei conjunto DRBD melhor do que o cluster NDB, pois proporciona maior número de transações por segundo.

Mysql replicação pode fornecer-lhe uma máquina de backup que pode ser usado como escravo de leitura ou pode ser usado em caso de recuperação de desastres.

Com diferentes modos de transporte de gerenciamento de transações fornecidas pelo DRBD que puder alguns que reduzir o desempenho atingido pela replicação nível do dispositivo de dados através da rede. Para o sistema confiável, que não deve perder qualquer transação em caso de modo C uso fracasso, então ir para a B.

Eu tentei listar alguns dos aprendizados eu fiz durante a criação do cluster DRBD em http: / /www.techiegyan.com/?p=132

Ele funciona muito bem em conexão dedicada para reserva replicação ou seja, interfaces de alta velocidade separados em ambos as máquinas apenas para replicação drbd. Batimento cardíaco pode controlar o cluster bem com todos os serviços, um por um ou seja, IP endereços, divisórias, drbd e mysql.

Ainda estou para descobrir a configuração Master-mestre no DRBD. Atualizará como e quando eu obter sucesso nisso.

Graças.

na minha opinião, a confusão aqui apenas me envia de volta para Mnesia. Com a fragmentação, declarativa e forma pragmática de índices de manipulação, a transparência Localização de Banco de Dados Réplicas e.t.c

Em nossa configuração, Corremos tanto MySQL Cluster e Mnesia. Nossos dados é meio sazonal. Então, o que acontece é depois de algum tempo, nós aliviar mnesia de dados que não é mais usado e jogá-lo no MySQL Cluster. Isso mantém nossa mnesia eficiente. Também temos aplicações implementadas nas principais línguas Stream (Python, Clojure e.t.c) que os dados de uso directo a partir do MySQL.

Em poucas palavras, corremos mnesia no topo do MySQL Cluster. O MySQL Cluster pode lidar com grandes conjuntos de dados, um banco de dados pode crescer até 50GB plus. Temos mnesia alimentar o Erlang / OTP aplicações. Java e Dados PHP acesso de mnesia mais adaptados DESCANSO (recentemente Thrift ) APIs usando JSON e XML como formatos de troca .

A camada de acesso a dados tem acesso abstraída a dados em Mnesia e os dados enviados velhos no MySQL Cluster se sua necessidade. Mnesia é aqui essencialmente ao poder do OTP applications.Once Erlang / ele fica monopolizou-se com os dados, nós jogá-lo no MySQL Cluster. A camada de acesso a dados pode acessar ambos os dados em mnesia e MySQL em uma API captada em nome de todas as aplicações.

O que posso dizer aqui é que Mnesia tem sido a melhor opção para nós. As tabelas são altamente fragmentados e indexados, as consultas realizar muito bem e o banco de dados são replicados em 2 locais, ligados através de um túnel.

Anteriormente, temíamos que mnesia não pode lidar com tantos registros quanto possível devido à mesa de limitação de tamanho. Mas nós encontramos esta errado comunicado. Com boa tuning (fragmentação), nossas bases de dados mnesia não segurar uma média de cerca de 250 milhões de discos por ano.

Nós se beneficiaram complexa estrutura de dados do Erlang eo fato de que Mnesia pode engoli-lo-se inalterado. Os Erlang / OTP aplicações são mais eficiente de todos os outros aplicativos em linguagens legados e com o nosso sistema que está pensando em migrar tudo para a tecnologia Erlang / OTP. De Erlang nós dados seemlessly de acesso do MySQL Cluster e executar consultas Onto seus servidores muito maravilhosamente, Na verdade, temos deduziu que a sua Erlang / OTP que podem utilizar plenamente os recursos do servidor MySQL por causa de sua (Erlang) concorrência maciça.

Mnesia tem funcionado para nós muito well.Mnesia mudou completamente a forma como olhamos para bancos de dados por causa de seu desempenho emocionante. Nossa Solaris núcleo do processador de servidor são mantidos ocupados com uma média de utilização de cerca de 48% nas horas de pico.

Eu aconselho que você verifique mnesia e quem sabe, pode responder a um número da sua distribuição ou replicação necessidades.

Eu não usei-los, mas a partir dos docs eu diria que a replicação é a solução preferida, se a maior carga está lendo a partir do banco de dados.

Os "na memória" de limitação impede-nos de utilizar clusters MySQL para o nosso quase 50GB de dados, por isso estamos usando DRBD mais linux pulsação .

É meio como um array RAID entre caixas de dois (ou mais) que mantém os bancos de dados / logs / configs em sincronia (mas apenas um servidor pode ser "ao vivo" de cada vez). Failover é automático, usa o mesmo endereço IP, e é rápido como um reinício mysql, de modo que tem sido uma boa solução para nós.

MySQL cluster é uma besta estranha e cada vez que avaliou ele quer é realizado muito mal ou sido confiável.

É terrivelmente complicado de configurar (é necessário pelo menos três nós, possivelmente mais). Também não há provisão para ter clientes failover, então você tem que fazer isso mesmo (ou usar algo mais para atuar como um proxy etc).

É extremamente inteligente, porque ele faz o particionamento de hash automática na chave primária que permite que você escreve escala, e também porque ele não tem nenhum ponto único de falha.

Mas eu realmente acho que é melhor adequado para os casos muito especiais fim a que se destinam. Ele não pode, na maioria dos casos, substituir outro mecanismo de banco de dados (por exemplo, InnoDB) em desempenho ou recursos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top