11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[mastodon] PgBouncerを導入する

Last updated at Posted at 2019-02-20

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

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)

11
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?