pgpool-IIのご紹介
PostgreSQLで並列分散処理を実現するミドルウェア
日本PostgreSQLユーザ会/
SRA OSS Inc.
浅羽 義之
1

アジェンダ
1. 背景
2. pgpool-IIの紹介
3. 今後のロードマップ

2PostgreSQLとは？
y 信頼性が高く，高機能のオープンソースデータベース
y 小規模システムから大規模基幹システムまで幅広く活用できる
y ハードウェアの性能を生かした大量高速処理が可能
y 広く普及し，情報も豊富
y 最新版は8.2で、8.3が年内にリリースされる予定

3

PostgreSQL(RDBMS)に対する要求
y とにかくダウンタイムを減らしたい DBが止ってしまうと、サービス全体が止ってしまう！

y 最近、DBのレスポンスがよくない チューニングやハードウェアを補強したが効果なし

速くて信頼が求められる(厳しい要求)
4シングルサーバの限界
y CPU
 CPU追加によるスケールアップの限界

y メモリ
 搭載メモリ量の限界

y ディスク ハードウェア故障による可用性の低下

複数のマシンに仕事をさせればよい！
5クラスタリングとは？
y 複数台のシステムを使って1つのサービスを提供する仕組み
 ユーザから見れば、単体で動いているサービスなのかクラスタリングシステムなのかは見えない
クラアント

サーバ

クラスタを構成する要素をノードと呼ぶ

クラアント
サーバ

サーバ

サーバ

サーバ
6

冗長化とは？
y 1台異常が発生してもサービスを提供し続けることができる
 ユーザからは異常があったかどうかはわからない

サーバ

サーバ

サーバ

×

サーバ

サーバ

サーバ

サーバ

サーバ

7

高速化とは？
y 1つの仕事を複数のシステムが行う
 クラスタリングをすることで各ノードの仕事量は約1/N
 リクエストをロードバランサによって振り分ける方式
 1 つの仕事を複数ノードで処理する方式
クラアント

サーバ
負荷が集中

クラアント
サーバ

サーバ

サーバ

サーバ
8

負荷を分散

RDBMSのクラスタリング
y 冗長化
 共有ディスク方式
 ミラーリング(レプリケーション)方式

y 負荷分散 リクエストの振り分け
 リクエストの並列処理
注：PostgreSQL自体にクラスタリングの機能はないが、クラスタリングするためのミドルウェアがいくつかある(例：pgpool-II)9pgpool-IIの紹介

10pgpool,pgpool-IIとは？
y 2003年開発スタート(pgpool) 石井達夫氏が個人で開発
 最初はコネクションプーリング機能のみ(pgpoolという名前の由来はここからきている)
 SRA OSS, Inc. 日本支社で機能拡張(pgpool-II)y ライセンス BSDライセンス

y 現在の開発体制
 pgpool Global Development Groupという開発団体に移行
11pgpool構成図
y クライアントとPostgreSQLの間に入る(proxy)

PostgreSQL
接続

pgpoolPostgreSQL

pgpool自体を冗長化することも可能

PostgreSQL

12

pgpool-IIの機能
1. コネクションプーリング
2. 同期レプリケーション
3. クエリの負荷分散
4. パラレルクエリ
5. 管理ツールによるpgpool-IIの管理

13

コネクションプーリングの利点
y 接続オーバーヘッドの軽減
 PostgreSQLの接続処理の流れ

1. 接続

PostgreSQL
サーバ
データ

3. 認証
プロセスの生成やデータアクセスのための初期化処理は結構重い

2. プロセス生成 4. アクセスのための準備

バックエンドプロセス
14

コネクションプーリングの利点
y 接続オーバーヘッドの軽減
 pgpoolによるコネクションプールの接続処理の流れ
y クライアントとPostgreSQLの間にpgpoolが入る
y プロセス生成とディスクアクセスのための準備処理が省略可能

1. 接続・認証

pgpool
データ接続済バックエンドプロセス

15

レプリケーションの利点
y 信頼性向上 2台に更新系クエリを送信することで、データの同期を取る
y 異常が発生した場合にも運用が可能(縮退運転)
y 常に同期を取るため、通常より更新系クエリは時間がかかる
INSERT文

PostgreSQL

INSERT文

pgpoolINSERT文

PostgreSQL

16

レプリケーションの利点
y 信頼性向上 2台に更新系クエリを送信することで、データの同期を取る
y 異常が発生した場合にも運用が可能(縮退運転)
y 常に同期を取るため、通常より更新系クエリは時間がかかる

×

PostgreSQL
INSERT文

pgpoolINSERT文

異常発生！

PostgreSQL

17

