pgpool-II 2.0について
SRA OSS, Inc. 日本支社
石井 達夫

pgpool-IIとは？
pgpool Global Development Groupが開発
BSDライセンスで配布される
多彩な機能
コネクションプーリング，レプリケーション，負荷分散，パラレルクエリ

設定が容易．GUI管理ツールも附属
PostgreSQLに手を入れていないので，バージョン追従が容易
使用言語を選ばない2

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

GUI管理ツール：pgpoolAdmin

3

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

pgpool-IIのアーキテクチャ

問合わせ

DBノード1

問合わせ
クライアント

pgpool-II

pgpool-HAを使うと，pgpool-II自体の二重化も可能
4

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

DBノード2

DBノード3

pgpool-IIの機能
コネクションプーリング
データベースへの接続オーバヘッドを軽減
PostgreSQLへのコネクションを保持しておき，再利用するWebシステムのように，頻繁に接続/切断を繰り返すシステムで効果あり

5

アプリケーション

pgpool-II

PostgreSQL

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

pgpool-IIの機能
レプリケーション
SQL文を複製してデータベースのコピーをリアルタイムに作る
片方のDBが障害を起しても自動的に切り離して運用を継続
障害復旧後は運用を停めずにDBを同期，復帰させることが可能（オンラインリカバリ）
オンラインリカバリの手法をユーザが選択可能なので，PITRを利用して高速リカバリ可能
6

アプリケーション

pgpool-II

PostgreSQL PostgreSQL

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

pgpool-IIの機能
負荷分散

アプリケーション

検索問合わせをランダムに決めたPostgreSQLに振り向ける
負荷をPostgreSQL間で分かち合うので，検索性能が向上
TPC-Cなどの，OLTP(On LineTransaction Processing)系の負荷に向いている7

pgpool-II

PostgreSQL PostgreSQL

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

pgpool-IIの機能
パラレルクエリ
データを分割してPostgreSQL
間で分担
検索問合わせを複数のPostgreSQLで一斉に実行，結果をpgpool-IIでまとめる問合わせを並列に処理するので高速
TPC-H/DBT-3などOLAP(OnLine Analitical Processing)系の負荷に最適

8

アプリケーション

pgpool-II

PostgreSQL PostgreSQL

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

pgppool-II 2.0
2007/11/16 2.0 リリース
その後マイナーバージョンアップして2.0.1がリリース済
 http://pgfoundry.org/frs/download.php/1521/pgpool-II-2.0.1.tar.gz

様々な改良を追加
レプリケーション
信頼性向上、高速化、オンラインリカバリ

パラレルクエリ
高速化

全般
他のシステムとの連携

9Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

レプリケーションの信頼性向上：
多数決方式の採用
アプリケーション

更新系
問合わせの結果チェック

pgpool-II

このサーバは結果が少数派なのでエラー！

PostgreSQL PostgreSQL PostgreSQL
結果=A
10

結果=A

結果=B?

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

レプリケーションの信頼性向上：
明示的なトランザクション発行
UPDATE SET a = a +1

DB2

DB1

内部ロック発行

内部ロックリリース
内部ロック発行

内部ロック発行

UPDATE SET a = a *2

UPDATE SET a = a *2

内部ロックリリース

内部ロックリリース
内部ロック発行ロックをリリースしているので，次のUPDATEが実行できてしまう

時間
11

UPDATE SET a = a +1
内部ロックリリース

ノード間で実行順が違う！
Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

レプリケーションの信頼性向上：
明示的なトランザクション発行
UPDATE SET a = a +1
DB2の処理が終わるまでロックを保持

DB2

DB1

トランザクション開始

トランザクション開始
UPDATE SET a = a +1
トランザクション終了

トランザクション終了
トランザクション開始
トランザクション開始
UPDATE SET a = a *2
UPDATE SET a = a *2
トランザクション終了
トランザクション終了

時間
明示的なトランザクションを使うことでノード間の実行順を保証
12

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

レプリケーションの信頼性向上：
更新行数の確認
pgpool-II 1.xでは更新の成功，失敗のみを判断
pgpool-II 2.0では，加えて更新件数もチェック件数が一致していない場合はエラー扱い
回復はオンラインリカバリで

13

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

レプリケーションの高速化
pgpool-II 1.xでは，更新性能はノード数に比例して低下
ノード数が2なら1/2，3なら1/3，4なら1/4...

pgpool-II 2.0では，更新
性能はノード数に関わらず1/2

更新性能の比較
121086

pgpool-II 1.x
pgpool-II 2.x
PostgreSQL

420
PostgreSQL

14

ノード数 2

ノード数 3Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

ノード数 4

pgbench によるベンチマーク結果

4ノードでのレプリケーション処理テスト

検索比率が60%越えるとpgpool-II が速い。
15Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

オンラインリカバリとは？
pgpoolを停止させずにデータを同期させてノードを復帰させる機能
pgpool-II 1.xは×すべてを停止させてデータを同期

pgpool-II 2.0は停止させずにデータを同期

pgpoolpgpool×

PostgreSQL

×PostgreSQL

データ同期
16

PostgreSQL

PostgreSQL

データ同期

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

オンラインリカバリの仕組み
2段階に分けてデータを同期
ファーストステージ
並行して DB の参照・更新が可能

セカンドステージ
すべての接続が終了するまで待機 接続リクエストをすべてブロック

