С запуском Rails 6 была объявлена одна из новых функций — поддержка нескольких БД. Эта передышка пришла ко мне, когда в одном из наших приложений я изо всех сил пытался эффективно управлять отдельными БД. Существует ряд причин, по которым нужна такая поддержка, например:
- Использование базы данных SQL для хранения пользовательских данных и NoSQL для данных о местоположении
- Наличие нескольких баз данных SQL для управления отдельными приложениями, но приложению может потребоваться прямой доступ к другой базе данных
- Управление несколькими базами данных NoSQL и Redis для хранения различных видов данных и т. Д.
Когда сталкиваются с использованием нескольких баз данных, обычно одна служит ведущей, а другие серверы — ведомыми. Поскольку я управлял этим до выхода Rails 6, я использовал не очень оптимальный (читай патч / хакерский) способ сделать это. Я создал отдельный файл YAML для второй базы данных для хранения информации о соединении. Вот пример файла:
Джава
1
second_database.yaml
2
3
adapter: db_adapter
4
encoding: db_encoding
5
pool: db_pool
6
username: db_username
7
password: db_password
8
database: db_name
9
host: db_host
Чтобы получить доступ к нескольким базам данных, каждый раз, когда я:
-
Установите соединение, прочитав информацию о соединении из файла YAML
Джава
xxxxxxxxxx
1
config = YAML.load_file(second_database.yaml')
2
connection = ActiveRecord::Base.establish_connection(
3
adapter: config['adapter'],
4
host: config['host'],
5
database: config['database'],
6
username: config['username'],
7
password: config['password']
8
)
9
- Запрос данных
Джава
xxxxxxxxxx
1
employees = connection.execute("SELECT * from employees")
-
закрыть соединение
Джава
xxxxxxxxxx
1
connection.close
Вам также могут понравиться:
Rails Bundle Install и Gemfile
Такая головная боль!
Но с выпуском нового Rails 6 вам, вероятно, не придется проходить через боль (и извиваться в своем собственном коде), чтобы управлять несколькими базами данных.
Как только был запущен Rails 6, я обновил свое приложение, чтобы использовать преимущества поддержки нескольких БД. Давайте пошагово разберемся с обновлением и настройкой нескольких БД.
- Сначала проверьте и обновите Ruby до версии 2.5, поскольку для Rails 6 требуется Ruby 2.5 или новее.
-
Обновите вашу версию Ruby до версии 2.5 или новее:
-
Во время обновления Ruby может быть возможно получить синтаксические ошибки или предупреждения об устаревании только из-за обновления версии
-
Пожалуйста, обновляйте версии Ruby постепенно — не переходите непосредственно к последней версии; это вызовет у вас много проблем
-
Обновление до следующей увеличенной версии; устранить ошибки и предупреждения; запустить и разрешить контрольные примеры и повторить процесс
-
- Обновите Rails до последней версии в серии 5.2:
- Поскольку эта статья охватывает только рекомендации по обновлению с Rails 5.2 до Rails 6; пожалуйста, убедитесь, что вы находитесь на последней версии в серии 5.x.
-
Обновите Gemfile для Rails 6 версии:
-
Теперь пришло время обновить версию Rails в вашем Gemfile; измените версию Rails Gem в вашем Gemfile.
-
Запустите в терминале команду обновления Rails для обновления Rails и других зависимых Gems.
-
-
Запустите приложение Rails: обновление в терминале:
-
Запустив эту команду; вы найдете новые настройки конфигурации добавлены в ваше приложение. Я предлагаю вам использовать параметр diff (d) для каждого изменения файла.
-
-
Раскомментируйте значения по умолчанию в new_framework_defaults_6_0.rb:
- Запустите миграцию:
-
Теперь запустите пакетную установку, чтобы установить оставшиеся Gems, запустить миграцию и решить проблему, если она есть.
-
-
Запустите и исправьте тестовые случаи:
- После этого масштабного обновления давайте протестируем ваше приложение. Запустите ваши тестовые случаи; решить, если что-то не удалось, и решить предупреждение об устаревании.
-
Запустите localhost и выполните ручное тестирование:
-
Я бы посоветовал вам провести один раунд ручного тестирования вашего приложения. Хит рельсы и начать тестирование вашего приложения вручную.
-
Бинго , теперь вы работаете на Rails 6!
Теперь давайте перейдем к настройке нескольких БД с помощью Rails 6.
Благодаря поддержке нескольких баз данных Rails 6 у вас может быть несколько баз данных с репликой (копией только для чтения) каждой базы данных.
Теперь рассмотрим приложение Rails с единственной первичной базой данных, и теперь после обновления до Rails 6 вам необходимо добавить новую базу данных для некоторых новых таблиц. Текущая версия вашего database.yml выглядит так:
Джава
xxxxxxxxxx
1
production:
2
database: my_primary_database
3
user: root
4
adapter: mysql
С рельсами 6; Вы можете добавить реплику для своей основной базы данных, а также можете добавить новую базу данных, обновив файл database.yml следующим образом:
Джава
xxxxxxxxxx
1
production:
2
primary:
3
database: my_primary_database
4
user: root
5
adapter: mysql
6
primary_replica:
7
database: my_primary_database
8
user: root_readonly
9
adapter: mysql
10
replica: true
11
blogs:
12
database: my_blogs_database
13
user: blogs_root
14
adapter: mysql
15
migrations_paths: db/blogs_migrate
16
blogs_replica:
17
database: my_blogs_database
18
user: blogs_readonly
19
adapter: mysql
20
replica: true
Рассмотрим несколько моментов, которые необходимо учитывать при использовании реплики для вашей базы данных:
-
Для первичных баз данных и баз данных реплики имя базы данных должно быть одинаковым, поскольку обе базы данных содержат одинаковые данные. При использовании базы данных реплик, вам необходимо добавить
replica: true
в настройки базы данных. -
Имя пользователя для реплики и первичных баз данных должно отличаться; основной пользователь будет иметь права как на чтение, так и на запись, а пользователь реплики будет иметь только разрешение на чтение.
-
При добавлении новой базы данных вам также необходимо позаботиться о пути миграции. Для этого вам нужно добавить
migrations_path
параметр в файл database.yml, как показано выше. Мы не установили путь миграции для базы данных реплик, но у нас естьreplica: true
для него.
После этого шага; у вас будет новая база данных. Теперь давайте настроим модель для этого. Чтобы использовать новую базу данных, вам нужно добавить один класс абстрактной модели в ваше приложение, как показано ниже:
Джава
xxxxxxxxxx
1
class Post < ApplicationRecord
2
self.abstract_class = true
3
4
connects_to database: { writing: :blogs, reading: :blogs_replica }
5
end
Теперь, когда вы можете получить доступ к новой базе данных, давайте кратко обсудим несколько функций базы данных:
1. Автоматическое переключение между первичной базой данных и базой данных реплики:
Чтобы использовать в приложении базу данных только для чтения, вам необходимо настроить промежуточное ПО для автоматического переключения соединения.
Автоматическое переключение соединения позволяет вашему приложению переключаться между первичной базой данных и базой данных реплики на основе методов HTTP-запроса.
Чтобы настроить промежуточное ПО для автоматического переключения соединения, раскомментируйте или добавьте следующую строку в конфигурацию приложения.
Джава
xxxxxxxxxx
1
config.active_record.database_selector = 2.seconds
Rails отправляет запрос GET или HEAD первичному серверу только в том случае, если запрос чтения находится в пределах того, что мы настроили выше. По умолчанию будет установлено значение 2 секунды. Вы можете изменить его в зависимости от инфраструктуры базы данных.
2. Ручное переключение между первичной базой данных и базой данных реплик:
Для подключения к реплике или первичной базе данных вручную; Rails предоставляет ActiveRecord::Base.connected_to
метод.
В некоторых случаях вашему приложению необходимо подключиться к основной или реплике, не обращая внимания на тип запроса. В таких случаях вы можете использовать connected_to
метод, предоставленный ActiveRecord.
Джава
xxxxxxxxxx
1
ActiveRecord::Base.connected_to(database: blogs) do
2
CollectPostsInformationWorker.perform(Post.all.pluck(:id, :title))
3
end
Используя приведенный выше код, вы можете заставить ваше приложение подключаться к базе данных блогов независимо от типа запроса.
Джава
xxxxxxxxxx
1
ActiveRecord::Base.connected_to(database: { reading: :blogs }) do
2
CollectPostsInformationWorker.perform(Post.all.pluck(:id, :title))
3
end
Это будет использовать соединение, чтобы прочитать копию базы данных блога и использовать ее.
Теперь давайте посмотрим, какие функции Rails 6 не предоставляет возможность работы с несколькими БД.
Такие функции, как шардинг, балансировка нагрузки на реплики и объединение нескольких баз данных, не поддерживаются в Rails 6.
Можно надеяться, что некоторые из этих функций будут добавлены в будущем.