pgpool-IIの過去、現在、そして未来

pgpool-II Global Development Group
石井 達夫

2003年6月27日: pgpoolの誕生
コネクションプーリング、フェイル
オーバのみ●
サポートするPostgreSQLサーバは2台まで●
Version 2プロトコルのみサポート(まだVersion 3プロトコル=PostgreSQL 7.4はリリースされていなかった)●●

C言語で4,719ステップの規模

2003年6月27日(金) 22:54:46 JST[pgsql-jp: 30256] PostgreSQL用コネクションプール
サーバ pgpool
石井です．
PHPをはじめ，Perlなど，言語を問わず使える「pgpool」といPostgreSQL用のコネクションプールサーバを作ったので公開します．できたなのでまだアルファ版程度のクォリティですが，よろしかったらお試し下さい．
ftp://ftp.sra.co.jp/pub/cmd/postgres/pgpool/pgp
ool-0.1.tar.gz# もちろんpgpoolはオープンソースで，ライセンスはPostgreSQLのBSDライセンスと同様のものにしています．

pgpoolを作った動機は，PHPでコネクションプールが使えないことに不満を持ったからです．

ナウ
マン
象古
代の象

(一応PHPには「パーシスタントコネクション」というものがあってDBへの接続への接続をキャッシュできますが，少なくともapacheのプロセスの数だけコネクションができるので，DBへ過大な負荷がかかりがちです．
pgpoolを使うとコネクションをキャッシュできるだけでなく，DBへの接続数を適切な数に制限できるので，DBの性能を引き出すことができます．

)
2

Copyright(c) 2015 SRA OSS, Inc. Japan

2004年4月:pgpool 1.0の誕生
現在の「ネィティブ・レプリケーションモード」に相当する機能を実装した(まだPostgreSQLにはレプリケーション機能がなかった)●
クエリキャンセル対応●
ラージオブジェクトのレプリケーション対応●
C言語で5,890行●
この頃は、マイナーリリース(x.x)の際にも平気で機能を追加していたりして、かなりいい加減なリリース管理がされていた●

3

現代の象になったがまだまだよちよち歩き

Copyright(c) 2015 SRA OSS, Inc. Japanpgpool 2.0へ進化
2004年6月リリース●
1.0のわずか2ヶ月後にリリース●●

かなり頑張って開発していたようだ

V3プロトコルにネィティブ対応●
C言語で7,750行●
この後2.5を2005年2月にリリース。ヘルスチェックや、マスタースレーブモードへの対応を追加●●

これでpgpoolとしてのリリースは完了
4

Copyright(c) 2015 SRA OSS, Inc. Japan

2006年9月:pgpool-II 1.0の誕生●

開発手法の変更
個人プロジェクトから、チーム作業へ●
IPAの援助で開発●●

機能の大幅追加、現在の姿にほぼ近づ
く
サーバ台数の制限撤廃●
SQLパーサを搭載して精密な構文解析●
管理コマンド(pcp)の実装●
GUI管理ツール(pgpoolAdmin)の実装●
パラレルクエリモードの実装●
C言語で73,511行と、一気に10倍近い規模に増えた(bison, flexコード行数を含む)●

5

Copyright(c) 2015 SRA OSS, Inc. Japan

2011年11月pgpool.netへの引っ越し
それまでホスティングさせてもらっていた pgfoundryの不安定さに手を焼く●
新しいホストティングサイト
pgpool.net を作ることを決意●
pgpool.netをオープン、ソースコード管理も CVSから git に移行した●●

gitへの移行にあたって、フランスのコミュニティのご支援をいただきました6

引っ越しはなかなか大変でした●

pgpool.netでは、英語の情報と日本語の情報を同時発信することにした(難しい場合は英語を優先)

Copyright(c) 2015 SRA OSS, Inc. Japan現在の開発体制●

石井●●Ahsan Hadi●●

3.4の開発からコミッタに就任

長田悠吾
●

●

ユーザニーズの取り込み、ベンチマークMuhammad Usama●●

