Ubuntu 18.04 LTS でpgpool-IIを使ってPostgreSQLをキャッシュする


僕は筑波大学学園祭実行委員情報メディアシステム局のインフラ担当を務めました。
学園祭なのでもちろんのこと企画検索システムが制作されましたが(学園祭プログラマー Advent Calendar 2019 18日目の@siy1121が記事を書いています)、ソフトウェアのデーターベースの設計が好ましくなく、レスポンスが非常に遅くなってしまいました。
データーベースの設計を途中で変更するのはなかなか難しいのでインフラ側で解決しました。
その際利用したpgpool-IIの使い方と説明です。

ネットにはpgpool-IIの使い方はCentOSしかないので、Ubuntuでの運用の仕方を書きます。

pgpool-IIとは

pgpoolはPostgreSQLとクライアントの間で稼働するミドルウェアです。コネクションプーリングやロードバランスなどの機能を持たせることができます。今回はインメモリキャッシュ機能を使っていきます。
詳細はこちらのサイトをみていただくのがいいのかなと。

インメモリキャッシュとは

学園祭の企画検索システムを例に説明します。
たとえば、あるタグがついている企画の一覧をデーターベースが返すとき、同じタグを検索したら毎回返す結果は同じはずです。「食べ物」で検索をかけた場合は常に同じ結果が帰ってくるはずです。
つまり、以前問い合わされたことのあるSQL文がまた問い合わせられたら、結果を最初の段階でキャッシュしておき、そのキャッシュを返答すれば無駄のない処理となります。
ここで問題なのは、INSERT文などでデーターベースの内容が書き換わったときです。
その際はpgpool-IIは対象のテーブルのキャッシュを自動的に全て消去します。
つまり、pgpool-IIを再起動することなく自動的にPostgreSQLとのデータに不整合がないように調整してくれます。
学園祭当日になって(ありえないが、)食べ物を出店する企画が増え、INSERT文で企画を追加したとしても、pgpool-IIは自動的に対象のテーブルに対するキャッシュを消去し最新のデータを返します。
なお、このキャッシュ機能は最近はソフトウェア側でこの処理をすることが増えてきたそうです。

導入

echo "deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main" | sudo tee -a /etc/apt/sources.list.d/pgdg.list
curl -s https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
sudo apt update
sudo apt upgrade
sudo apt install pgpool2

参考:http://nodoka.org/postgresql-11-pgpool2-ubuntu-18-04/

設定

今回、ソフトウェア(企画検索システム)は何も設定しなくてもいいように、PostgreSQLとpgpoolのポート番号をいじります。

PostgreSQLの設定ファイルはバージョンによって設定ファイルの場所が違うので注意。

それぞれ、以下の設定項目を見つけて編集します。

/etc/postgresql/11/main/postgresql.conf
port = 60001                            # PostgreSQLのポート番号 好きに設定する
/etc/pgpool2/pgpool.conf
port = 5432                        # pgpoolのポート番号 ソフトウェアはここにアクセスする

backend_port0 = 60001              #PostgreSQLで設定したポート番号

memory_cache_enabled = on          #キャッシュを有効化します。

設定を有効化するためにはそれぞれの再起動が必要です。

systemctl restart postgresql
systemctl restart pgpool2

もし systemctl restart pgpool2 が失敗する場合はいったんサーバーを再起動してください。

導入は以上です。キャッシュが使えるメモリの量など細かい設定もできます。それはググってください

結果

pgpool-IIを導入する前に検索にかかる時間が48.95秒(!????)だったものが・・・

45.12ミリ秒の検索時間になりました!やったね!!