Un poco de historia
He estado usando la gema del apartamento para ejecutar una aplicación de arrendamiento múltiple durante años. Recientemente, ha llegado la necesidad de escalar la base de datos en hosts separados, el servidor de db simplemente no puede seguir más (tanto las lecturas como las escrituras se están volviendo demasiado), y sí, amplié el hardware al máximo (dedicado hardware, 64 núcleos, 12 unidades Nvm-e en raid 10, 384 Gb de ram, etc.).
Estaba considerando hacer esto por inquilino (1 inquilino = 1 configuración / grupo de conexión de base de datos) ya que esa sería una forma "simple" y eficiente de obtener hasta number-of-tenants
veces más capacidad sin hacer un montón de cambios en el código de la aplicación.
Ahora estoy ejecutando rails 4.2 atm., Pronto actualizo a 5.2. Puedo ver que rails 6 agrega soporte para definiciones de conexión por modelo, sin embargo, eso no es realmente lo que necesito, ya que tengo un esquema de base de datos completamente reflejado para cada uno de mis 20 inquilinos. Por lo general, cambio la "base de datos" por solicitud (en middleware) o por trabajo en segundo plano (middleware sidekiq), sin embargo, esto es actualmente trivial y se maneja en la gema del apartamento, ya que solo establece el search_path
Postgresql y realmente no cambia la conexión real. Al cambiar a una estrategia de alojamiento por inquilino, tendré que cambiar toda la conexión por solicitud.
Preguntas:
- Entiendo que podría hacer un trabajo
ActiveRecord::Base.establish_connection(config)
por solicitud / en segundo plano; sin embargo, como también entiendo, eso desencadena un protocolo de enlace de conexión de base de datos completamente nuevo y un nuevo grupo de bases de datos para generar en rieles, ¿verdad? Supongo que sería un suicidio de rendimiento hacer ese tipo de sobrecarga en cada solicitud a mi solicitud. - Por lo tanto, me pregunto si alguien puede ver la opción con rieles de, por ejemplo, preestablecer múltiples (un total de 20) conexiones / grupos de bases de datos desde el principio (por ejemplo, al iniciar la aplicación), y luego simplemente cambiar entre esos grupos por solicitud. Para que las conexiones db ya estén hechas y listas para ser utilizadas.
- ¿Es todo esto solo una pobre y pobre idea, y debería buscar un enfoque diferente? Por ejemplo, 1 instancia de aplicación = una conexión específica a un inquilino específico. O algo mas.
master
rama actual de Rails . ¿Ejecutar Rails Egde sería una opción o retroceder esa característica a su versión actual de Rails?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
significa que el grupo será (re) utilizado, en lugar de crear una conexión completamente nueva cada vez?