リカバリ方法
ユーザ自身でどのようにリカバリするかを決めることができる
pgpool-IIのソースコードにサンプルスクリプトを同梱

17

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

オンラインリカバリの実行例
PITRを使ったオンラインリカバリ
差分バックアップにより、接続をブロックする時間を短時間にすることが可能ブロックする時間はpostmasterがアーカイブログからリカバリする時間

ファーストステージ
ベースバックアップを取得し、ダウンしたホストへコピー

セカンドステージ
SELECT pg_switch_xlog() を実行し、最新のWALログをアーカイブさせる

18

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

オンラインリカバリ設定
pcp.conf
pcp_recovery_node コマンドを使うので設定は必須

pgpool.conf
recovery_user
リカバリ中にPostgreSQL(template1データベース)へ接続するためのユーザ名

recovery_password
recovery_userのパスワード

recovery_1st_stage_command
ファーストステージで実行するコマンド
コマンドは$PGDATA以下におく必要がある(セキュリティ上の問題)

recovery_2nd_stage_command
セカンドステージで実行するコマンド
コマンドは$PGDATA以下におく必要がある(セキュリティ上の問題)

backend_data_directoryN(Nは数字)
データベースクラスタディレクトリ名

19

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

オンラインリカバリ実行方法
管理ツール上から実施

20

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

オンラインリカバリの応用
ノードの動的追加
 2.0 から pgpool.conf のリロードが可能
backend_* を追加し、オンラインカバリすることで負荷状況に応じてノードを追加ができる(スケールアップ)
リロードするとノードは「ダウン」状態で追加される

pgpool
稼動中にノードを追加

PostgreSQL
21

PostgreSQL

PostgreSQL

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

パラレルクエリとは？
複数のノードでリクエスト(SELECT)を処理
1つのテーブルを複数サーバに分割(テーブルパーティショニング)しておき、SELECTの結果をpgpool-IIでまとめることで、仮想的に1つのテーブルとして扱う
クライアント
pgpool-II
並列にSELECTが実行される

PostgreSQL
22

PostgreSQL

PostgreSQL

PostgreSQL

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

パラレルクエリの変更点
1.xの挙動すべてのテーブルを分割する必要がある
中間データが大きくなるのでJOINが遅い

2.0
レプリケーションテーブルとパーティショニングテー
ブルを混在させることが可能
クエリをより並列に動かすことが可能

23

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

pgpool-II 1.xの動作
123

中間データが大きくなってしまう！

取得したデータを結合

1357
2468

1357
ノード1のa24

13
2

2468
ノード2のa13
ノード1のb2 全体のデータを取得
ノード2のb

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

pgpool-II 2.0の動作
中間データが小さいので高速

123

結果をまとめるのみ

13252

1357

1232468123

ノード1のaノード1のbノード2のaノード2のbCopyright © 2007 SRA OSS, Inc. Japan All rights reserved.

DBT-3によるベンチマーク
PostgreSQLと３台並列処理の実行時間の比較

line_itemとordersをテーブル分割

単体実行時間/3台分散実行時間

7 PostgreSQL 3 ノード(3分割)
青線：パーティションテーブルとレプリケー
ションテーブルの結合
赤線：レプリケーションテーブル同士の結合
パラレルクエリの弱いクエリは未測定(13,15,17,20,22)

6

5

4

scale factor=103

インデックス含めてトータルで30GB
2

最大で6倍のパフォーマンス改善(クエリ9番)

101 2 3 4 5 6 7 8 9 10111213 141516 17181920 2122
Query番号26

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

他のシステムとの連携
failover_command
ノードを切り離した時に指定したコマンドを実行
Slony-I の連携やアラートメールを送ることが可能

failback_command
ノードを戻した時に指定したコマンドを実行

pgpool-IIから必要な情報を渡すことも可能(特殊文字を置換)%d： 対象ノード番号%h： 対象ノードのホスト名%p： 対象ノードのポート番号%D： 対象ノードのデータベースクラスタパス

27

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

クライアントの強制切断
client_idle_limit
クライアントからクエリが届くまでの最大待ち時間を指定可能
秒単位で指定TCPのタイムアウト待ち防止などに有効

28

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

pgpoolファミリの今後
pgpool-Iは今後pgpool-IIに移行してもらう
pgpool-II 1.xは今後メンテを終了予定
pgpool-II 2.xへ一本化
pgpool-HAはpgpool-IIでも利用可能

29

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

まとめ
pgpool-II 2.0の特長
レプリケーションの信頼性向上
更新処理の高速化(4ノードなら従来の2倍！)
オンラインリカバリ・ノード追加
部分レプリケーションによるパラレルクエリの高速化

SRA OSSでは，pgpool-IIの商用サポートを提供する予定です！

30

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

参考URL
pgpool-II 開発サイト

 http://pgfoundry.org/projects/pgpool/pgpool Wiki

 http://pgpool.sraoss.jp/

pgpoolメーリングリスト

 http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp

マイコミジャーナルでのpgpool-IIの解説記事

 http://journal.mycom.co.jp/articles/2007/11/08/pgpool/index.html

31

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.

pgpool-II デモシステムの構成
Apache 2.2.6
FireFox

PHP 5.2.4

pgpoolAdmin

PostgreSQL
8.2(5432)
pgpool-II(9999)
PostgreSQL
8.2(5433)

psql/pgbenchVine Linux 4.1CR
32

Copyright © 2007 SRA OSS, Inc. Japan All rights reserved.