Rails version 6 (and above) natively supports attaching multiple databases to your application. This is built into Active Record and supports a number of very useful features - like replicas and automatic connection switching.
Cloud 66 fully supports the native implementation of MultiDB for Rails. However, we recommend you read the official Rails guide to MultiDB before configuring it on Cloud 66. Be sure to apply all the environment and config changes outlined in that doc to your application before setting up MultiDB.
MultiDB is optional
MultiDB for Rails relies on Cloud 66 Database Groups, but you can also use Database Groups with your Rails application without implementing the native MultiDB architecture, if you prefer.
Configuring a primary and replica database
To set up a read-only replica alongside your primary database, your
database.yml file might look something like this:
production: primary: database: my_primary_database username: root password: <%= ENV['ROOT_PASSWORD'] %> adapter: mysql2 encoding: utf8mb4 primary_replica: database: my_primary_database username: root_readonly password: <%= ENV['ROOT_READONLY_PASSWORD'] %> adapter: mysql2 encoding: utf8mb4 replica: true
Cloud 66 will ingest this configuration and instantiate database servers based on whatever is specified. Note that the
primary_replica has the same name as the
primary - this is by design - they are essentially the same database (from Rails's perspective).
The primary and replica databases must run on separate servers, and so we will provision separate server for each database pair (i.e. one for the primary, and another for the replica).
Configuring multiple separate databases
If you need completely separate databases, you can configure them as follows:
production: animals: database: animals_db username: animals_root password: <%= ENV['ANIMALS_ROOT_PASSWORD'] %> adapter: mysql2 encoding: utf8mb4 shapes: database: shapes_db username: shapes_root password: <%= ENV['SHAPES_PASSWORD'] %> adapter: mysql2 encoding: utf8mb4
You can also have replicas alongside these separate databases. For example:
production: animals: database: animals_db username: animals_root password: <%= ENV['ANIMALS_ROOT_PASSWORD'] %> adapter: mysql2 encoding: utf8mb4 animals_replica: database: animals_db username: animals_root_readonly password: <%= ENV['ANIMALS_ROOT_READONLY_PASSWORD'] %> adapter: mysql2 encoding: utf8mb4 replica: true shapes: database: shapes_db username: shapes_root password: <%= ENV['SHAPES_PASSWORD'] %> adapter: mysql2 encoding: utf8mb4
Different databases of the same type (e.g. MySQL) must run on separate servers, and so we will provision separate servers for each database of that type. You can run two or more databases of different types on the same server (although, in general, we recommend against sharing servers in production environments).
You can further customise these databases using your manifest file (see below).
Customising Rails MultiDB instances via manifest
You can use your app's
manifest.yml file to further customise your databases - specifying different database versions within the same application, for example. This relies on Database Groups - we recommend reading our guide to Groups before customising your databases.
You can customise your databases by using (exactly) the same names in both configuration files. For example, if we revisit the example above with
shapes. If you wanted the
animals database to use MySQL v5.7 and the
shapes database to use MySQL v8.0 you would create a manifest file in
.cloud66/manifest.yml that looked like this:
mysql: groups: animals: configuration: version: 5.7 animals_replica: configuration: version: 5.7 shapes: configuration: version: 8.0
Any databases not explicitly mentioned in the manifest file will be ignored (and therefore use the default configurations).
There are a wide range of settings available - please check out our reference guide for the full list.
Check that database names match in configs
If the database names in your database.yml and manifest.yml do not match exactly, this will create conflicts. Be sure to use exactly the same names in both configuration files.