Pergunta

Qual é a melhor maneira de lidar com um banco de dados fragmentado no Rails?A fragmentação deve ser tratada na camada de aplicativo, na camada de registro ativo, na camada do driver de banco de dados, na camada de proxy ou em algo completamente diferente?Quais são os prós e os contras de cada um?

Foi útil?

Solução

FiveRuns tem uma joia chamada DataFabric que faz fragmentação em nível de aplicativo e replicação mestre/escravo.Pode valer a pena conferir.

Outras dicas

Presumo que com shards estamos falando de particionamento horizontal e não de particionamento vertical (aqui estão as diferenças na Wikipedia).

Primeiramente, esticar particionamento vertical o máximo que você puder antes de considerar o particionamento horizontal.É fácil no Rails fazer com que diferentes modelos apontem para máquinas diferentes e, para a maioria dos sites Rails, isso o levará longe o suficiente.

Para particionamento horizontal, em um mundo ideal, isso seria tratado no camada de aplicação em trilhos.Mas embora não seja difícil, não é trivial no Rails e, quando você precisar, normalmente sua aplicação cresceu além do ponto em que isso é viável, já que você tem chamadas do ActiveRecord espalhadas por todo o lugar.E ninguém, desenvolvedores ou gerenciamento, gosta de trabalhar nisso antes de precisar dele, pois todos preferem trabalhar nos recursos que os usuários usarão agora, em vez de no particionamento, que pode não entrar em ação por anos após a explosão do tráfego.

Camada ActiveRecord...não é fácil pelo que posso ver.Exigiria muitos patches de macacos nos componentes internos do Rails.

No Spock acabamos lidando com isso usando um proxy MySQL personalizado e abri-lo no SourceForge como Procurador Spock.O ActiveRecord pensa que está se comunicando com uma máquina de banco de dados MySQL quando, na realidade, está se comunicando com o proxy, que então se comunica com um ou mais bancos de dados MySQL, mescla/classifica os resultados e os retorna ao ActiveRecord.Requer apenas algumas alterações no seu código Rails.Dê uma olhada na página do Spock Proxy SourceForge para obter mais detalhes e nossos motivos para seguir esse caminho.

Para aqueles de vocês como eu que nunca ouviram falar em sharding:

http://highscalability.com/unorthodox-approach-database-design-coming-shard

Conectar Rails a vários bancos de dados não é grande coisa - você simplesmente tem uma subclasse ActiveRecord para cada fragmento que substitui a propriedade de conexão.Isso torna tudo muito simples se você precisar fazer chamadas entre fragmentos.Você só precisa escrever um pequeno código quando precisar fazer chamadas entre os fragmentos.

Não gosto da ideia de Hank de dividir as instâncias do Rails, porque parece um desafio chamar o código entre as instâncias, a menos que você tenha uma grande biblioteca compartilhada.

Além disso, você deve tentar fazer algo como Masoquismo antes de começar a fragmentar.

Para que o Rails funcione com ambiente replicado, eu sugeriria usar o plugin my_replication que ajuda a mudar a conexão do banco de dados para um dos escravos em tempo de execução

https://github.com/minhnghivn/my_replication

Na minha opinião, a maneira mais simples é manter 1:1 entre instâncias Rails e fragmentos de banco de dados.

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