象の群れを飼い慣らす方法

PostgreSQL用クラスタリング技術の最新動向
SRA OSS, Inc. 日本支社
取締役支社長
石井 達夫

自己紹介
●

OSSの開発とビジネスに携わっています
PostgreSQLのコミッタ●
PostgreSQL用のクラスタソフト
pgpool-II の開発●●

OSSの普及活動も行っています●

オープンソースビジネス推進協議会–●

OSS全般の普及促進活動

PostgreSQLエンタープライズコ
ンソシアム–

PostgreSQLの技術的評価や普及促進活動

2Copyright(c) 2016 SRA OSS, Inc. Japan

SRA OSS, Inc.のご紹介●●

1999年よりPostgreSQLサポートを中心にOSSビジネスを開始、2005年に現在の形に至る
主なビジネス●

PostgreSQL, Hinemos, ZabbixなどのOSSのサポート、コンサルティング、導入構築●

Postgres Plusの販売●

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

PostgreSQL用の各種トレーニング

3Copyright(c) 2016 SRA OSS, Inc. Japan

PostgreSQLにおけるクラスタリングの目的●

可用性の向上(High Availability)●

もっとも古典的かつ基本的なリクエストダウンタイムの短縮– データ損失可能性の低減–●

性能の向上(Scale out)●

検索性能(read)の向上
ストリーミングレプリケーションによる検索負荷分散– postgres_fdwによる分散処理– Postgres-XC/XL/X2–●

更新性能(write)の向上–

Postgres-XC/XL/X2

4

Copyright(c) 2016 SRA OSS, Inc. Japan可用性向上のためのクラスタ技術：
アクティブ・スタンバイ方式
Pacemakerなどの汎用HAソフトを使って複数のPostgreSQLを管理●
ＤＢの入ったディスク装置を共有する共有ディスク方式と、共有しない方式がある●
性能は向上しない●
アプリケーションの修正は必要ない●●

フェイルオーバ中はセッションが切断されるのでその対応は必要

5

仮想IPの切換

フェイルオーバX

Copyright(c) 2016 SRA OSS, Inc. Japan

データの共有またはコピー可用性向上のためのクラスタ技術：
ストリーミングレプリケーション(1)PostgreSQL組み込みのレプリケーション技術である「ストリーミングレプリケーション」を利用●
プライマリからスタンバイへトランザクションログを転送してデータをコピーする●
書き込み性能は向上しないが、複数のPostgreSQLで読み出し負荷を共有して性能を向上させることも可能●
アプリケーションの修正は必要●

フェイルオーバ中はセッションが切断されるのでその対応は必要●
書き込み処理はプライマリにしか投げてはいけない（そのほか、ある種のロックはプライマリだけに投げるなどの考慮が必要)

フェイルオーバ●●

これらの対応が困難な場合には、すべてのＤＢ処理をプライマリにのみ投げる（その場合でもフェイルオーバへの対応は必要）

6X
WALの転送によるコピー

Copyright(c) 2016 SRA OSS, Inc. Japan可用性向上のためのクラスタ技術：
ストリーミングレプリケーション(2)●プライマリが故障した時に、どのスタンバイを昇格させるか決めておく必要がある(スタンバイの数が2以上の場合)
同期レプリケーションを使っている場合は、同期スタンバイを昇格させる●
非同期レプリケーションを使っている場合は、固定ルールで昇格するス
タンバイを決めておく方式と、動的に決める(最も遅延が少ないものを選ぶ、など)方式がある
●

X?

?

?

プライマリ

スタンバイ1

スタンバイ2

スタンバイ37

Copyright(c) 2016 SRA OSS, Inc. Japan

性能向上のためのクラスタ技術：
ストリーミングレプリケーション(3)●スタンバイサーバを複数設けて検索性能を向上させる（負荷分散)
一つのSQLが分散処理されるわけではないので、多数のセッションが同時に実行されるような環境で効果が上がる●
プライマリサーバが過負荷のときに、プライマリに検索処理をさせないようにするのも効果がある●
どのセッションがどのスタンバイサーバに接続するかを決める必要がある●

アプリケーションで行う（アプリケーションの改造が必要）– ミドルウェアで透過的に実施(pgpool-IIなど)–8Copyright(c) 2016 SRA OSS, Inc. Japan可用性向上のためのクラスタ技術：
postgres_fdw(1)あるPostgreSQLから別のPostgreSQLに接続、クエリを実行する拡張機能●
外部データラッパのフレー
ムワークを使っている●“CREATE FOREIGNTABLE”文を使って、リモー
トのPostgreSQLにあるテーブルをあたかもローカルのテーブルであるかのように扱うことができる●

