2008-09-04 19 views
10

¿Cuál es la mejor forma de manejar una base de datos fragmentada en Rails? ¿Debería manejarse la fragmentación en la capa de aplicación, la capa de grabación activa, la capa de controlador de la base de datos, una capa de proxy o algo completamente diferente? ¿Cuáles son los pros y los contras de cada uno?División de datos y rieles

Respuesta

13

FiveRuns tienen una joya llamada DataFabric que hace sharding a nivel de aplicación y replicación maestro/esclavo. Vale la pena echarle un vistazo.

+3

https://github.com/mperham/ data_fabric es la nueva URL –

+2

"Bob está a cargo ahora": https://github.com/bpot/data_fabric –

1

En mi opinión, la forma más simple es mantener un 1: 1 entre instancias de rieles y fragmentos de DB.

9

Supongo que con fragmentos estamos hablando de particiones horizontales y no particiones verticales (here are the differences on Wikipedia).

En primer lugar, dividir la partición vertical tan lejos como pueda tomar 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 te llevará lo suficientemente lejos.

Para particionar horizontalmente, en un mundo ideal, esto se manejaría en la capa de aplicación en Rails. Pero aunque no es difícil, no es trivial en Rails, y para el momento en que lo necesite, por lo general, su aplicación ha crecido más allá del punto donde esto es factible ya que tiene llamadas ActiveRecord rociadas por todos lados. Y a nadie, a los desarrolladores ni a la administración, le gusta trabajar en él antes de necesitarlo, ya que todos preferirían trabajar en funciones que los usuarios usarán ahora en lugar de particionar, lo que puede no entrar en juego durante años después de que su tráfico haya estallado.

capa ActiveRecord ... no es fácil de lo que puedo ver. Requeriría muchos parches de monos en los internos de Rails.

En Spock terminamos el manejo de este encargo usando un MySQL Proxy y de código abierto en SourceForge como Spock Proxy. ActiveRecord cree que está hablando con una máquina de base de datos MySQL cuando la realidad está hablando con el proxy, que luego habla con una o más bases de datos MySQL, combina/ordena los resultados y los devuelve a ActiveRecord. Requiere solo algunos cambios en su código de Rails. Eche un vistazo a la página de Spock Proxy SourceForge para más detalles y nuestras razones para seguir esta ruta.

+0

+1 para estirar la partición vertical en el nivel de la tabla. Con ActiveRecord, es bastante sencillo dividir las tablas en varias tablas con menos columnas para aislar los datos "calientes" de otros datos. Esto hace una gran diferencia si estás usando MySQL. – casey

2

La conexión de raíles a múltiples bases de datos no es un gran problema; simplemente tiene una subclase de ActiveRecord para cada fragmento que anula la propiedad de conexión. Eso hace que sea bastante simple si necesita realizar llamadas con varios fragmentos. Luego solo tiene que escribir un pequeño código cuando necesite hacer llamadas entre los fragmentos.

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

También debería ver algo como Masochism antes de comenzar a fragmentar.

Cuestiones relacionadas