could not obtain a connection from the pool within 5.000 secondsを解決する

1820 ワード

こんにちは。HANOWAで開発をしている寒河江です。
HANOWAはバックエンドにRailsを使っています。ちょうど一年前に、Railsのcache機能をユーザーの詳細ページに実装しました。この実装を行うことで、毎回ユーザーのデータをロードしないようにして、DBアクセスの負荷、接続数の削減、レスポンス速度向上によるUX向上を図りました。しかし、キャッシュを使うことで、過去のデータが更新されないトラブルが発生したりして安全性の問題から、キャッシュ機能を外しました。その時に could not obtain a connection from the pool within 5.000 seconds というエラーに遭遇したので、その解決方法を共有します。

原因

エラーの内容通り、pool数が足りず、待機時間が発生し、timeoutしていました。
キャッシュ機能を作ったのがちょうど一年前です。その後HANOWAのサービスも急成長し、ユーザーアクセスが増え、RDSの同時接続数も増えてましたが、キャッシュがデータロードの頻度を減らしてくれていました。成長した後に、いきなりキャッシュを外したことで、could not obtain a connection from the pool within 5.000 secondsが発生したものと思われます。

解決策

railsのdatabase.ymlのpool数を10から20に増やしました。

database.yml

default: &default
  ...
  - pool: 10
  + pool: 20

その後

pool数をあげるので、RDSヘの接続数が増えました。
RDSのクラスの最大接続数を確認して、poolの調整をしてみてください。

HANOWAで開発したい人へ

開発者募集中です!