Pregunta

¿Cuál es la mejor manera de lidiar con una base de datos fragmentada en Rails?¿Debería manejarse la fragmentación en la capa de aplicación, la capa de registro activo, la capa del controlador de la base de datos, una capa de proxy o algo completamente distinto?¿Cuáles son los pros y los contras de cada uno?

¿Fue útil?

Solución

FiveRuns tiene una gema llamada Tela de datos que realiza fragmentación a nivel de aplicación y replicación maestro/esclavo.Quizás valga la pena echarle un vistazo.

Otros consejos

Supongo que con los fragmentos estamos hablando de partición horizontal y no de partición vertical (Aquí están las diferencias en Wikipedia.).

Antes que nada, partición vertical estirada hasta donde pueda llegar antes de considerar la partición horizontal.En Rails es fácil tener diferentes modelos que apunten a diferentes máquinas y, para la mayoría de los sitios de Rails, esto le llevará bastante lejos.

Para la partición horizontal, en un mundo ideal, esto se manejaría en el capa de aplicación en Rieles.Pero si bien no es difícil, no es trivial en Rails, y cuando lo necesita, generalmente su aplicación ha crecido más allá del punto en el que es factible, ya que tiene llamadas ActiveRecord esparcidas por todas partes.Y a nadie, ni a los desarrolladores ni a la administración, le gusta trabajar en ello antes de que lo necesite, ya que todos preferirían trabajar en funciones que los usuarios usarán ahora en lugar de particiones que pueden no entrar en juego durante años después de que su tráfico se haya disparado.

Capa ActiveRecord...No es fácil por lo que puedo ver.Requeriría muchos parches de mono en los componentes internos de Rails.

En Spock Terminamos manejando esto usando un proxy MySQL personalizado y lo abrió en SourceForge como Apoderado de Spock.ActiveRecord cree que está hablando con una máquina de base de datos MySQL cuando en realidad está hablando con el proxy, que luego habla con una o más bases de datos MySQL, fusiona/ordena los resultados y los devuelve a ActiveRecord.Requiere sólo unos pocos cambios en su código Rails.Eche un vistazo a la página de Spock Proxy SourceForge para obtener más detalles y conocer nuestras razones para seguir este camino.

Para aquellos de ustedes como yo que no habían oído hablar de fragmentación:

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

Conectar Rails a múltiples bases de datos no es gran cosa; simplemente tiene una subclase ActiveRecord para cada fragmento que anula la propiedad de conexión.Eso lo hace bastante simple si necesita realizar llamadas entre fragmentos.Luego sólo tienes que escribir un pequeño código cuando necesites realizar llamadas entre los fragmentos.

No me gusta la idea de Hank de dividir las instancias de Rails, porque parece difícil llamar el código entre instancias a menos que tengas una gran biblioteca compartida.

También deberías considerar hacer algo como Masoquismo antes de comenzar a fragmentar.

Para que Rails funcione con un entorno replicado, sugeriría usar el complemento my_replication que ayuda a cambiar la conexión de la base de datos a uno de los esclavos en tiempo de ejecución.

https://github.com/minhnghivn/my_replication

En mi opinión, la forma más sencilla es mantener una relación 1:1 entre las instancias de Rails y los fragmentos de base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top