9

リモートのPostgreSQL

libpq

Copyright(c) 2016 SRA OSS, Inc. Japan

性能向上のためのクラスタ技術：
postgres_fdw(2)●外部テーブルへのSELET, UPDATE, DELETE, INSERが可能●●

外部テーブルへのアクセスは、常にREPEATABE READ分離レベルのトランザクションの内側で実行されるので、ローカルのトランザクションもREPEATABE READもしくはSERIALIZABLEで実行するのが良い

大きなテーブルを複数のサーバに分けて性能向上を狙う、などの用途が考えられる
PostgreSQL 9.5からは、継承を使ったパーティショニングに外部テーブルが利用可能になった●
ただし、外部テーブルへのアクセスが並列に行われるわけではない●

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

性能向上のためのクラスタ技術：
postgres_fdw(3)●外部テーブルへのアクセスの最適化は、通常のオプティマイ
ザのへpostgres_fdwが提供するフックが組み込まれることで行われる●

WHERE/JOIN push down–

(外部テーブルの結合の際に、)WHERE句を外部サーバに送って実行し、その結果だけを転送することによってデータ量を減らす

処理に必要なカラムだけを転送することによってデータ量を減らす●
集約(countやsumなど)は最適化されない●●

外部テーブルの統計情報の取得方法を選択可能
都度EXPLAINを外部テーブルで実施する●
ANALYZEした結果をローカルに保存しておく●

11

Copyright(c) 2016 SRA OSS, Inc. Japan

性能向上のためのクラスタ技術：
postgres_fdw(4)
現状はまだ分散トランザクション機能を提供しているに過ぎず、性能向上のための工夫はユーザに任されている●
外部テーブルの今後●

外部テーブルを使って性能向上のための本格的なクラスタを作ろうと考えている開発者がいる●
多くの機能拡張が必要になる●集約関数のリモート実行– 並列処理– 複数サーバにまたがる読み取り一貫性の実現– 並列処理用のオプティマイザ–●

現状は一部の最適化がpostgres_fdwの中で行われているに過ぎない

12

Copyright(c) 2016 SRA OSS, Inc. Japan

性能向上のためのクラスタ技術：
Postgres-XC(1)
クラスタ全体のトランザクション管理
Global Transaction
Manager (GTM)

クライアントからの問い合わを受付、データノードに配信。結果を取りまとめて返却
コーディネータ

コーディネータ

コーディネータ

データノード

データノード

データノード

実際の問い合わせ処理を実行
13

Copyright(c) 2016 SRA OSS, Inc. Japan

性能向上のためのクラスタ技術：
Postgres-XC(2)
データノード間で並列に問い合わせが実行可能●
データをデータノードに分散（シャーディング）可能
なので、検索性能のみならず、更新性能も向上●
更新遅延がなく、ノード間の読み取り一貫性も保証されている●
可用性は向上しない(むしろ低下する)●●

データノードのレプリケーションで対応

14

Copyright(c) 2016 SRA OSS, Inc. Japan

性能向上のためのクラスタ技術：
Postgres-XC(3)PostgreSQLからのフォークであり、PostgreSQLへ追従するのが大変(2016/2現在、PostgreSQL 9.3相当)●
一部の問い合わせは処理できない●
なかなかPostgres-XCが安定しなかったため、更にフォークを産んだ●●

Postgres-XL

最近Postgres-XCはPostgres-X2と名前を変えた●
Postgres-XLなどとの統合の動きもある●

15

Copyright(c) 2016 SRA OSS, Inc. Japan

各種クラスタ技術のまとめ
更新性能 アプリPostgre向上
ケーショ SQL変ン変更度 更必要合い

可用性向
上

検索性
能向上

Pacemaker

○Ｘ

Ｘ

○○

○

Streaming
replication

○

○Ｘ

Ｘ

○

○

Postgres_FDWＸ

▲

▲

○

○

○

Postgres-XC

Ｘ

▲

○Ｘ

Ｘ

Ｘ

○：寄与する
Ｘ：寄与しない▲：制限事項あり／工夫すれば寄与できる

16

Copyright(c) 2016 SRA OSS, Inc. Japan

実用性・実
績

Pgpool-IIのご紹介と使いどころ

17

Copyright(c) 2016 SRA OSS, Inc. Japan

PostgreSQLの群れ
象はパワフル●
象が群れになればもっとパワフル！
●
でも群れになれば管理が大変なのでは？
●

18

Copyright(c) 2016 SRA OSS, Inc. Japan

