4
4

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 5 years have passed since last update.

学園祭プログラマーAdvent Calendar 2019

Day 19

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

Last updated at Posted at 2019-12-18

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

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

pgpool-IIとは

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

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

学園祭の企画検索システムを例に説明します。
たとえば、あるタグがついている企画の一覧をデーターベースが返すとき、同じタグを検索したら毎回返す結果は同じはずです。「食べ物」で検索をかけた場合は常に同じ結果が帰ってくるはずです。
つまり、以前問い合わされたことのある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秒(!????)だったものが・・・
委員会開催企画2.png

45.12ミリ秒の検索時間になりました!やったね!!
委員会開催企画2.png

4
4
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
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?