Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ProductionでRails6マルチDB対応を小さく始める

 ProductionでRails6マルチDB対応を小さく始める

平成.rb #11で話したスライドです。

Hirotaka Miyagi

January 23, 2020
Tweet

More Decks by Hirotaka Miyagi

Other Decks in Technology

Transcript

  1. ProductionでRails6 Multi DB対応を小さく始める
    株式会社タイミー 宮城広隆

    View full-size slide

  2. 自己紹介
    宮城 広隆
    Ruby/Rails歴は2年
    @MH4GF

    View full-size slide

  3. 平成Ruby会議のスポンサートークでマルチDB対応の
    話を軽くしたところ、懇親会でどのように運用しているの
    かと聞かれることが多かったので
    今回はその話をします

    View full-size slide

  4. 話すこと
    - Multi DBの概要
    - 導入の流れ
    - 導入後の結果

    View full-size slide

  5. 話すこと
    - Multi DBの概要
    - 導入の流れ
    - 導入後の結果

    View full-size slide

  6. ● 複数の「primary」データベースと、それぞれに対応する1つの
    「replica」
    ● モデルでのコネクション自動切り替え
    ● HTTP verbや直近の書き込みに応じたprimaryとreplicaの
    自動スワップ
    ● マルチプルデータベースの作成、削除、マイグレーション、やり
    とりを行うRailsタスク
    Multi DBの概要

    View full-size slide

  7. ● 複数の「primary」データベースと、それぞれに対応する1つの
    「replica」
    ● モデルでのコネクション自動切り替え
    ● HTTP verbや直近の書き込みに応じたprimaryとreplicaの
    自動スワップ
    ● マルチプルデータベースの作成、削除、マイグレーション、やり
    とりを行うRailsタスク
    Multi DBの概要

    View full-size slide

  8. 話すこと
    - Multi DBの概要
    - 導入の流れ
    - 導入後の結果

    View full-size slide

  9. ● リードレプリカの導入
    ● 特定のGETエンドポイントのみリードレプリカに接続
    ● DatabaseSelectorは使わない
    今回やったこと

    View full-size slide

  10. ● Ruby2.6.1
    ● Rails6.0.2.1
    ● Amazon Aurora MySQL
    環境

    View full-size slide

  11. なぜマルチDBが必要だったのか

    View full-size slide

  12. なぜマルチDBが必要だったのか
    ● 一番はCMによる負荷増大の保険のため
    ● 最悪の場合のフェイルオーバーの選択肢を作るため

    View full-size slide

  13. 実戦投入 RDS
    RDSで「リーダーの追加」を選択し、リードレプリカのDBインス
    タンスを追加

    View full-size slide

  14. 実戦投入 RDS
    クラスターのリード用エンドポイントが作られるので、こちらを
    控えておく

    View full-size slide

  15. 実戦投入 database.yml

    View full-size slide

  16. 実戦投入 モデル
    各モデルで継承している抽象クラス(デフォルトのままでは
    ApplicationRecord)で、databaseとroleを設定

    View full-size slide

  17. 実戦投入 コントローラー
    リードレプリカを読みたい箇所でconntected_toを呼ぶ

    View full-size slide

  18. 実戦投入 コントローラー
    以上!!!!

    View full-size slide

  19. 実戦投入
    100行以下の修正で実装完了

    View full-size slide

  20. 実戦投入 コントローラー
    around_actionで呼ぶこともできます

    View full-size slide

  21. DatabaseSelectorを使いたい場合
    Railsガイドから引用
    https://railsguides.jp/active_record_multiple_databases.html

    View full-size slide

  22. できたこと
    ● デフォルトでは変わらずprimaryのDBに接続し、叩かれる頻度
    の高いSELECTクエリだけ明示的にreplicaのDBに接続でき
    るようになった
    ● クエリが詰まることもなくCMを乗り越えられた
    ○ 保険として用意していた形だが、何も問題が起きないことが
    正義
    ● 副次的な効果として、フェイルオーバーができるようになり再起
    動が発生してもダウンタイムの短縮が期待できるようになった

    View full-size slide

  23. まだできていないこと/次にやる必要があること
    ● 開発/テスト環境でのリードレプリカ
    ● DBユーザーの適切な権限付与
    ● DatabaseSelectorを使うかどうかの意思決定
    ● フェイルオーバー時のコネクションプールをどうする

    View full-size slide