やったこと
octopus をインストールして使ってみます。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
$ rails --version
Rails 5.2.3
$ sqlite3 --version
3.20.1 2017-08-24 16:21:36 8d3a7ea6c5690d6b7c3767558f4f01b511c55463e3f9e64506801fe9b74dce34
調査
今回 octopus
という gem を使います。
octopus は下記機能を提供しています。
- Sharding (with multiple shards, and grouped shards).
- Replication (Master/slave support, with multiple slaves).
- Moving data between shards with migrations.
- Tools to manage database configurations. (soon)
Replication について動きを確かめてみます。
インストール
Gemfile
gem 'ar-octopus'
config
config/shards.yml
octopus:
replicated: true
environments:
- development
development:
shard1:
adapter: sqlite3
database: db/development.slave1.sqlite3
shard2:
adapter: sqlite3
database: db/development.slave2.sqlite3
アクセスしてみる
別々にアクセスしていることを確認するため、 使用するテーブルの最終行にデータを入れました。
development.slave1.sqlite3
development.slave2.sqlite3
$ rails c
Running via Spring preloader in process 74218
Loading development environment (Rails 5.2.4.1)
irb(main):001:0> Book.last
[Shard: shard2] Book Load (0.4ms) SELECT "books".* FROM "books" ORDER BY "books"."id" DESC LIMIT ? [["LIMIT", 1]]
=> #<Book id: 4, title: "222", status: nil, created_at: "2020-03-15 07:58:57", updated_at: "2020-03-15 07:58:57">
irb(main):002:0> Book.last
[Shard: shard1] Book Load (0.1ms) SELECT "books".* FROM "books" ORDER BY "books"."id" DESC LIMIT ? [["LIMIT", 1]]
=> #<Book id: 5, title: "123", status: 1, created_at: "2020-03-28 00:00:00", updated_at: "2020-03-28 00:00:00">
shard1、shard2 によって、異なるデータを取得していることが分かります。
最後に
Octopus will enter into maintainance mode once Rails 6 is released
Rails6 がリリースされているので、メンテナンスモードになっているようです。