pgpool-ii 2.0について SRA OSS, Inc. 日 本 支 社 石 井 達 夫
pgpool-iiとは? pgpool Global Development Groupが 開 発 BSDライセンスで 配 布 される 多 彩 な 機 能 コネクションプーリング,レプリケーション, 負 荷 分 散, パラレルクエリ 設 定 が 容 易.GUI 管 理 ツールも 附 属 PostgreSQLに 手 を 入 れていないので,バージョン 追 従 が 容 易 使 用 言 語 を 選 ばない 2
GUI 管 理 ツール:pgpoolAdmin 3
pgpool-iiのアーキテクチャ 問 合 わせ 問 合 わせ DBノード1 クライアント pgpool-ii DBノード2 pgpool-haを 使 うと,pgpool-II 自 体 の 二 重 化 も 可 能 DBノード3 4
pgpool-iiの 機 能 コネクションプーリング データベースへの 接 続 オーバヘッドを 軽 減 PostgreSQLへのコネク ションを 保 持 しておき, 再 利 用 する Webシステムのように, 頻 繁 に 接 続 / 切 断 を 繰 り 返 すシステムで 効 果 あ り アプリケーション pgpool-ii PostgreSQL 5
pgpool-iiの 機 能 レプリケーション SQL 文 を 複 製 してデータベー スのコピーをリアルタイムに 作 る 片 方 のDBが 障 害 を 起 しても 自 動 的 に 切 り 離 して 運 用 を 継 続 障 害 復 旧 後 は 運 用 を 停 めず にDBを 同 期, 復 帰 させること が 可 能 (オンラインリカバリ) オンラインリカバリの 手 法 をユーザが 選 択 可 能 なので,PITRを 利 用 して 高 速 リカバリ 可 能 アプリケーション pgpool-ii PostgreSQL PostgreSQL 6
pgpool-iiの 機 能 負 荷 分 散 検 索 問 合 わせをランダ ムに 決 めたPostgreSQL に 振 り 向 ける 負 荷 をPostgreSQL 間 で 分 かち 合 うので, 検 索 性 能 が 向 上 TPC-Cなどの, OLTP(On Line Transaction Processing) 系 の 負 荷 に 向 いている アプリケーション pgpool-ii PostgreSQL PostgreSQL 7
pgpool-iiの 機 能 パラレルクエリ データを 分 割 してPostgreSQL 間 で 分 担 検 索 問 合 わせを 複 数 の PostgreSQLで 一 斉 に 実 行, 結 果 をpgpool-IIでまとめる 問 合 わせを 並 列 に 処 理 する ので 高 速 TPC-H/DBT-3などOLAP(On Line Analitical Processing) 系 の 負 荷 に 最 適 アプリケーション pgpool-ii PostgreSQL PostgreSQL 8
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 様 々な 改 良 を 追 加 レプリケーション 信 頼 性 向 上 高 速 化 オンラインリカバリ パラレルクエリ 高 速 化 全 般 他 のシステムとの 連 携 9
レプリケーションの 信 頼 性 向 上 : 多 数 決 方 式 の 採 用 アプリケーション 更 新 系 問 合 わせの 結 果 チェック pgpool-ii このサーバは 結 果 が 少 数 派 なので エラー! PostgreSQL PostgreSQL PostgreSQL 結 果 =A 結 果 =A 結 果 =B? 10
レプリケーションの 信 頼 性 向 上 : 明 示 的 なトランザクション 発 行 DB1 内 部 ロック 発 行 UPDATE SET a = a +1 内 部 ロックリリース DB2 内 部 ロック 発 行 内 部 ロック 発 行 UPDATE SET a = a *2 内 部 ロックリリース UPDATE SET a = a *2 内 部 ロックリリース 時 間 11 ロックをリリース しているので, 次 のUPDATEが 実 行 できてしまう ノード 間 で 実 行 順 が 違 う! 内 部 ロック 発 行 UPDATE SET a = a +1 内 部 ロックリリース
レプリケーションの 信 頼 性 向 上 : 明 示 的 なトランザクション 発 行 DB1 トランザクション 開 始 UPDATE SET a = a +1 DB2 トランザクション 開 始 DB2の 処 理 が 終 わる までロックを 保 持 UPDATE SET a = a +1 トランザクション 終 了 トランザクション 終 了 トランザクション 開 始 UPDATE SET a = a *2 トランザクション 開 始 UPDATE SET a = a *2 トランザクション 終 了 時 間 明 示 的 なトランザクションを 使 うことでノード 間 の 実 行 順 を 保 証 12 トランザクション 終 了
レプリケーションの 信 頼 性 向 上 : 更 新 行 数 の 確 認 pgpool-ii 1.xでは 更 新 の 成 功, 失 敗 のみを 判 断 pgpool-ii 2.0では, 加 えて 更 新 件 数 もチェック 件 数 が 一 致 していない 場 合 はエラー 扱 い 回 復 はオンラインリカバリで 13
レプリケーションの 高 速 化 pgpool-ii 1.xでは, 更 新 性 能 はノード 数 に 比 例 して 低 下 ノード 数 が2なら1/2,3な ら1/3,4なら1/4... pgpool-ii 2.0では, 更 新 性 能 はノード 数 に 関 わ らず1/2 12 10 8 6 4 更 新 性 能 の 比 較 pgpool-ii 1.x pgpool-ii 2.x PostgreSQL 2 0 PostgreSQL ノード 数 2 ノード 数 3 ノード 数 4 14
pgbench によるベンチマーク 結 果 4ノードでの レプリケーション 処 理 テスト 検 索 比 率 が60% 越 えると pgpool-ii が 速 い 15
オンラインリカバリとは? pgpoolを 停 止 させずにデータを 同 期 させてノード を 復 帰 させる 機 能 pgpool pgpool-ii 1.xは すべてを 停 止 させて データを 同 期 pgpool-ii 2.0は 停 止 させずに データを 同 期 pgpool PostgreSQL PostgreSQL PostgreSQL PostgreSQL データ 同 期 データ 同 期 16
オンラインリカバリの 仕 組 み 2 段 階 に 分 けてデータを 同 期 ファーストステージ 並 行 して DB の 参 照 更 新 が 可 能 セカンドステージ すべての 接 続 が 終 了 するまで 待 機 接 続 リクエストをすべてブロック リカバリ 方 法 ユーザ 自 身 でどのようにリカバリするかを 決 めることができる pgpool-iiのソースコードにサンプルスクリプトを 同 梱 17
オンラインリカバリの 実 行 例 PITRを 使 ったオンラインリカバリ 差 分 バックアップにより 接 続 をブロックする 時 間 を 短 時 間 にすることが 可 能 ブロックする 時 間 はpostmasterがアーカイブログからリカバリする 時 間 ファーストステージ ベースバックアップを 取 得 し ダウンしたホストへコピー セカンドステージ SELECT pg_switch_xlog() を 実 行 し 最 新 のWALログをアーカイブさせる 18
オンラインリカバリ 設 定 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
オンラインリカバリ 実 行 方 法 管 理 ツール 上 から 実 施 20
オンラインリカバリの 応 用 ノードの 動 的 追 加 2.0 から pgpool.conf のリロードが 可 能 backend_* を 追 加 し オンラインカバリすることで 負 荷 状 況 に 応 じてノードを 追 加 ができる(スケールアッ プ) リロードするとノードは ダウン 状 態 で 追 加 される PostgreSQL pgpool PostgreSQL 稼 動 中 にノードを 追 加 PostgreSQL 21
パラレルクエリとは? 複 数 のノードでリクエスト(SELECT)を 処 理 1つのテーブルを 複 数 サーバに 分 割 (テーブルパー ティショニング)しておき SELECTの 結 果 をpgpool-II でまとめることで 仮 想 的 に1つのテーブルとして 扱 う クライアント pgpool-ii 並 列 にSELECTが 実 行 される PostgreSQL PostgreSQL PostgreSQL PostgreSQL 22
パラレルクエリの 変 更 点 1.xの 挙 動 すべてのテーブルを 分 割 する 必 要 がある 中 間 データが 大 きくなるのでJOINが 遅 い 2.0 レプリケーションテーブルとパーティショニングテー ブルを 混 在 させることが 可 能 クエリをより 並 列 に 動 かすことが 可 能 23
pgpool-ii 1.xの 動 作 中 間 データが 大 きく なってしまう! 1 3 5 7 2 4 6 8 1 2 3 取 得 したデータを 結 合 1 3 2 1 3 5 7 2 4 6 8 1 3 2 ノード1のa ノード2のa ノード1のb 全 体 のデータを 取 得 ノード2のb 24
pgpool-ii 2.0の 動 作 中 間 データが 小 さい ので 高 速 1 2 3 結 果 をまとめるのみ 1 3 2 1 3 5 7 1 2 3 2 4 6 8 1 2 3 ノード1のa ノード1のb ノード2のa ノード2のb 25
DBT-3によるベンチマーク 単 体 実 行 時 間 /3 台 分 散 実 行 時 間 7 6 5 4 3 2 1 0 PostgreSQLと3 台 並 列 処 理 の 実 行 時 間 の 比 較 1 2 3 4 5 6 7 8 9 10111213 141516 17181920 2122 Query 番 号 line_itemとordersをテーブル 分 割 PostgreSQL 3 ノード(3 分 割 ) 青 線 :パーティションテーブルとレプリケー ションテーブルの 結 合 赤 線 :レプリケーションテーブル 同 士 の 結 合 パラレルクエリの 弱 いクエリは 未 測 定 (13,15,17,20,22) scale factor=10 インデックス 含 めてトータルで30GB 最 大 で6 倍 のパフォーマンス 改 善 (クエリ9 番 ) 26
他 のシステムとの 連 携 failover_command ノードを 切 り 離 した 時 に 指 定 したコマンドを 実 行 Slony-I の 連 携 やアラートメールを 送 ることが 可 能 failback_command ノードを 戻 した 時 に 指 定 したコマンドを 実 行 pgpool-iiから 必 要 な 情 報 を 渡 すことも 可 能 ( 特 殊 文 字 を 置 換 ) %d: 対 象 ノード 番 号 %h: 対 象 ノードのホスト 名 %p: 対 象 ノードのポート 番 号 %D: 対 象 ノードのデータベースクラスタパス 27
クライアントの 強 制 切 断 client_idle_limit クライアントからクエリが 届 くまでの 最 大 待 ち 時 間 を 指 定 可 能 秒 単 位 で 指 定 TCPのタイムアウト 待 ち 防 止 などに 有 効 28
pgpoolファミリの 今 後 pgpool-iは 今 後 pgpool-iiに 移 行 してもらう pgpool-ii 1.xは 今 後 メンテを 終 了 予 定 pgpool-ii 2.xへ 一 本 化 pgpool-haはpgpool-iiでも 利 用 可 能 29
まとめ pgpool-ii 2.0の 特 長 レプリケーションの 信 頼 性 向 上 更 新 処 理 の 高 速 化 (4ノードなら 従 来 の2 倍!) オンラインリカバリ ノード 追 加 部 分 レプリケーションによるパラレルクエリの 高 速 化 SRA OSSでは,pgpool-IIの 商 用 サポートを 提 供 す る 予 定 です! 30
参 考 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
pgpool-ii デモシステムの 構 成 Apache 2.2.6 FireFox PHP 5.2.4 pgpooladmin pgpool-ii (9999) PostgreSQL 8.2(5432) PostgreSQL 8.2(5433) psql/pgbench Vine Linux 4.1CR 32