Немного фона
Я использую жемчужину квартиры для запуска многопользовательского приложения в течение многих лет. В последнее время возникла необходимость масштабирования базы данных на отдельные хосты, сервер БД просто не может больше поддерживать (и при чтении, и при записи получается слишком много) - и да, я масштабировал оборудование до максимума (выделенный аппаратное обеспечение, 64 ядра, 12 дисков Nvm-e в raid 10, оперативная память 384 ГБ и т. д.).
Я подумывал сделать это для каждого арендатора (1 клиент = 1 конфигурация / пул соединения с базой данных), так как это был бы «простой» и эффективный способ получить в number-of-tenants
разы большую емкость без внесения изменений в код приложения.
Сейчас я бегу по рельсам 4.2 атм., Скоро обновляюсь до 5.2. Я вижу, что в rails 6 добавлена поддержка определений соединений для каждой модели, однако это не совсем то, что мне нужно, поскольку у меня есть полностью зеркальная схема базы данных для каждого из моих 20 арендаторов. Обычно я переключаю «базу данных» по запросу (в промежуточном программном обеспечении) или по фоновому заданию (sidekiq middleware), однако в настоящее время это тривиально и обрабатывается в самоцвете «Квартира», поскольку оно просто устанавливает search_path
в Postgresql и фактически не меняет фактическое соединение. При переходе на индивидуальную стратегию хостинга мне нужно будет переключать все соединение для каждого запроса.
Вопросов:
- Я понимаю, что мог бы выполнять работу
ActiveRecord::Base.establish_connection(config)
по запросу / фону - однако, как я понимаю, это инициирует совершенно новое установление соединения с базой данных и создание нового пула базы данных в рельсах - правильно? Я полагаю, что это было бы самоубийством из-за производительности, чтобы сделать такие накладные расходы на каждый запрос к моему приложению. - Поэтому мне интересно, может ли кто-нибудь увидеть вариант с рельсами, например, предварительно установить несколько (всего 20) соединений / пулов базы данных с самого начала (например, при загрузке приложения), а затем просто переключаться между этими пулами для запроса? Так что он дБ подключений уже сделан и готов к использованию.
- Является ли все это просто плохой плохой идеей, и я должен вместо этого искать другой подход? Например, 1 экземпляр приложения = одно конкретное соединение с одним конкретным арендатором. Или что-то другое.
master
ветку Rails . Будет ли запуск Rails Egde вариантом или обратным выводом этой функции в вашу текущую версию Rails?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
означает, что пул будет (повторно) использоваться вместо создания нового соединения каждый раз?