Un peu d'histoire
J'utilise le Gem Appartement pour exécuter une application multi-locataire depuis des années. Récemment, le besoin de faire évoluer la base de données sur des hôtes séparés est arrivé, le serveur db ne peut tout simplement plus suivre (les lectures et les écritures deviennent trop) - et oui, j'ai dimensionné le matériel au maximum (dédié matériel, 64 cœurs, 12 disques Nvm-e en raid 10, 384 Go de RAM, etc.).
number-of-tenants
J'envisageais de faire cela par locataire (1 locataire = 1 configuration / pool de connexion à la base de données) car ce serait un moyen "simple" et efficace pour obtenir jusqu'à -toujours plus de capacité sans effectuer de charges de changements de code d'application.
Maintenant, j'utilise des rails 4.2 atm., Je passerai bientôt à 5.2. Je peux voir que rails 6 ajoute la prise en charge des définitions de connexion par modèle, mais ce n'est pas vraiment ce dont j'ai besoin, car j'ai un schéma de base de données complètement en miroir pour chacun de mes 20 locataires. En général, je change de "base de données" par demande (dans le middleware) ou par tâche d'arrière-plan (middlekiq middleware), mais cela est actuellement trivial et géré par la gemme Appartement, car il définit simplement le search_path
dans Postgresql et ne change pas vraiment la connexion réelle. Lors du passage à une stratégie d'hébergement par locataire, je devrai changer la connexion entière par demande.
Des questions:
- Je comprends que je pourrais faire un travail
ActiveRecord::Base.establish_connection(config)
par demande / en arrière-plan - cependant, comme je le comprends aussi, cela déclenche une nouvelle négociation de connexion à la base de données et un nouveau pool de bases de données à apparaître dans les rails - non? Je suppose que ce serait un suicide de performance de faire ce genre de frais généraux sur chaque demande unique à ma demande. - Je me demande donc si quelqu'un peut voir l'option avec des rails par exemple de préétablir plusieurs (totaux 20) connexions / pools de base de données depuis le début (par exemple au démarrage de l'application), puis basculer entre ces pools par demande? Pour que les connexions DB soient déjà établies et prêtes à être utilisées.
- Tout cela n'est-il qu'une mauvaise mauvaise idée, et devrais-je plutôt rechercher une approche différente? Par exemple, 1 instance d'application = une connexion spécifique à un locataire spécifique. Ou autre chose.
master
branche Rails actuelle . L'exécution de Rails Egde serait-elle une option ou une sauvegarde de cette fonctionnalité dans votre version actuelle de Rails?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
signifie que le pool sera (ré) utilisé, au lieu de créer une nouvelle connexion à chaque fois?