性能、信頼性を大幅に向上した
pgpool-II 最新バージョンについて

PostgreSQLカンファレンス2015
2015/11/27
SRA OSS, Inc. 日本支社
pgpool-II 開発者

長田 悠吾

自己紹介
●長田 悠吾（ナガタ ユウゴ）

– SRA OSS, Inc. 日本支社
– マーケティング部 OSS技術グループ– OSS の技術サポート– pgpool-II 開発者– PostgreSQL 関連の技術調査・開発

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

2

SRA OSS, Inc. 日本支社●

1999年よりPostgreSQLサポートを中心にOSSビジネスを開始●

PostgreSQL、Hinemos、Zabbix などのOSSサポート●

PowerGresファミリーの開発、販売●

トレーニング、導入、設計コンサルティングサービス

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

3

pgpool-II とは●

アプリケーションとPostgreSQLの間に入って、クラスタリング機能を提供するミドルウェア–●

アプリケーションからは普通のPostgreSQLに見える

オープンソースソフトウェア（BSDライセンス）

PostgreSQL– メジャーバージョンアップは年１回– 今年の冬に 3.5.0 がリリース予定

クエリ
●

多彩な機能
コネクションプーリング– 参照負荷分散– クエリキャッシュ– ヘルスチェック– 自動フェイルオーバ– オンラインリカバリ–クエリ

pgpool-II

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

4

PostgreSQLのクラスタ技術●

HAクラスタ– Pacemaker+DRBD、共有ストレージなどを利用– 待機側はサービス停止●

ストリーミングレプリケーション– PostgreSQL自体が持つ、非同期レプリケーション機能– プライマリ（更新可能） + 複数のスタンバイDB（検索のみ）– 簡単、確実、速い●

pgpool-II– クライアントとPostgreSQLの間に入ってレプリケーション機能を提供– コネクションプーリング、負荷分散、自動フェイルオーバなど他の機能もある●

Postgres-XC/XL– PostgreSQLを改造したクラスタシステム– 書き込み性能の負荷分散
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

5

PostgreSQLのストリーミングレプリケーション●

ストリーミングレプリケーション（PostgreSQL 9.0 ～）–マスタからスレーブにトランザクションログ（WAL）を転送することによりデータの複製を実現
スタンバイは参照クエリを受け付ける
ことができる （Hot Standby）

プライマリへは更新・参照の両方とも可能
更新クエリ
参照クエリ

クライアント

参照クエリ

WAL転送
プライマリ

WALを適用し続ける
スタンバイ

WAL 書き込み

WAL 書き込み

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

6

ストリーミングレプリケーションの課題
負荷分散はどうすればよい？
更新クエリ、参照クエリの振り分けは？
アプリケーションを書き換えなきゃだめ？

更新クエリ
参照クエリ

クライアント

参照クエリ
参照クエリ

プライマリ

レプリケーション
プライマリがダウンしたら更新ができなくなる？！
サービスが停止してしまう！？

DBサーバに障害が発生したら？
手動で対応するの？

スタンバイ

スタンバイ

新しいスタンバイの追加は？

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

7

pgpool-II の導入●●

アプリケーションからは１つのPostgreSQL のように見える

クライアント

クエリ振り分け
更新クエリ
参照クエリ

●

負荷分散

●

自動ファイルオーバ●・・・

pgpool-II
更新クエリ
参照クエリ

参照クエリ
参照
クエリ

プライマリ

レプリケーションスタンバイ

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

スタンバイ
8

参照負荷分散●

クエリの自動振り分け
更新クエリはプライマリサーバへ– 参照クエリはサーバ間で振り分け
–

更新・参照
プライマリ

レプリケーション

参照

更新・参照

pgpool-II

参照

振り分けの重みを指定可能
レプリケーション遅延が大きいサーバには振り分けない3.4.0 からはよりきめ細やかな振り分けが可能に！

スタンバイ

スタンバイ

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

9きめ細かな負荷分散（3.4～）●

アプリケーション名、DB名によって接続先が指定できる

重い検索

更新・参照

分析アプリケーション

プライマリ参照

更新・参照

Webアプリケーション

レプリケーション

pgpool-II

重い検索

スタンバイ

スタンバイ
（分析用）
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

10負荷分散の設定例# PostgreSQL のホスト名、ポート番号、ロードバランスの重みを設定
backend_hostname0 = 'host1'
backend_port0 = 5432
backend_weight0 = 1
backend_hostname1 = 'host2'
backend_port1 = 5432
backend_weight1 = 1
backend_hostname2 = 'host3'
backend_port2= 5432
backend_weight2 = 0# 接続アプリケーションによって、接続先DBを変更
app_name_redirect_preference_list = 'analyze_app:2'
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

