BETA

Herokuのデータベースをfollowして負荷を分散した話

投稿日:2019-02-05
最終更新:2019-02-06
※この記事は外部サイト(https://qiita.com/217tech/items/82ac46495b...)からのクロス投稿です

モチベーション

入力の多い高負荷のHeroku Railsアプリケーションがあり、Postgresの負荷が大変なことに。負荷を分散しつつ、Master + Slave構成にしました。

そのときに使ったgemなどをご紹介。

Heroku Postgres Follower Databases

Creating and Managing Heroku Postgres Follower Databases

Heroku Postgresには followerという機能があり、簡単にSlaveを作ることが出来ます。

実際にFollowする

# HEROKU_POSTGRESQL_XXXX_URLはマスターDB  
$ heroku addons:create heroku-postgresql:standard-0 --follow HEROKU_POSTGRESQL_XXXX_URL

DB接続を切り替えるgem

候補はいろいろ

  1. eagletmt/switch_point
  2. anjlab/db-switch

switch_pointは抽象的過ぎる感じがしたので、db-switchの方を使いました。

database.yml

slave:  
  development:  
    adapter: postgresql  
    encoding: unicode  
    pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>  
    username: <%= ENV.fetch('DATABASE_USER') { 'postgres' } %>  
    password: <%= ENV.fetch('DATABASE_PASSWORD') { 'password' } %>  
    host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %>  
    port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %>  
    database: <%= ENV.fetch('DATABASE_NAME') { "app_dev" } %>

スレーブに切り替えるとき

ActiveRecord::Base.connect_to(:slave) do  
  User.count  
end

切り替わっているかどうかか、connect_toブロックの中で、ActiveRecord::Base.connection_configの出力を確認。実際に変わっているかどうかを見ます

マルチテナント(Apartment)と併用するときは注意が必要

connect_toブロックで囲んでしまうと、いくらrequestでschemaを切り替えてもpublicに変わってしまいます

Apartmentでswitchする前にslaveに明示的に変更する必要があります

ActiveRecord::Base.connect_to(:slave) do  
  Apartment::Tenant.switch(Apartment::Tenant.current) do   
    ap ActiveRecord::Base.connection_config  
    ap ActiveRecord::Base.connection.current_schema  
  end  
end
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

217 Technologies Blog

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!