レプリケーションの利点
y ロードバランス 同じデータを2台で持つので、検索についてはどちらかに問い合わせすればよいので、負荷分散が可能
 ロードバランス先の割合を指定可能
SELECT文

PostgreSQLSELECT文

pgpoolPostgreSQL

18

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

PostgreSQL

PostgreSQL

PostgreSQL

PostgreSQL
19

レプリケーション時の負荷分散(パラレルクエリとの違い)
y リクエストの振り分け
 ノードのどれかにリクエスト(RDBMSの場合はSELECT)を振る 処理は振られたノード内で完結
クライアント•ロードバランサが下のPostgreSQLのどれかにリクエストを転送

pgpoolPostgreSQL

PostgreSQL

PostgreSQL

PostgreSQL
20

パラレルクエリの処理(INSERT)y データを複数サーバに分散して配置
 複数のサーバに配置されたテーブルを仮想的に1つのテーブルとして扱う
 分散ルールはユーザが定義
分散ルールを格納 PostgreSQL

PostgreSQL

3. INSERT文

1. INSERT文

pgpoolPostgreSQL

2. 分散ルールから振り分け先を決定
21

PostgreSQL

パラレルクエリ(SELECT)y クエリの並列処理
 pgpoolが必要に応じてクエリを書き換え、ノードに送信 すべてのノードの結果をまとめて、クライアントに返す

PostgreSQL
2. SELECT文
1. SELECT文

pgpoolPostgreSQL

3. すべての結果をまとめる 2. SELECT文PostgreSQL

22

2. SELECT文パラレルクエリの利点・欠点
y 利点
 大容量のテーブルへの検索の高速化
y PostgreSQL単体の場合、I/Oの負荷がすべて集中する

y 欠点
 データ量が多くないとそれほど効果があがらない
y pgpoolで検索結果の統合やクエリの書き換え処理などを実行するため、一台で十分なパフォーマンスが出ている場合はpgpoolが入ることによりオーバヘッドが増える

23

pgpool-IIのパラレルクエリの効果•データ件数9000万件•データはpgbenchで作成•インデックス付検索

データ容量
テーブル：13GB

最大50倍(4ノードの場合)
24

pgpool-II管理ツール
y PHPによるWebベースの管理ツール
 設定ファイルの編集
 統計情報の表示
 ノード管理y ステータス表示y ノードの追加、切り離し

25

26

pgpool-HAy pgpoolの弱点
 pgpool自体が冗長化されていないため、pgpoolが落ちるとサービス停止(single point failure)y heartbeatによるpgpoolの監視 heartbeatが仮想IPを割り当てるため、クライアントは接続先を仮想IPにしておけばよい

pgpoolpgpoolアクティブスタンバイ

heartbeat監視

heartbeat27

制限事項
y オンラインリカバリができない
 CVSリポジトリにコミット済

y 一部のSQL(nowなど)には対応していないy パラレルクエリはJDBCなどで使う問い合わせには今のところ対応できない(プリペアードステートメント等)
28

オンラインリカバリデモ
pgpool-II

9999ポート

これを復帰させる

PostgreSQL
5432ポート×

PostgreSQL
5433ポート29ロードマップy pgpool-II 2.0
 2007年10月リリースを予定
 レプリケーションの高信頼化
 パラレルクエリの高速化 オンラインリカバリ実装
 その他制限事項の解除

30

pgpool-II参考URL
y pgpool,pgpool-II,pgpool-HA開発サイト
 http://pgfoundry.org/projects/pgpool

y pgpoolコミュニティサイト
 http://pgpool.sraoss.jp/

31

ご清聴ありがとうございました(http://www.sraoss.co.jp/ に資料を置く予定です)32レプリケーション時の注意
y ノードをまたいだデッドロック
 1つのノード内ではデッドロックが発生していないので、PostgreSQLでは検知不可
 pgpoolでは設定(replication_strict = true)で回避
y 片方のノードでロックを取れたのを確認してから、もう片方にクエリを送信
クライアント-1

クライアント-2
ロック獲得済ロック獲得待ちA

A
33

SERIAL型扱い時の注意
y INSERTにデフォルト値を使う時
 INSERTの順序がマスタとセカンダリでずれると、挿入されるデータが異なってしまう可能性がある
 pgpool.confのinsert_lock=trueにするか、/*INSERT LOCK*/というコメントをINSERTの前に付ける

INSERT INTO meibo(id, name)
VALUES (DEFAULT, 'y-asaba')

BEGIN;
LOCK TABLE meibo;
INSERT INTO meibo(id, name)
VALUES (DEFAULT, 'y-asaba');
COMMIT;
34