11自動フェイルオーバ●

DBサーバの障害を自動検出（ヘルスチェック機能）–ダウンしたPostgreSQLを切り離す→ 負荷分散の対象から外れる
更新・参照
プライマリ

レプリケーション

参照

更新・参照

pgpool-II

スタンバイ
障害発生

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

12自動フェイルオーバ●

プライマリサーバに障害が発生した場合は？
–そのままでは更新ができなくなってしまう！

障害発生

更新・参照
プライマリ

レプリケーション

参照

更新・参照

pgpool-II

参照

スタンバイ

スタンバイ
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

13自動フェイルオーバ●

プライマリサーバに障害が発生した場合そのままでは更新ができなくなる– 負荷分散からの切り離し– スタンバイをプライマリに自動昇格
–

障害発生

更新・参照

更新・参照

pgpool-II

フェイルオーバ時に実行される具体的な処理はユーザがスクリプトで定義可能（サンプルあり）

参照

プライマリ

レプリケーションスタンバイ

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

14

オンラインリカバリ●ダウンしたスタンバイをプライマリに同期させる●

同期中も更新が可能

同期中
更新・参照

更新・参照

pgpool-II

参照

プライマリ

レプリケーションスタンバイ
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

15

オンラインリカバリ●ダウンしたスタンバイをプライマリに同期させる●

同期中も更新可能●

同期完了後、自動的に負荷分散参照

対象となるスタンバイ
更新・参照

更新・参照

レプリケーション

pgpool-II

オンラインリカバリ時の処理もスクリプトで定義（サンプルあり）

参照

プライマリ

スタンバイ

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

16

オンラインリカバリ●

新しいスタンバイサーバの追加–

pgpool-II に新しいサーバの情報を読み込ませてから、オンラインリカバリ– 同期完了後、負荷分散対象に
参照

同期中

スタンバイ
更新・参照

更新・参照

レプリケーション

pgpool-II

参照

プライマリ

スタンバイ
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

17

オンラインリカバリ●

スタンバイの増設も容易–

参照

検索性能のスケールアウト！
参照
スタンバイ
更新・参照

更新・参照

レプリケーション

pgpool-II

参照

プライマリ

スタンバイ
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

18

ここまでのまとめ●

参照性能の負荷分散
更新クエリと参照クエリの適切な振り分け– アプリケーション名やデータベース名での振り分け–●

自動フェイルオーバ
データベース障害の自動検出＆切り離し– プライマリがダウンしたら、スタンバイが新プライマリに昇格–●

オンラインリカバリサービスを停めずにダウンしたサーバを復帰– 新しいスタンバイの追加も簡単–

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

19

pgpool-II の単一障害点回避●もし、pgpool-II に障害が発生したら？！
–

単一障害点 (Single Point of Failure) ？
参照
プライマリ

障害発生

レプリケーション

更新・参照

更新・参照

pgpool-II

参照

スタンバイ

スタンバイ
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

20

watchdog●

pgpool-II 組み込みのHA機能–

pgpool-II を Active/Standby 構成にする–

仮想IPでpgpool-IIにアクセス
pgpool-II(Active)
更新・参照

更新・参照

プライマリ

レプリケーション

仮想IP
参照
相互監視
参照

pgpool-II(Standby)

スタンバイ

スタンバイ

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

21

watchdog●

Active pgpool-II に障害発生すると・・・–

Standby pgpool-II が Active に昇格–

仮想IPでの付け替えが行われる
pgpool-II(Down)

更新・参照

相互監視

仮想IP

pgpool-II(Active)

更新・参照

プライマリ

レプリケーション

参照
スタンバイ
参照

スタンバイ

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

22

インメモリクエリキャッシュ●

SELECTクエリの結果をメモリ内にキャッシュする機能
同じクエリが来たときに再利用する– DBへのアクセスが減り、応答速度が向上–

クエリ

pgpool-II
クエリ

結果

結果

キャッシュの保存/検索
memcached

PostgreSQL
メモリ

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

23

pgpool-II 機能まとめ●

性能向上
参照負荷分散– インメモリキャッシュ
–

●

信頼性向上
自動フェイルオーバ– Watchdog （= pgpool-II 自体の高可用化）–●

その他クラスタ管理などクエリの自動振り分け– オンラインリカバリ–

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

24

第一法規株式会社様 事例
●

●

●

●

大量の判例などを検索する
システム
PostgreSQLのストリーミン
グレプリケーション +pgpool-II で、負荷分散による性能向上、可用性向上
インメモリクエリキャッシュ機能を活用して検索性能を向上
一度発生したDB障害でもpgpool-II の自動フェイル
オーバ機能により、サービスは停止することなく継続できた。

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

