pgpool-IIで実現するPostgreSQLの高可用性 [OSC2008Spring]

pgpool-IIで実現するPostgreSQLの高可用性
SRA OSS,Inc. 日本支社

・pgpool-II 開発背景
・ダウンタイムを限りなくゼロにしたい
・もっと早く!
・シングルサーバの限界、ハードウェアの故障による可用性の低下
・可用性と性能の両方を向上させるオープンソースミドルウェアを作りたい

・pgpool-IIの特徴
・ユーザと複数台のPostgreSQLの間に、pgpool-IIを設置することでユーザからは1台のデータベースに見える
・2004年pgpool初期版、2006年pgpool-II、2007年pgpool-II v2.0リリース、現在はpgpool Global Development Groupで開発&メンテナンス
・BSDライセンス(商用利用可)でソースコードを公開

・pgpool-IIの主な機能
・可用性、同期レプリケーション(オンラインリカバリ)、Slony-Iとの連携、ログシッピング
・性能、参照クエリの負荷分散、パラレルクエリ、クエリキャッシュ、コネクションプール
・運用管理、Webベース管理ツール、独自の管理プロトコルの提供

・同期レプリケーション
・更新クエリを複数サーバに送信し同期を行う
・障害が発生した場合にはフェイルオーバーを行い運用を継続
・1行の更新性能は約1/2、バックエンドのPostgreSQLが何台でも

・オンラインリカバリ
・サービスを停止することなくノード復旧が可能、新規ノードの追加も可能、無停止でアップデートも可能
・洗練されたログベースによるリカバリ
・障害が発生してから、オンラインリカバリの設定が出来る
・管理ツールからボタン一つで操作

・同期レプリケーションの更新処理
・更新処理はマスターで行ロックを取る、マスター以外には並列にクエリを送信する(だから性能は1/2なのかな?)
・処理の結果(何件更新したか)によって、データ整合性チェックが行われる

・注意が必要なクエリ
・サブクエリを伴う更新クエリには注意!
・UPDATEの処理中に、他のユーザがINSERTされる可能性がある
・SQLの書き方に注意が必要
・たとえば、テーブルに対してON SHARE ROW EXCLUSIVE MODEでロックをかける
・同じテーブルに対して、UPDATEとINSERTが行われる場合、かつ新規に追加されるINSERT分がUPDATEの対象に含まれる場合
・INSERT INTO.. SELECT構文やVALUE句内のSELECT
・ユーザ定義関する内で、SELECTの実行結果を使って更新処理を行う処理

・この手の注意をしたくない場合、Slony-Iによる非同期レプリケーション
・更新クエリはマスタのみに送信、自動フェイルオーバー+Slony-Iのマスタの切り替え
・テーブルの追加などスキーマの変更が出来ない
・非同期レプリケーションのため、フェイルオーバー時にデータロストする可能性がある

・ログシッピング
・PostgreSQLのPITRによるログシッピングを行う
・更新クエリはマスタのみに送信、そしてそこからログシッピング
・障害が発生した場合には、自動フェイルオーバー処理を実行
・フェイルオーバー後に、サーバを一台追加してバックアップサーバの構築も可能
・障害発生時にWAL領域のデータがロストする

・可用性のまとめ
・同期レプリケーション、デメリットはクエリ修正が必要かも
・Slony-Iとの連携、クエリの自由度は高い、デメリットは非同期レプリケーション、フェイルオーバー時のデータロスト、Slony-Iの操作がやや困難
・ログシッピング、クエリは何でもOK、デメリットはフェイルオーバー時のデータロスト

・負荷分散
・同期レプリケーション、Slony-Iとの連携時に有効
・検索クエリは重みをつけて振り分け可能
・検索性能が向上

・パラレルクエリ
・データを分割して複数データベースで分担
・検索クエリを一斉に実行して結果をpgpool-IIでまとめる、問い合わせを並列に処理するので高速
・会計システムなどの意志決定システムなどに最適

・その他の機能
・コネクションプーリング(性能向上)
・クエリキャッシュ(性能向上)
・障害時に指定したコマンドを実行、管理者へのメール送信などが可能(運用管理)

・pgpool-HA
・HeartBeatと組み合わせてさらなる可用性向上を
・Active-Standby公正でpgpoolの死活監視
・仮想IPを利用することで、クライアントはサーバが切り替わったことを意識しない
・現状ではオンラインリカバリが出来ない

・pgpool 利用事例

・自動車産業のデータ交換システム(www.postgresql.org/communityfiles/14.pdf)
・クライアントは自動車メーカー
・データベースの負荷分散にpgpoolを利用

・Weblog解析システム(joeconway.com/terabytes_osc2005.pdf)
・520GBのデータを解析とか

・PostgreSQLでの同期レプリケーションでは、最もメジャー

・今後の予定
・オンラインリカバリも含めpgpool-II複数台構成のサポート