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

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

006f2a0e31ac47eebf799326b665c2b2?s=47 miya
January 23, 2020

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

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

006f2a0e31ac47eebf799326b665c2b2?s=128

miya

January 23, 2020
Tweet

Transcript

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

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

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

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

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

  6. • 複数の「primary」データベースと、それぞれに対応する1つの 「replica」 • モデルでのコネクション自動切り替え • HTTP verbや直近の書き込みに応じたprimaryとreplicaの 自動スワップ •

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

    マルチプルデータベースの作成、削除、マイグレーション、やり とりを行うRailsタスク Multi DBの概要
  8. 話すこと - Multi DBの概要 - 導入の流れ - 導入後の結果

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

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

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

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

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

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

  15. 実戦投入 database.yml

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

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

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

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

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

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

  22. できたこと • デフォルトでは変わらずprimaryのDBに接続し、叩かれる頻度 の高いSELECTクエリだけ明示的にreplicaのDBに接続でき るようになった • クエリが詰まることもなくCMを乗り越えられた ◦ 保険として用意していた形だが、何も問題が起きないことが 正義

    • 副次的な効果として、フェイルオーバーができるようになり再起 動が発生してもダウンタイムの短縮が期待できるようになった
  23. まだできていないこと/次にやる必要があること • 開発/テスト環境でのリードレプリカ • DBユーザーの適切な権限付与 • DatabaseSelectorを使うかどうかの意思決定 • フェイルオーバー時のコネクションプールをどうする