「象の群れ管理問題」の一例
群れにはリーダが必要です(プライマリサーバ)●
もしリーダが引退したら、新しいリーダを立てなければならない(フェイルオーバ、昇格)●
その際、他の象は新しいリーダに追従しなければならない●
リーダ以外の象は、働けなくなったら引退する（スタンバイのフェイルオーバ）●
新しい象が群れに加わるときはスムーズに行われなければならないI●
群れの象はお互いに助けあわなければならない (負荷分散)●
リーダにしかできない仕事がある (更新クエリ)●

19

Copyright(c) 2016 SRA OSS, Inc. Japanpgpool-IIで「象の群れ管理問題」を解決
pgpool-IIを使うことにより、象の群れは単独の象のように見える●
ユーザ定義のフェイルオーバスクリ
プトにより、フェイルオーバ時にどのスタンバイが昇格するかのポリシーを決められる●「フォローマスターコマンド」で新しいプライマリへの自動追従も可能●
スタンバイがダウンしたら、自動的に群れからそのスタンバイは外されるので、クラスタとしての運用を継続できる●クエリが検索クエリなら、負荷分散の対象となる●クエリが更新クエリなら、プライマリ
サーバに送るI 20
Copyright(c) 2016 SRA OSS, Inc. Japan●pgpool-II

象の群れは単独の象のように見えるクエリのディスパッチ/ルーテイング
既存のＤＢアプリケーションの変更は最小限

参照または更新
クエリ

参照／更新
クエリ

参照クエリ

プライマリ

スタンバイ

スタンバイ
21

スタンバイ
Copyright(c) 2016 SRA OSS, Inc. Japan

負荷分散
参照クエリ
プライマリは更新処理に専念する

参照クエリのうち0%
参照クエリのうち
30 %

参照クエリのうち
40 %

プライマリ
スタンバイ

スタンバイ
22

アプリケーション名やデータベース名で分散させることも可能

参照クエリのうち
30 %スタンバイ
Copyright(c) 2016 SRA OSS, Inc. Japanスタンバイサーバがダウンした時スタンバイサーバがダウンしたら、pgpool-IIがそのことを検知し、クラスタリングの対象から取り除く
既存のセッションは再接続が必要

プライマリ

スタンバイ
23

X
Copyright(c) 2016 SRA OSS, Inc. Japanプライマリサーバがダウンした時

プライマリ

X

スタンバイ
24

プライマリがダウンすると、スタンバイの一つが昇格し、新しいプライマリになる

他のスタンバイは新しいスタンバイに追従するようになる
Copyright(c) 2015 SRA OSS, Inc. Japan新しいスタンバイの追加

新しい象！
新しいサーバは簡単に追加できる。
pgpool-IIは新しいサーバにプライマリからデータをコピーし、他のサーバに影響を与えずにクラスタに新しいサーバを追加できる。
既存のセッションは切断されない。

プライマリ

スタンバイ
25

Copyright(c) 2016 SRA OSS, Inc. Japan

Watchdog: pgpool-II組み込みの高可用性機能

X

アクティブpgpool

プライマリ

昇格

スタンバイpgpool

アクティブpgpool-IIがダウンすると,スタンバイpgpool-IIが昇格する

スタンバイ
26

Copyright(c) 2016 SRA OSS, Inc. Japanインメモリクエリキャッシュ
Pgpool-IIはクエリキャッシュを使ってクエリの結果を再利用する●
クエリキャッシュはメモリ上に置かれるので非常に高速●
その際にPostgreSQLアクセスは一切なし●
キャッシュ用のストレージは、共有メモリ火memcachedから選べる●
テーブルが更新されると、そのテーブルを参照したクエリキャッシュはすべて廃棄される●
タイムアウトベースのキャッシュ更新も可能●

27

Copyright(c) 2016 SRA OSS, Inc. Japan

クエリ
キャッシュ

PostgreSＱＬへのアクセスなし！

コミュニティサポートポリシー●

PostgreSQLと同様メジャーリリースとマイナーリリースがある●

3.x.y – x:vメジャーバージョン, y: マイナーバージョン–“3.4.2”: “3.4” がメジャーバージョンで, “2”がマイナーバージョン

年に一度のメジャーバージョン●
年に3-4回のマイナーリリース●
マイナーリリース間では互換性が保たれる●
メジャーバージョン間では互換性は保証されない●●

最初のリリースから5年間バックパッチ(保守)を行う●●

つまり、常に5-6個のバージョンを保守している

5年以上のサポートが必要ならば、弊社にご相談ください28