全体のとりまとめ。コードも書きます

watchdogを中心に担当。リリース作業やRPM作成も安齋希美●

pgpoolAdminとインストーラを中心に担当。リリース作業やRPM作成も

7

Copyright(c) 2015 SRA OSS, Inc. Japanpgpool-IIの現在●

PostgreSQLのクラスタの総合管理ツールに進化
ストリーミングレプリケーションの管理ツールとして●クエリをプライマリとスタンバイに振り分ける●
スタンバイに対するread onlyクエリの負荷分散●
フェイルオーバの管理●
クエリキャッシュ●●

pgpool-II自体のHA化●

watchdog

8

Copyright(c) 2015 SRA OSS, Inc. Japanpgpool-IIの現在の主な機能性能向上

コネクションプーリング
検索負荷分散クエリキャッシュ

高可用性

自動フェイルオーバ
フェイルオーバスクリプト
フォローマスタスクリプト
watchdog

クラスタ管理クラスタとアプリケーションの親和性

オンラインリカバリ

クエリの自動振り分け

9Copyright(c) 2015 SRA OSS, Inc. Japan

性能向上(1)●

コネクションプーリング
PostgreSQLは接続に時間がかかる●
接続しっぱなしにして接続時間を節約●
コネクションプーリングの有効時間を設定することも可能●
Javaなどの環境では自前のコネクションプーリングを持っていることがあり、その場合は効果はない

1,400

●

1,200
1,000
800
TPS600400
2000

pgpool-II 経由

PostgreSQL 直接

測定条件: PostgreSQL 9.4+pgpool-II 3.4.1
pgbench -S -C -c 1 -T 30

10Copyright(c) 2015 SRA OSS, Inc. Japan

性能向上(2)●

検索負荷分散複数のPostgreSQLに検索クエリを分散させて全体として性能向上●
重いクエリほど効果的●最大でPostgreSQLの数に比例した性能向上が期待できる●●

クエリキャッシュ
検索結果をキャッシュしておき、2回目以降はキャッシュを返すことにより、高速化。PostgreSQLにアクセスしないのでDB負荷も軽減できる●
更新が頻繁に行われるシステムでは効果がない(キャッシュヒッ
ト率70%以上を推奨)●

11

Copyright(c) 2015 SRA OSS, Inc. Japan

高可用性
●

自動フェイルオーバ
複数のPostgreSQLを用意しておき、1台のPostgreSQLがダウンしたら自動的に切り離して残りのPostgreSQLで運用を継続する●
フェイルオーバ時の挙動はユーザスクリプトで定義できる●●

watchdog

watchdog
pgpool-II自体を二重化する●
pgpool-HAよりも細かいコントロールが可能、追加ソフトが不要●

12

primaryDB

Copyright(c) 2015 SRA OSS, Inc. Japan

pgpool-II

pgpool-IIX

standby
DB2

standbyDB1

クラスタ管理
●

DBクラスタの運用を止めることなく新しいスタンバイサーバを追加できる(オンラインリカバリ)
スクリプトを定義しておくと、コマンド一発でプライマリサーバからスタンバイサーバにデータコピー、立ち上げまで行える●
新しいスタンバイサーバを追加する際にも利用できる●
新しいサーバは、新しいセッションから随時利用できる●

13

pgpool-II

primaryDB

Copyright(c) 2015 SRA OSS, Inc. Japan

standbyDB1
データコピー

新しくＤＢサーバを追加

NewStandbyクラスタとアプリケーションの親和性●

ストリーミングレプリケーションでは、スタンバイサーバに投げることのできるクエリに制限がある。以下のクエリは投げてはいけない
更新クエリ●
DBの追加削除●
ユーザの追加削除●
VACUU/REINDEX●LOCK文の一部●
一時テーブルを使うクエリ●
シリアライザブル隔離レベルの使用●などなど...
●

こうした考慮をアプリケーションで行うのは煩わしい●
pgpool-IIが自動的にプライマリとスタンバイにクエリをディスパッチ
●14

