トランザクション単位のデータ保護レベルの設定
トランザクションごとにデータ保護レベルを細かく制御
■ SET synchronous_commit TO xxx
トランザクションが
スレーブの synchronous_commit WAL書き込みを待つか?
モード の設定値
マスタ スレーブ
on 待つ 待つ
同期 local 待つ
off
on 待つ
非同期 local 待つ
off
トランザクションの重要度に応じてデータ保護レベルを変更
■ 同期レプリケーションのスレーブに対して、
■ お金を扱うトランザクションでは設定値 on で、COMMIT時に両系にWALが存
在することを保証し、データ損失を確実に防ぐ
■ 故障時に一部更新結果が消えてもよいトランザクションでは local / off に設
定して性能向上
Copyright(c)2012 NTT, Inc. All Rights Reserved. 16
まとめ
バージョン9.1からレプリケーションのモードを「非同期」と
「同期」から選択可能
レプリケーションのモードはスレーブ単位、トランザクショ
ン単位で設定
レプリケーションの様子はpg_stat_replicationで確認できる
同期レプリケーションはデータ保護を最優先し、レプリケー
ションを継続できないときはトランザクションを停止させる
Copyright(c)2012 NTT, Inc. All Rights Reserved. 22
23.
PostgreSQL同期レプリケーション
+
Pacemaker
による高可用クラスタ化
松尾 隆利
Copyright(c)2012 NTT, Inc. All Rights Reserved.
24.
高可用(HA)クラスタ? Pacemaker?
複数台のサーバーを用意し、壊れた時に他のサーバーでサービスを
引き継ぐことでシステムの可用性(Availability)を高める手段
■ 今までのPostgreSQLのHAクラスタ化はActive-Standby (Cold Standby)方式が
主流
■ Pacemakerは"Linux-HA Japan"コミュニティ提供のオープンソースソフトウェア
■ 市販製品では、ClusterPro, LifeKeeper, Red Hat High Availabilityアドオン 等
Active Standby フェイルオーバ Active
故障
故障発生
マウント マウント
DBデータ DBデータ
Copyright(c)2012 NTT, Inc. All Rights Reserved. 24
想定している適用箇所
クラスタ化に費用を割けられない
■ NAS, 共有ディスク, NFSサーバ等が不要
参照クエリを負荷分散したいがSlaveの故障にも備えたい
■ Slave故障時にMasterで参照クエリを処理させる
• アプリケーションは接続先を意識しなくてよくなる
高負荷時のフェイルオーバ時間を出来る限り短くしたい
■ フェイルオーバ後のクラッシュリカバリが(ほぼ)必要なくなる
某高速ストレージを使いたい
■ PCI Express接続ストレージではデータを共有できない
■ 性能を求めるにはレプリケーション用のネットワークもそれなりの
性能の物を揃える必要あり?
Copyright(c)2012 NTT, Inc. All Rights Reserved. 26
27.
基本構成
サービス提供用LAN
Read/Write Read Only
仮想IP1 仮想IP3
(vip-master) (vip-slave)
レプリケーション用 LAN
PostgreSQL 仮想IP2 PostgreSQL
(Master) (vip-rep)
(Slave)
制御 制御
pgsql RA pgsql RA
Pacemaker Pacemaker用LAN
Pacemaker
サーバ#1 サーバ#2
※STONITH用LANの記述は省略(使用推奨)
Copyright(c)2012 NTT, Inc. All Rights Reserved. 27
28.
リソースエージェント(RA)
Pacemakerと制御対象のアプリケーション間を
仲介するプログラムで、主にシェルスクリプトで記述。
既存のPostgreSQL用RAは、
Active-Standby構成に必要な関数
PostgreSQL
(起動(start)・監視(monitor)・停止(stop))を実装
起動 監視 停止
レプリケーション構成を制御するために
この pgsql RA の機能を拡張 pgsql RA
Pacemaker
Copyright(c)2012 NTT, Inc. All Rights Reserved. 28
29.
基本動作1 : Masterのフェイルオーバ
vip-master
vip-master vip-slave vip-master
vip-master
③ vip-slave
vip-slave
PostgreSQL PostgreSQL 故障
PostgreSQL PostgreSQL
①故障
(Master)
vip-rep
(Slave)
②停止
(Master)
vip-rep vip-rep
(Slave)
⑤ (Master)
pgsql RA pgsql RA pgsql RA pgsql RA
pgsql RA
Pacemaker Pacemaker Pacemaker Pacemaker
Pacemaker
サーバ#1 サーバ#2 サーバ#1
サーバ#1 サーバ#2
サーバ#2
④
古
① #1のPostgreSQLの故障を検知 ② #1のPostgreSQLを停止
③ #1の仮想IPを#2に付け替え
④ #1のデータが古いことを記録
⑤ #2のPostgreSQLをMasterに昇格
Copyright(c)2012 NTT, Inc. All Rights Reserved. 29
30.
基本動作2 : 同期・非同期の切替
②
vip-slave
③検知 ⑤
vip-master vip-slave vip-master vip-slave
⑦ 非同期
PostgreSQL 同期 PostgreSQL PostgreSQL 故障
PostgreSQL
(Master)
vip-rep
①故障
(Slave) (Master)
vip-rep ④停止
(Slave)
pgsql RA pgsql RA pgsql RA pgsql RA
pgsql RA
Pacemaker Pacemaker Pacemaker Pacemaker
サーバ#1 サーバ#2 サーバ#1 サーバ#2
サーバ#2
⑥
古
古
① Slaveの故障発生 ④ #2のPostgreSQLを停止
② Masterのトランザクション停止 ⑤ #2の仮想IPを#1に付け替え
~ レプリケーションのタイムアウト待ち~ ⑥ #2のデータが古いことを記録
③ #1でレプリケーション切断を検知 ⑦ #1のPostgreSQLを非同期に変更
SELECT * from pg_stat_replication → トランザクション再開
Copyright(c)2012 NTT, Inc. All Rights Reserved. 30
31.
TimelineID
PostgreSQLがSlaveからMasterへ昇格した際インクリメントされる数値
TimelineIDが異なるとレプリケーション接続ができない
フェイルオーバ時
フェイルオーバ
Slave→Master
Master レプリケーション Slave
故障
5 5 5 5 6
異なる
TimelineIDをそろえるには
手動でのデータ同期(推奨) or WALアーカイブの共有が必要
Copyright(c)2012 NTT, Inc. All Rights Reserved. 31
32.
運用1: フェイルオーバ後の復旧
vip-master
vip-master
⑥ vip-master
vip-slave vip-slave
vip-slave
vip-slave
vip-slave
vip-slave
⑤ レプリケーション
故障
PostgreSQL PostgreSQL
PostgreSQL PostgreSQL PostgreSQL
①故障復旧 vip-rep
vip-rep vip-rep
(Master) (Master)
(Master)
(Slave) ④ (Slave)
④(Slave) (Master)
③ フラグクリア
pgsql RA
pgsql RA
pgsql RA 故
故 pgsql RA
pgsql RA pgsql RA pgsql RA
Pacemaker
Pacemaker Pacemaker
Pacemaker Pacemaker Pacemaker
サーバ#1
サーバ#1
サーバ#1 サーバ#2
サーバ#2
サーバ#2 サーバ#1 サーバ#2
② データ同期
古 新
① 故障の復旧 ④ #1のPostgreSQLを起動
② #1のデータを#2と同期 ⑤ レプリケーション開始
→ TimelineIDがそろう (手動) ⑥ #2の仮想IP(Slave用)を#1に付け替え
③ #1のPacemaker上の故障
フラグをクリア
Copyright(c)2012 NTT, Inc. All Rights Reserved. 32