PgBouncerはPostgresqlへのコネクションをプールしてくれるやつですが、負荷軽減のため導入してみました。
公式ガイドだけではハマってしまうポイントがあり苦労したので、そのへんをまとめておこうと思います。
https://docs.joinmastodon.org/administration/scaling-up/#transaction-pooling-with-pgbouncer
なにか認識が間違っていることなどがあれば、教えていただけると助かります。
追記: 本家のガイドが結構いいかんじになっていました。
https://docs.joinmastodon.org/admin/scaling/
前提
- ubuntu 18.04
- PostgreSQL 11.1
ハマったポイント
- admin_usersに設定するユーザの権限に注意が必要
- PostgreSQLの認証方式の変更が必要
admin_usersに設定するユーザの権限
CREATEDBじゃ全然駄目で、SUPERUSERの権限を与えるとうまくいきました。
ガイドに書いてある通り、pgbouncer
ユーザを作ってパスワードを設定して、CREATEDBの権限を付与しました。
(まぁAdminって書いてるけどSUPERUSER与えるのはなんか嫌だし、CREATEDBの権限くらいあればいいんじゃないかなって思って)
CREATE USER pgbouncer WITH CREATEDB PASSWORD 'password'
全然だめだったのでSUPERUSERも付与したところうまくいきました。
ALTER ROLE pgbouncer WITH SUPERUSER;
PostgreSQLの認証方式の変更
ガイド通りに進めてもDebugging that it all worksのところで、認証エラーで全くつながらないことがあります。
Debugging that it all works
You should be able to connect to PgBouncer just like you would with Postgres:
psql -p 6432 -U mastodon mastodon_production
PostgreSQLの認証方式を見直す必要があります。
peer→md5へ変更
pg_hba.confを確認するとpeer認証になっていました。
# "local" is for Unix domain socket connections only
local all all peer
この状態ではログインユーザがPostgreSQLのユーザと一致していないと入れないため、使用するユーザの認証方式をmd5にしてやる必要があるみたいです。
(ソケットで通信してるつもりはなかったですけど。。)
mastodonユーザと自分の場合はpgbouncerユーザをadmin_userとしたいのでその2つを追加してみました。
# Database administrative login by Unix domain socket
local all postgres peer
# ↓2つ追加
local all mastodon md5
local all pgbouncer md5
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
導入にあたって注意
PgBouncerを通してdb:migrate
ができないため、アップデートの際はRAILS_ENV=production DB_PORT=5432 bundle exec rails db:migrate
などとDB_PORT=5432
を指定して実行するようにしましょう。
ミスったらどうなるんだろう…。
Gotcha: You cannot use pgBouncer to perform db:migrate tasks. But this is easy to work around. If your postgres and pgbouncer are on the same host, it can be as simple as defining DB_PORT=5432 together with RAILS_ENV=production when calling the task, for example: RAILS_ENV=production DB_PORT=5432 bundle exec rails db:migrate (you can specify DB_HOST too if it’s different, etc)
まとめ
公式ガイド通りやっているのにうまくいかないときの絶望感。
なんとか導入することができたのでよかったです。
mastodonはメモリ1GBのさくらのVPSで運用しているのですが、最近uptimeが長くなってくるとメモリがカツカツで厳しい。。。
同時にjemallocも導入してみたので効果があれば嬉しいな。
参考
peer認証の関係でpsqlログインできない時の対処法
mastodonへのpgbouncer導入ガイド(非Docker)