Copyright(c) 2015 SRA OSS, Inc. Japan

OLTPトランザクションの邪魔をせずに重い分析系のクエリを実行
重い分析
クエリを投げる
アプリ

通常のOLTPアプリ

pgpool-II

pgpool-IIがアプリケーション名を認識して、設定に応じて適切なDBサーバにクエリをディスパッチ

OLTP
トランザクション
重い分析クエリPrimary
DBStreaming
replication
15

StandbyDB
Copyright(c) 2015 SRA OSS, Inc. Japan

分析用
DB

pgpool-IIの今後●

次期バージョン3.5について性能改善●
watchdog機能の改善●
pcpコマンドのオーバホール●

引数の与え方の改善●
パスワードをコマンドラインで渡さなくても良いように●
複数ｐｃｐコマンドの同時実行●●●

パラレルクエリモードの廃止●●

たとえば時間のかかる ｐｃp_recovery_node の実行中に他のpcpコマンドを実行できるユーザが少なく、その割に維持が大変

リリースは2015年秋を予定
16

Copyright(c) 2015 SRA OSS, Inc. Japan性能改善
pgpool-IIを拡張プロトコル(Javaなどのpreparedstatementで使う)と遅い(最悪単純プロトコルの半分位のスピード)●
遅い主な原因は、pgpool-II での拡張プロトコルの処理の実装による●●●

ただし、pgpool-IIを使わなくてもPostgreSQLの拡張プ
ロトコルは単純プロトコルの8割くらいのスピードしか出ない

そもそも、拡張プロトコルはどのように処理されるのか？
17

Copyright(c) 2015 SRA OSS, Inc. Japan一部やり取りを省略しています
クライアントサーバ

クライアント

問い合わせ

結果

サーバ

クライアント

Parse

Parse

Bind

Sync

Execute

結果

Sync

Bind

サーバ

Sync
Syncで
結果転送要求結果

結果
ExecuteSync
結果

単純問い合わせ拡張問い合わせ18

Copyright(c) 2015 SRA OSS, Inc. Japan

拡張問い合わせ(pgpool-II使用時)

複数
PostgreSQLの状態を確認するためにSyncが必要
PostgreSQLとのやり取りが増えてしまうクライアント

サーバ

クライアント

Parse

サーバ

ParseSyncの発行回数が多いのが性能劣化の原因

Sync
結果

Bind
ExecuteBind
ストリーミングレプリケーション
では、Syncを省略できる場合がある

Sync
結果

Sync
結果

Execute
改良！
Sync
結果

拡張問い合わせ(pgpool-II使用時)

拡張問い合わせ(pgpool-II使用、改良後)
19

Copyright(c) 2015 SRA OSS, Inc. Japanpgbenchによる1秒あたりのSELECTクエリ数

性能比較

7,000
6,000
5,000
4,000
3,000
2,000
1,000
0

pgpool-II 3.4
20

pgpool-II 3.5

Copyright(c) 2015 SRA OSS, Inc. Japan

改良の結果、1.7倍に性能向上

将来の計画●

PostgreSQLの進化に対応
ロジカルレプリケーション●
BDR (Bi Directional Replication)●
パラレルクエリ●
どう対応するかは、PostgreSQLの機能を見極めてから●●ドキュメントのオーバーホール●

構成が今一つでわかりにくい–●

構成をPostgreSQLのマニュアルのような感じにしてはどうだろう？

ベタのHTMLで書いてあってメンテが困難
ツールを使ってベタHTMLから脱出– Sphinxはどうだろう？
–21

Copyright(c) 2015 SRA OSS, Inc. Japan

最後に開発に参加してくださる方を募集しています！
●
pgpool-IIの開発に参加するメリット●●

PostgreSQLよりは敷居が低い
規模は1/10位– それでいてSQLパーサや例外処理のような重要な部分がポートされているので、PostgreSQLの理解に役立つ–●

ネットワークプログラミングや、マルチプロセスプログラ
ミングの経験蓄積に最適

22

Copyright(c) 2015 SRA OSS, Inc. Japan