Трохи фону
Я вже багато років використовую дорогоцінний камінь для запуску програми для багаторічної оренди. Зараз нещодавно з'явилася необхідність масштабувати базу даних на окремих хостах, сервер db просто більше не може йти в ногу (і читання, і запис стає занадто багато) - і так, я розширив обладнання до максимуму (присвячений апаратне забезпечення, 64 ядра, 12 Nvm-e накопичувачів у рейді 10, 384 Гбіт та ін.).
Я розглядав можливість зробити це для кожного орендаря (1 орендар = 1 конфігурація / пул підключення до бази даних), як це було б "простим" та ефективним способом отримати до- number-of-tenants
раз більше можливостей, не роблячи навантажень змін коду програми.
Зараз я бігаю по рейках 4,2 атм., Скоро переходжу до 5.2. Я можу бачити, що рейки 6 додають підтримку визначень підключення для кожної моделі, однак це насправді не те, що мені потрібно, оскільки у мене є повністю дзеркальна схема бази даних для кожного з моїх 20 орендарів. Як правило, я перемикаю "базу даних" за запитом (в середньому програмному забезпеченні) або за фоновим завданням (додаткове програмне забезпечення sidekiq), однак це в даний час банально і обробляється між дорогоцінним каменем, оскільки він просто встановлює значення search_path
Postgresql і насправді не змінює фактичне з'єднання. При переході на стратегію хостингу для орендарів мені потрібно буде переключити все з'єднання за запитом.
Запитання:
- Я розумію, що я можу виконати
ActiveRecord::Base.establish_connection(config)
запит / фонову роботу - однак, як я також розумію, це запускає абсолютно нове рукостискання з підключенням до бази даних і новий пул db для нерестування в рейках - так? Я думаю, що це було б самогубство, яке зробило б таке накладне на кожен запит на мою заяву. - Тому мені цікаво, чи може хтось побачити варіант з рейками, наприклад, попередньо встановивши декілька (всього 20) підключень / пулів до бази даних (спочатку під час завантаження програми), а потім просто переключитися між цими пулами за запитом? Так що з'єднання db вже зроблені та готові до використання.
- Чи все це лише погана погана ідея, і чи варто замість цього шукати інший підхід? Наприклад, 1 екземпляр програми = одне конкретне підключення до одного конкретного орендаря. Або щось інше.
master
гілці Rails . Чи буде запущений Rails Egde опцією чи зворотним друком цієї функції до вашої поточної версії Rails?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
означає, що пул буде (повторно) використаний, а не створювати цілком нове з'єднання кожного разу?