Copyright(c) 2016 SRA OSS, Inc. Japan

最新バージョン：pgpool-II 3.5が1月にリリースされました！
性能改善●
watchdogの改善●
PostgreSQL 9.5対応●
pcpコマンドの改善
●など
●

29

Copyright(c) 2016 SRA OSS, Inc. Japan

性能改善

30

Copyright(c) 2016 SRA OSS, Inc. Japan

拡張プロトコルでの性能改善
従来pgpool-IIで拡張プロトコル(Javaなどが利用)が非常に遅かった（大体拡張プロトコルでない場合の半分)●
問題は実装にあり: ネットワーク転送のオーバヘッ
ドが大きかった●
まずは「拡張プロトコル」とは何かから説明します●

31

Copyright(c) 2016 SRA OSS, Inc. Japan

Some details are omitted
ClientServerClientquery

result“Sync”
requestssend
the result
from server

ServerClientServer

Parse

Parse

Bind

Flush

ExecuteResult

Sync

Bind

Flush is needed
to handle
multiple
PostgreSQL

Flush
resultresultExecuteSync
resultsimple protocol

extended protocol
32

Copyright(c) 2016 SRA OSS, Inc. Japan

extended protocol
with pgpool-II

more traffic

Client

ServerClientParse

ServerParse

Sync

Too many Flushmessages

Result

Bind
ExecuteBind
In streaming replication
we could omit some ofFlush messages

Flushresultsync
resultExecuteenhanced!
Sync
resultextended protocol
with pgpool-II
33

extended protocol
with pgpool-II in 3.5
Copyright(c) 2016 SRA OSS, Inc. Japan拡張プロトコルでのベンチマーク結果
12,000pgpool-II 3.5は20% から250%
pgpool-II 3.4
より高速！

10,000

TPS

8,000

6,000

pgpool-II 3.5
pgpool-II 3.4

4,000

2,00001248163264128256

Number of clients

34

Copyright(c) 2016 SRA OSS, Inc. JapanAWS m4.large instance
CentOS 6
PostgreSQL 9.4 x2(streaming replication)
pgbench -S

「Thundering herd」問題への対応（１）
pgpool-II childpgpool-II childpgpool-II childsleeping

sleeping

sleeping

pgpool-II childpgpool-II childpgpool-II childawake

awakeawake

pgpool-II childpgpool-II childpgpool-II childsleeping

processing

sleeping

pgpool-II 3.4

35

Copyright(c) 2016 SRA OSS, Inc. Japan

ThunderingHerd!

「Thundering herd」問題への対応（２）
pgpool-II childpgpool-II childpgpool-II childsleeping

sleeping

sleeping

pgpool-II childpgpool-II childpgpool-II childsleeping

awake

sleeping

pgpool-II 3.5

36pgpool-II childpgpool-II childpgpool-II childsleeping

processing

sleeping

Copyright(c) 2016 SRA OSS, Inc. JapanNo thundering
Herd problem

「Thundering herd」問題への対応
（3）
3,000

同時接続数がpgpoolの子プロセスよりも少ない場合
pgpool-II 3.5は40%から150%
pgpool-II 3.4よりも高速

2,500

TPS

2,000

1,500

PostgreSQL
pgpool-II 3.5
pgpool-II 3.4

1,000

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

50001248163264128

256398

Number of clients37

Copyright(c) 2016 SRA OSS, Inc. Japanwatchdogの改善

38

Copyright(c) 2016 SRA OSS, Inc. Japan“Watchdog”とは?
pgpool-IIはproxyとして動くので, pgpool-II 自身が “Singlepoint of failure” (SPOF)になり得る●“Watchdog”はpgpool-IIの組み込みHA機能●
2つ以上のpgpool-IIインスタンスがお互いに監視し合い、アクティ
ブpgpool-IIがダウンしたら、スタンバイpgpool-IIが取って代わる●
pgpool-IIへのアクセスは仮想IP経由でActive pgpool-IIへアクセス。常に同じIPが使える●39

VIP
ActiveStandby

pgpool-II

pgpool-II

PostgreSQL

PostgreSQL

Copyright(c) 2016 SRA OSS, Inc. Japanスプリットブレイン問題への対応改良●

スプリットブレイン問題とは●●ネットワークが分離した時に、昇格すべきpgpool-IIが決まらない
Quorum （定足数）の利用
自分のネットワークに所属するpgpool-IIの数が定足数に達していれば、その中からマスタpgpool-IIを選ぶ– pgpool-IIインスタンスの数は、3以上かつ奇数でなければならない–

Master is elected fromthis grouppgpool-II

