ruby-on-rails database activerecord sharding

ruby on rails - División de datos y rieles



ruby-on-rails database (6)

¿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 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?


Conectar 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 considerar hacer algo como el masoquismo antes de comenzar a fragmentar.


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


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



Para que los rieles funcionen con el 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


Supongo que con fragmentos estamos hablando de particiones horizontales y no de particiones verticales ( aquí están las diferencias en Wikipedia ).

Primero, estira la partición vertical hasta donde puedas 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 te llevará lo suficientemente lejos.

Para la partición horizontal, 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 que lo necesite, ya que todos preferirían trabajar en las características 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 por lo que puedo ver. Requeriría muchos parches de monos en los internos de Rails.

En Spock terminamos manejando esto usando un proxy MySQL personalizado y lo abrimos desde 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.