25株式会社 Gengo様 事例●

翻訳サービスのクラウド
ソーシング企業●

AWS上でシステム構築●

３万トランザクション/日●●

同時にPostgreSQLのバージョンアップ。オンラインリカバリ機能を活用しダウンタイムを最小限に。
AWSによる強制インスタンス再起動メンテナンスも自動フェイルオーバ機能で乗り切った

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

26

pgpool-II 3.5.0●

12月にリリース予定

●

主な変更点
– 性能改善– watchdog 機能の改善– PostgreSQL 9.5 対応– その他

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

27

拡張問い合わせプロトコル性能改善（１）●

単純問い合わせクライアントサーバ●

拡張問い合わせクライアント

サーバ
●

問い合わせ

Parse

複数の段階に分けて処理
●
●

Bind

●

●

Execute

結果

SQLの解析
パラメータ値の結び付け
実行

Java アプリケーションのJDBC ドライバで使用されるSync
Syncで結果転送要求

結果

一部やり取りを省略しています
Copyright(c) 2015 SRA OSS, Inc. Japan28

拡張問い合わせプロトコル性能改善（2）クライアント●

今の pgpool-II は拡張問い合わせ使用時の性能が悪い●

最悪単純問い合わせ使用時の半分位の性能となってしまう
複数 PostgreSQLの状態を確認するためにFlush が必要●

性能劣化の原因●●

Flush の発行回数が多い
PostgreSQL との通信が増えてしまう

サーバ

Parse
Flush
結果
Bind
Flush
結果
ExecuteSync
結果

Copyright(c) 2015 SRA OSS, Inc. Japan

29

拡張問い合わせプロトコル性能改善（3）クライアントクライアント

サーバ

Parse

Parse
Flush
結果

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

Bind
Flush
結果

サーバ

Bind
Execute
Sync

改良！

結果

ExecuteSync
結果
一部やり取りを省略しています
Copyright(c) 2015 SRA OSS, Inc. Japan

30

拡張問い合わせプロトコル
性能改善の結果
pgpool-II 3.5

20% ～ 250%の性能向上！
pgpool-II 3.4

AWS m4.large instance
CentOS 6PostgreSQL 9.4 x2（streaming replication）
pgbench -S
クライアント数
Copyright(c) 2015 SRA OSS, Inc. Japan31

Thundering herd 問題への対応●

Thundering herd（獣群の暴走）問題とはあるイベントを待機している多数のプロセスが、イベントの発生により一度に起こされる– プロセスが起こされた後に、その後の処理を続けるプロセスが１つだけ決められる– 残りのプロセスは再び眠りにつく– 多くのプロセスが、一斉に目覚めては眠ることの繰り返し・・・–→ CPU 資源の無駄遣い！

Copyright(c) 2015 SRA OSS, Inc. Japan32

pgpoo-II の場合●起動時に fork した複数の子プロセスがクライアントの接続を待ち受けている–Thundering herd 問題が発生

１．接続待ち状態

2．接続発生Thundering herd!

pgpool-II の子プロセス達！！

Zzz..
Zzz..
Zzz..

Zzz..

！！

Zzz..

Zzz..

3．リクエスト処理開始

！！

！！
！！

Copyright(c) 2015 SRA OSS, Inc. Japan

Zzz..

Zzz..
Zzz..

33

pgpool-II 3.5 で解決●

接続待ち受けをシリアライズを有効にする新パラメータを追加–

serialize_accept = on–

Thundering herb 問題を回避

１．接続待ち状態

2．接続発生pgpool-II の子プロセス達

Zzz..

Zzz..

Zzz..
Zzz..

Zzz..

！！

Zzz..
Zzz..

3．リクエスト処理開始

Zzz..

Zzz..
Zzz..

Copyright(c) 2015 SRA OSS, Inc. Japan

Zzz..

Zzz..
Zzz..

34

Thundering herd 問題対応
性能改善の結果
pgpool-II 3.5

pgpool-II 3.4

クライアント数が子プロセス数より少ない
場合に、40%～150%の性能向上

Note PC with 16GB Mem,
CORE i7 x2, 512GB SSD
Ubuntu 14.04
PostgreSQL 9.4 x2(streaming replication)
pgbench -S -C -T 300

クライアント数
Copyright(c) 2015 SRA OSS, Inc. Japan35

Watchdog 機能の改善●

内部コードの改善

よりデバッグ、メンテナンス、機能拡張がしやすいコードへ●「状態マシン」モデルで全面的に書き換え●
スプリットブレイン対策––●●

Quorum のサポート

プロセス間通信方式の変更–

UNIXドメインソケット、JSON の採用–

外部ツールを使った死活監視

ノードの優先度– pgpool-II が「アクティブ」に選ばれる「優先度」を設定可

能Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

36

スプリットブレイン問題への対応●

スプリットブレイン問題–

ネットワークが分離された時に、どの pgpool-II がアクティブとなるべきか決められなくなる問題–Quorum （定足数）の充足を常に保証●

クラスタに参加している全ノードのうち半数以上が自分と同じネットワークに属しているかどうか、をチェックする

アクティブはこちらのグループから選出

pgpool-II

pgpool-II

pgpool-II

ネットワーク分断
pgpool-II

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

pgpool-II

37

プロセス間通信の改善●

watchdog 内部で行われる、プロセス間通信方式の変更–●

UNIX ドメインソケット & JSON 形式データ

これにより、外部のサードパーティツールとの連携が可能に–

外部ツールを使った死活監視モード（external）を追加

死活監視
プロセス

JSON

pgpool-II

pgpool-II

クラスタ管理プロセス

他 pgpoo-II

新バージョン

以前のバージョン

JSON

共有メモリ

変更

死活監視
プロセス

クラスタ管理プロセス
JSON

外部の死活監視ツール
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

38その他のWatchdog 機能改善●

ノードの優先度各ノードに異なる優先度を付与できる– wd_priority パラメータを追加––●

高い優先度のノードは、マスターに選ばれやすくなる

ノード間で設定パラメータの一貫性を検証–

pgpool-II 間で重要なパラメータの値に一貫性を持たせる–

設定ミスに起因する問題を軽減

Copyright(c) 2015 SRA OSS, Inc. Japan39

PostgreSQL 9.5 対応●

pgpool-II 3.5 では PostgreSQL 9.5 の SQL パーサを移植
pgpoo-II 3.5

PostgreSQL 9.5

移植
パーサ––パーサ

参照負荷分散、クエリキャッシュが、新しい SELECT 構文に対応●

GROUPING SET, CUBE, ROLLUP●TABLESAMPLE

レプリケーションモード時のクエリ書き換えが、新しいINSERT/UPDATE 構文に対応●

INSERT … ON CONFLICT●UPDATE tab SET (col1,col2,...) = (SELECT ...), ...
Copyright(c) 2015 SRA OSS, Inc. Japan40

その他の変更●

PCP コマンドの改善– 引数の与え方の改善： オプションとして指定可能に旧） $ pcp_node_info 0 localhost 9898 admin_user admin_pass 0新） $ pcp_node_info ­h localhost ­U admin_user 0– パスワードをコマンドラインで渡さなくても良いようになった●~/.pcppass ファイルに書いておけばよい– 複数ｐｃｐコマンドの同時実行●●

たとえば時間のかかる ｐｃp_recovery_node （オンラインリカバリ）の実行中に他のpcpコマンドを実行できる

パラレルクエリモードの廃止– ユーザが少なく、その割にメンテナンスの手間が大きかった
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

41

pgpool-II 3.5 まとめ●

性能改善– 拡張プロトコル使用時– Thundering herd 問題対応

●

信頼性向上
– Watchdog の改善– スプリットブレイン対策●

その他– PostgreSQL 9.5 コマンド, pcp コマンド, ・・・●

今年の冬（12/15）にリリース予定
現在、リリースに向けテスト中– alpha1 版が 11/16 にリリース済–

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

42

参考URL●●●

pgpool-II オフィシャルサイト
–http://www.pgpool.net/–

http://www.pgpool.net/jp/

SRA OSS, Inc. 日本支社–

セミナー資料、事例情報、技術情報–

http://www.pgecons.org/

Let's Postgres–

PostgreSQL 情報のポータルサイト–

http://lets.postgresql.jp/

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

43

ご静聴ありがとうございました！

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

44

付録

Copyright(c) 2015 SRA OSS, Inc. Japan45

ネイティブレプリケーション●

PostgreSQL のストリーミングレプリケーションを用いずに同期レプリケーションを実現するモード
PostgreSQL–

更新クエリを全てのDBに送信–

必要に応じて、クエリの書き換え●

now() などを含む更新クエリ

更新

更新

更新クエリ

同じ内容に保つ

更新
アプリケーション

pgpool-II

Copyright(c) 2015 SRA OSS, Inc. Japan46

Watchdog 改善：状態マシン●

watchdog のクラスタ管理を行うコア部分のコード–...

「状態マシン」モデルで全面的に書き換え
マスター
立候補

スタンバイ

マスター
選出

※ 実際の挙動とは異なる場合があります

ロスト...

●

初期化

抽象化

中間状態マスター...

...

コードが理解しやすく、デバッグが容易に → 保守性の向上– 将来の機能拡張が容易に → 拡張性の向上–Copyright(c) 2015 SRA OSS, Inc. Japan

47