pgpool-II

pgpool-IInetworkpartitioning
pgpool-II

40

Copyright(c) 2016 SRA OSS, Inc. Japan

pgpool-II

プロセス間通信の改良●

UNIX domain socketとJSONフォーマットの利用●

サードパーティがLife checkを独自に実装することも可能

previous

New version

pgpool-II

other pgpoo-II

pgpool-II
JSON

Cluster mgr

Life-check

JSON

Cluster mgr
Packet recv
Sharedmemorychangelifecheck
Packet send

3rd party tool41

Copyright(c) 2016 SRA OSS, Inc. Japan

PostgreSQL 9.5対応

42

Copyright(c) 2016 SRA OSS, Inc. Japan

Importing PostgreSQL 9.5 parser●●●

pgpool-IIのパーサがPostgreSQL 9.5から移植された(以前は9.4)
負荷分散とクエリキャッシュが以下の構文をサポート●

GROUPING SET, CUBE, ROLLUP,●TABLESAMPLE

ネィティブレプリケーションモードが新しい構文をサポート●

INSERT … ON CONFLICT●UPDATE tab SET (col1,col2,...) = (SELECT ...), ...

43

Copyright(c) 2016 SRA OSS, Inc. Japanpgpool-II 3.5その他の改良

44

Copyright(c) 2016 SRA OSS, Inc. Japanヘルスチェックとレプリケーション遅延のチェック対象データベースが指定可能に
Herokuなど、 “postgres” or “template1” データベースへの接続を認めないシステムへの対応●
ヘルスチェック●●●

レプリケーション遅延チェック●●

ＤＢの死活監視
ストリーミングレプリケーションにおいて、遅延が一定以上になるとそのスタンバイサーバにクエリを送らない

新しい設定項目
health_check_database●sr_check_database●45

Copyright(c) 2016 SRA OSS, Inc. Japan

PCPコマンドの改良●“PCP”コマンドとは“Pgpool Control Protocol”●
一群のpgpool-II管理コマンド●

PostgreSQLサーバのpgpool-IIへのアタッチ、デタッチ– on-lineリカバリ– pgpool-IIから様々な情報の取得–●

多くの問題点に対応
単一セッションでしか使えない●
引数指定が不便●パスワードをコマンド引数で渡す必要がある●

46

Copyright(c) 2016 SRA OSS, Inc. Japan

SELECT発行数の表示●“show pool_nodes”で各ＤＢに発行されたSELECTの数を表示
New!
test=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
| select_cnt---------+----------+-------+--------+-----------+---------+-----------0| /tmp
| 11002 | 2| 0.500000 | primary | 338230
1| /tmp| 11003 | 2| 0.500000 | standby | 163939(2 rows)

47

Copyright(c) 2016 SRA OSS, Inc. Japan中国語ドキュメント
Pgpool-II ドキュメント本体●
pgpoolAdminメッセージカタログ●

48

Copyright(c) 2016 SRA OSS, Inc. Japan注意!
●“パラレルモード” は削除されました
制限事項が多すぎ●ユーザが少ない●
コードが複雑●49

Copyright(c) 2016 SRA OSS, Inc. Japan今後の計画●

Pgpool-II 3.6を今年の終わり頃にリリース予定安定性の向上、使い勝手の向上を目指す●
現在何をやるかを議論中●

テストケースの追加– SETコマンドの実装– ドキュメントの改善(SGML?)– フェイルオーバ時のセッション切断を最小限に–

50

Copyright(c) 2016 SRA OSS, Inc. Japan

各種クラスタ技術のまとめ
可用性向上

検索性能向上更新性能 アプリ
Postgre 実用性・実向上
ケーショ SQL変績
ン変更度 更必要合い

Pacemaker

○

Ｘ

Ｘ

○

○

○

Streaming
replication

○

○

Ｘ

Ｘ

○

○

Postgres_FDW

Ｘ

▲

▲

○

○

○

Postgres-XC

Ｘ

▲

○

Ｘ

Ｘ

Ｘ

pgpool-II

○

○

Ｘ

○

○

○

○：寄与する
Ｘ：寄与しない▲：制限事項あり／工夫すれば寄与できる
51

Copyright(c) 2016 SRA OSS, Inc. JapanURLなど●pgpool-II公式サイト●●

Postgres-X2●●

http://www.pgpool.net
https://github.com/postgres-x2

SRA OSS●

http://www.sraoss.co.jp

52

Copyright(c) 2016 SRA OSS, Inc. JapanThank you!

53

Copyright(c) 2016 SRA OSS, Inc. Japan