Posted at

[mastodon] PgBouncerを導入する

PgBouncerはPostgresqlへのコネクションをプールしてくれるやつですが、負荷軽減のため導入してみました。

公式ガイドだけではハマってしまうポイントがあり苦労したので、そのへんをまとめておこうと思います。

https://docs.joinmastodon.org/administration/scaling-up/#transaction-pooling-with-pgbouncer

なにか認識が間違っていることなどがあれば、教えていただけると助かります。


前提


  • 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も付与したところうまくいきました。


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認証になっていました。


/etc/postgresql/11/main/pg_hba.conf

# "local" is for Unix domain socket connections only

local all all peer

この状態ではログインユーザがPostgreSQLのユーザと一致していないと入れないため、使用するユーザの認証方式をmd5にしてやる必要があるみたいです。

(ソケットで通信してるつもりはなかったですけど。。)

mastodonユーザと自分の場合はpgbouncerユーザをadmin_userとしたいのでその2つを追加してみました。


/etc/postgresql/11/main/pg_hba.conf

# 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)