HAクラスタで PostgreSQLを高可用化 (後編) ~ レ...

47
HAクラスタで PostgreSQLを高可用化 (後編) ~ レプリケーション編 ~ 2012年9月29日 しくみ+アプリケーション勉強会 松尾 隆利 NTT OSSセンタ

Transcript of HAクラスタで PostgreSQLを高可用化 (後編) ~ レ...

Page 1: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

HAクラスタでPostgreSQLを高可用化 (後編) ~ レプリケーション編 ~2012年9月29日しくみ+アプリケーション勉強会

松尾 隆利NTT OSSセンタ

Page 2: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

2Copyright(c)2012 NTT, Inc. All Rights Reserved.

はじめに 今回は『HAクラスタでPostgreSQLを高可用化』の後編です

■ ストリーミングレプリケーション構成のクラスタリングのお話がメインです

■ 前編の入門編を復習されているのを前提にお話します。• http://linux-ha.sourceforge.jp/wp/wp-content/uploads/pacemaker_20120526JPUG.pdf

■ レプリケーション自体のお話も省きます。

Page 3: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

3Copyright(c)2012 NTT, Inc. All Rights Reserved.

昔~昔・・・・■ PostgreSQL 8.3 + 独自パッチで同期レプリケーション機能を実装し、

Heartbeat(Pacemakerの前身)でHAクラスタ化を実現するPG-REXというプロジェクトがあったそうな・・・

2010年■ PostgreSQL 9.0 で非同期レプリケーション実装 → 同期レプリケーションを実現する独自パッチ

+ Pacemaker用RA開発でクラスタリング実現■ 9.0の非同期レプリケーションでも動くように手直しし、

Pacemakerコミュニティへ投稿

2011年■ PostgreSQL 9.1 で同期レプリケーション実装 → 新たにPacemaker用RAを開発しクラスタリング実現■ Pacemakerコミュニティ意見も反映し投稿!

2012年■ 4月13日 コミュニティのリポジトリにマージ■ 5月16日 resource-agents 3.9.3 として無事リリース ※Linux-HA Japan のリポジトリパッケージ 1.0.12-1.2 に同梱

開発経緯

→ リジェクト

→ 絶賛!(tremendous job !!)

Page 4: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

4Copyright(c)2012 NTT, Inc. All Rights Reserved.

フェイルオーバ

前編の構成 ~Active/Standby 構成~

Active Standby

故障発生

Active

PostgreSQLのデータは共有ディスク上に配置し、2台のサーバ間で共有

通常はActiveサーバでサービスを提供し、Activeサーバ故障時はStandbyサーバがActiveとなりサービスを提供

DBデータ DBデータ

故障

マウント マウント

共有ディスク 共有ディスク

Page 5: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

5Copyright(c)2012 NTT, Inc. All Rights Reserved.

フェイルオーバ

今回の構成 ~Master/Slave 構成~

Master Slave

故障発生

Master

PostgreSQLのデータはそれぞれのサーバのローカルディスク上に配置しPostgreSQLのストリーミングレプリケーション機能を用いて共有

通常はMasterサーバでサービスを提供し、Masterサーバ故障時はSlaveサーバがMasterとなりサービスを継続

DBデータ

故障

ローカルディスク

DBデータ

ローカルディスク

DBデータ

ローカルディスク

DBデータ

ローカルディスク

レプリケーション

Page 6: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

6Copyright(c)2012 NTT, Inc. All Rights Reserved.

Active/Standby vs Master/SlaveActive/Standby Master/Slave

ハードウェア費用 共有ディスク(相当のもの)必須

運用のしやすさ データは1箇所のみ 2箇所のデータの整合性を考慮

データの安全性 最新データは共有ディスク上のみ

最新データは2箇所に分散

サービス継続性 フェイルオーバ時にリカバリに時間を要する

Slave故障がサービスに影響(同期レプリケーション使用時)

DB性能 レプリケーションのオーバヘッドなし

共有ディスク構成をとれない某高速ストレージを活用可

負荷分散 構成上不可能ReadOnlyクエリをSlaveで処理可能

実績 これから・・・・

それぞれ一長一短。サービスの要件に応じて選択すること。

Page 7: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

7Copyright(c)2012 NTT, Inc. All Rights Reserved.

レプリケーション構成のHAクラスタ化 3大機能

Master故障発生

同期レプリケーション

フェイルオーバ

DBデータ DBデータ

DBデータDBデータ

非同期レプリケーション

DBデータ DBデータ

Slave故障発生

故障

Master Slave

Master

Master

①フェイルオーバ

故障

②同期・非同期の切替

データの状態管理

Page 8: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

8Copyright(c)2012 NTT, Inc. All Rights Reserved.

基本構成

Pacemaker Pacemaker

サービス提供用LAN

PostgreSQL(Master)

PostgreSQL(Slave)

レプリケーション用LAN

仮想IP1(vip-master)

仮想IP2(vip-rep)

仮想IP3(vip-slave)

pgsql RA pgsql RA

制御 制御

サーバ#1 サーバ#2

Pacemaker用LAN

Read/Write Read Only

STONITH 用LAN※次ページからは省略

ローカルディスク ローカルディスク

負荷分散しないならば削除可

レプリケーションはこの仮想IP宛に接続

Page 9: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

9Copyright(c)2012 NTT, Inc. All Rights Reserved.

Pacemaker Pacemaker

PostgreSQL(Master)

PostgreSQL(Slave)

vip-master

vip-rep

vip-slave

pgsql RA pgsql RA

サーバ#1 サーバ#2

故障

基本動作1 : Masterのフェイルオーバ

① #1のPostgreSQLの故障を検知

Pacemaker Pacemaker

PostgreSQL(Master)

PostgreSQL(Slave)

vip-master

vip-rep

vip-slave

pgsql RA pgsql RA

サーバ#1 サーバ#2

①故障

vip-master

PostgreSQL (Master)

vip-master

vip-rep

サーバ#1 サーバ#2

古④

⑤②停止

Pacemaker Pacemaker

pgsql RA pgsql RA

② #1のPostgreSQLを停止③ 仮想IP(vip-master, vip-rep, vip-slave)を停止④ #1のデータが古いことを記録⑤ #2のPostgreSQLをMasterに昇格(promote)⑥ #2で仮想IP(vip-master, vip-rep, vip-slave) を起動

vip-rep

vip-slavevip-slave

Page 10: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

10Copyright(c)2012 NTT, Inc. All Rights Reserved.

Pacemaker Pacemaker

PostgreSQL(Master)

PostgreSQL(Slave)

pgsql RA pgsql RA

サーバ#1 サーバ#2

vip-master vip-slave

vip-rep

同期故障

基本動作2 : 同期・非同期の切替

Pacemaker Pacemaker

PostgreSQL(Master)

PostgreSQL(Slave)

pgsql RA pgsql RA

サーバ#1 サーバ#2

① Slaveの故障発生② Masterのトランザクション停止~ レプリケーションのタイムアウト待ち~③ #1でレプリケーション切断を検知

SELECT * from pg_stat_replication

vip-master vip-slave

vip-rep

同期 ①故障

③検知 vip-slave

Pacemaker

④停止

サーバ#2

古古

pgsql RA

vip-slave

⑦ 非同期

④ #2のPostgreSQLを停止⑤ #2の仮想IP(vip-slave)を#1に付け替え⑥ #2のデータが古いことを記録⑦ #1のPostgreSQLを非同期に変更 → トランザクション再開

Page 11: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

11Copyright(c)2012 NTT, Inc. All Rights Reserved.

ここまでが基本動作次はフェイルオーバ後の復旧

Page 12: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

12Copyright(c)2012 NTT, Inc. All Rights Reserved.

TimelineID PostgreSQLがSlaveからMasterへ昇格した際インクリメントされる数値 TimelineIDが異なるとレプリケーション接続ができない

TimelineIDをそろえるには新Masterのデータを旧Masterへコピーする必要あり

フェイルオーバ Slave→Master

フェイルオーバ時

故障

5 65

Master Slave

5 5

レプリケーション

異なる

Page 13: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

13Copyright(c)2012 NTT, Inc. All Rights Reserved.

Pacemaker Pacemaker

PostgreSQL(Master)

PostgreSQL(Slave)

vip-slave

pgsql RA pgsql RA

サーバ#1 サーバ#2

故障 PostgreSQL(Master)

vip-master

vip-rep

サーバ#1 サーバ#2

Pacemaker Pacemaker

pgsql RA pgsql RA

vip-slave

vip-master

PostgreSQL(Master)

サーバ#2

Pacemaker

pgsql RA

vip-master

vip-repPostgreSQL④ (Slave)

サーバ#1

Pacemaker

pgsql RA

vip-slave

PostgreSQL④ (Slave)

サーバ#1

Pacemaker

pgsql RA

vip-slave

運用1: フェイルオーバ後の復旧

① 故障の復旧② #1のデータを#2と同期 → TimelineIDがそろう③ #1のロックファイル削除と Pacemaker上の故障フラグを クリア

④ #1のPostgreSQLをSlaveで起動⑤ レプリケーション開始 → 非同期で接続→同期に切替⑥ #2の仮想IP(vip-slave)を#1に付け替え

Pacemaker Pacemaker

PostgreSQL(Master)

PostgreSQL(Slave)

vip-slave

pgsql RA pgsql RA

サーバ#1 サーバ#2

故障 PostgreSQL(Master)

vip-master

vip-rep

サーバ#1 サーバ#2

Pacemaker Pacemaker

pgsql RA pgsql RA

vip-slave

①故障復旧

② データ同期

故障

③ フラグ・クリアロック削除

故故

(手動)

vip-slave

⑤ 同期レプリケーション

Page 14: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

14Copyright(c)2012 NTT, Inc. All Rights Reserved.

次は起動方法

Page 15: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

15Copyright(c)2012 NTT, Inc. All Rights Reserved.

PostgreSQLとPacemakerの状態遷移

start promote

stop demote

SlaveSTOP Master

PostgreSQLのMasterは必ずSlaveを経由(recovery.confはRAが作成)して起動される

→ Master起動時もTimelineIDがインクリメントされる

PostgreSQLのMasterは必ずSlaveを経由(recovery.confはRAが作成)して起動される

→ Master起動時もTimelineIDがインクリメントされる

recovery.conf なしで起動

recovery.conf ありで起動 pg_ctl promote

停止

停止

Slave MasterSTOP

×

Masterを直接起動可能

Page 16: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

16Copyright(c)2012 NTT, Inc. All Rights Reserved.

Pacemaker

pgsql RA

サーバ#1 サーバ#2

停止 停止

PostgreSQL(Master)

vip-master

vip-rep

vip-slave

Pacemaker

pgsql RA

サーバ#1 サーバ#2

停止 停止

PostgreSQL(Master)

vip-master

vip-rep

運用2 : 起動

① データが新しい方のサーバーを選択② 選択したサーバのPacemakerを起動 → Slaveで起動 → Masterに遷移 → TimelineIDがずれる③ 仮想IPが#1で起動

Pacemaker

pgsql RA

サーバ#1 サーバ#2

停止

④ #2のデータを#1と同期 → TimelineIDがそろう⑤ Pacemaker起動 → レプリケーション開始⑥ #1の仮想IP(vip-slave) を#2に付け替え

停止

古新

PostgreSQL(Master)

vip-master

vip-slave

vip-rep

②起動

(手動)

vip-slave

PostgreSQL(Slave)

Pacemaker

pgsql RA

サーバ#2

vip-slave

④ データ同期

⑤起動

(手動)

③仮想IP起動

Page 17: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

17Copyright(c)2012 NTT, Inc. All Rights Reserved.

ここからは状態遷移詳細

Page 18: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

18Copyright(c)2012 NTT, Inc. All Rights Reserved.

その前に用語を整理

PostgreSQLとPacemakerの状態遷移は一致しないため、二者を区別するために以下を使い分け

PostgreSQLの状態を表す用語■ PRI : Primary(Master)状態■ HS : Hot Standby(Slave)状態■ STOP : 停止している状態

Pacemakerの状態を表す用語■ Master : アプリケーションをMasterとして管理している状態■ Slave : アプリケーションをSlaveとして管理している状態■ Stopped : アプリケーションを停止として管理している状態

Page 19: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

19Copyright(c)2012 NTT, Inc. All Rights Reserved.

PostgreSQLとPacemakerの状態遷移 (用語区別版)

start promote

stop demote

HSSTOP PRI

start (recovery.conf なしで起動)

start(recovery.conf ありで起動) pg_ctl promote

stop

stop

Slave MasterStopped

この部分をPacemakerの状態遷移とマッピング

Page 20: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

20Copyright(c)2012 NTT, Inc. All Rights Reserved.

状態遷移のマッピング

Slave MasterStopped

HSSTOP PRI

STOP(アンマッチ)

×

demotestop

start promote

promote

stop

start

stop停止済のため何もしない

この状態はSlaveの監視が動くと故障となるためこの状態に留まることはできない。

Page 21: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

21Copyright(c)2012 NTT, Inc. All Rights Reserved.

HSの複数状態

・・・ HS:alone

・・・ HS:(others)

・・・ HS:sync

HS:(others) は以下の二つの状態をとる

・ HS:connected

・ HS:async

Pacemakerでこれら状態を"pgsql-status"属性として管理Pacemakerでこれら状態を"pgsql-status"属性として管理

PostgreSQLのHSには複数の状態を管理

1. PRI へ未接続

2. PRI へ接続中

a. 同期レプリケーション以外

b. 同期レプリケーション中

※リソースID名をpgsqlとした場合

Page 22: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

22Copyright(c)2012 NTT, Inc. All Rights Reserved.

状態遷移のマッピング (改良前)

Slave MasterStopped

STOP PRI

STOP

HS

Page 23: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

23Copyright(c)2012 NTT, Inc. All Rights Reserved.

状態遷移のマッピング (改良後)

Slave MasterStopped

STOP PRI

STOP

HS:(others)

HS:sync

HS:alone

Master

PRI

他のノードにPRIがおらず、自分のデータが最新の場合

Page 24: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

24Copyright(c)2012 NTT, Inc. All Rights Reserved.

データの新旧判断方法

PRI存在時■ PRIとの接続状態を基にデータの状態を記録

• PRI存在時は自分がPRIに昇格することはないため記録のみ

PRI故障時■ PRI故障直前のPRIとの接続状態を基に判断

初期起動時 (PRIが一度も存在したことがない時)■ 他にHSがいる場合

• 他のHS間でデータの新旧を比較して判断

■ 他にHSがいない場合• 自分が最新だと判断

HSのデータが最新かどうかを判断する方法

Page 25: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

25Copyright(c)2012 NTT, Inc. All Rights Reserved.

データの状態

※ pg_stat_replication ビューから取得

Pacemakerでこれら状態を"pgsql-data-status"属性として管理Pacemakerでこれら状態を"pgsql-data-status"属性として管理

PRI存在時に記録するHSのデータ状態1. PRI へ未接続

2. PRI へ接続中

a. 同期レプリケーション以外

b. 同期レプリケーション中

古いデータ

最新データ

・・ DISCONNECT

・・ STREAMING|ASYNC (例)

・・ STREAMING|SYNC

PRI時 ・・ LATEST

※リソースID名をpgsqlとした場合

Page 26: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

26Copyright(c)2012 NTT, Inc. All Rights Reserved.

pgsql-status と pgsql-data-status 属性の違い

pgsql-status■ PostgreSQL の現在の実行状態を示す

• 停止 : STOP• HSで動作 : HS:alone, HS:async, HS:sync• PRIで動作 : PRI• 不明時 : UNKNOWN

pgsql-data-status■ PRI との関係によって決まるデータの状態。

• PRI未接続時 : DISCONNECTED• HS時 : STREAMING|ASYNC, STREAMING|SYNC 等• PRI時 : LATEST

■ PRI 故障時、PRI故障直前の状態が残る• PostgreSQL の実行状態と必ずしも一致しない

– pgsql-status=HS:aloneで、pgsql-data-status = LATEST があり得る

用途

・ HSの現在の状態把握

・ HSの状態と他のリソースとの連携

用途

・ HSの現在の状態把握

・ HSの状態と他のリソースとの連携

用途

・ データの新旧状態記録

・ Masterへの昇格可否の判断

用途

・ データの新旧状態記録

・ Masterへの昇格可否の判断

Page 27: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

27Copyright(c)2012 NTT, Inc. All Rights Reserved.

状態遷移のマッピング (条件整理後)

Slave MasterStopped

STOP PRI

STOP

HS:(others)

HS:sync

HS:alone

Master

PRI

他のノードにPRIがおらず、自分のpgsql-data-statusが最新(LATEST or STREAMING|SYNC) の場合。初期起動時は他のノードとデータ新旧を比較した結果最も新しいデータを持っていた場合。

Page 28: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

28Copyright(c)2012 NTT, Inc. All Rights Reserved.

Pacemakerの設定例

Page 29: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

29Copyright(c)2012 NTT, Inc. All Rights Reserved.

リソース構成例 (シンプル版)

PostgreSQL(msPostgresql)

Master

レプリケーション用LAN

(192.168.104.0/24)

仮想IP(vip-slave)

192.168.103.111

pm01 pm02

Pacemaker用LAN

グループ(master-group)

仮想IP(vip-master)

192.168.103.110仮想IP

(vip-rep)192.168.104.110

サービス提供用LAN(192.168.103.0/24)

eth3

eth4 eth4

NW監視 (clnPingd)

PostgreSQL(msPostgresql)

Slave

master-groupとPostgreSQLのMaster は同じノード上で起動させる制約を追加

pgsql-statusがHS:syncまたはPRIの場合に起動

eth3

NW監視 (clnPingd)

ping監視先192.168.103.1

シンプル版のためSTONITHは省略

vip-repが故障してもMaster側のサービスに大きな影響がないので、故障時は再起動を試みる設定にする

Page 30: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

30Copyright(c)2012 NTT, Inc. All Rights Reserved.

Pacemaker 設定例 (シンプル版) 1/2property \ no-quorum-policy="ignore" \ stonith-enabled="false" \ crmd-transition-delay="0s"

rsc_defaults \ resource-stickiness="INFINITY" \ migration-threshold="1"

ms msPostgresql pgsql \ meta \ master-max="1" \ master-node-max="1" \ clone-max="2" \ clone-node-max="1" \ notify="true"

group master-group \ vip-master \ vip-rep \ meta \ ordered="false"

clone clnPingd \ pingCheck

primitive vip-master ocf:heartbeat:IPaddr2 \ params \ ip="192.168.103.110" \ nic="eth3" \ cidr_netmask="24" \ op start timeout="60s" interval="0s" on-fail="restart" \ op monitor timeout="60s" interval="10s" on-fail="restart" \ op stop timeout="60s" interval="0s" on-fail="block"

primitive vip-rep ocf:heartbeat:IPaddr2 \ params \ ip="192.168.104.110" \ nic="eth4" \ cidr_netmask="24" \ meta \ migration-threshold="0" \ op start timeout="60s" interval="0s" on-fail="stop" \ op monitor timeout="60s" interval="10s" on-fail="restart" \ op stop timeout="60s" interval="0s" on-fail="block"

primitive vip-slave ocf:heartbeat:IPaddr2 \ params \ ip="192.168.103.111" \ nic="eth3" \ cidr_netmask="24" \ meta \ resource-stickiness="1" \ op start timeout="60s" interval="0s" on-fail="restart" \ op monitor timeout="60s" interval="10s" on-fail="restart" \ op stop timeout="60s" interval="0s" on-fail="block"

primitive pgsql ocf:heartbeat:pgsql \ params \ pgctl="/usr/pgsql-9.1/bin/pg_ctl" \ psql="/usr/pgsql-9.1/bin/psql" \ pgdata="/var/lib/pgsql/9.1/data/" \ rep_mode="sync" \ node_list="pm01 pm02" \ restore_command="cp /var/lib/pgsql/9.1/data/pg_archive/%f %p" \   primary_conninfo_opt="keepalives_idle=60 \ keepalives_interval=5 keepalives_count=5" \ master_ip="192.168.104.110" \ stop_escalate="0" \ op start timeout="30s" interval="0s" on-fail="restart" \ op stop timeout="30s" interval="0s" on-fail="block" \ op monitor timeout="30s" interval="11s" on-fail="restart" \ op monitor timeout="30s" interval="10s" on-fail="restart" role="Master" \ op promote timeout="30s" interval="0s" on-fail="restart" \ op demote timeout="30s" interval="0s" on-fail="block" \ op notify timeout="60s" interval="0s"

PostgreSQLのMaster/Slave化設定

サービス用仮想IP(vip-master)設定

レプリケーション用仮想IP(vip-rep)設定

HS (read only) 用仮想IP(vip-slave)設定

PostgreSQLメイン設定

設定詳細は字が小さくて見えないと思うので、

資料アップロード後確認してください

設定詳細は字が小さくて見えないと思うので、

資料アップロード後確認してください

サービス用仮想IPとレプリケーション用仮想IPを

master-groupとしてグループ化

Page 31: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

31Copyright(c)2012 NTT, Inc. All Rights Reserved.

Pacemaker 設定例 (シンプル版) 2/2primitive pingCheck ocf:pacemaker:pingd \ params \ name="default_ping_set" \ host_list="192.168.103.1" \ multiplier="100" \ op start timeout="60s" interval="0s" on-fail="restart" \ op monitor timeout="60s" interval="2s" on-fail="restart" \ op stop timeout="60s" interval="0s" on-fail="ignore"

### Resource Location ###location rsc_location-1 msPostgresql \ rule -inf: not_defined default_ping_set or default_ping_set lt 100

location rsc_location-2 vip-slave \ rule 200: pgsql-status eq HS:sync \ rule 100: pgsql-status eq PRI \ rule -inf: not_defined pgsql-status \ rule -inf: pgsql-status ne HS:sync and pgsql-status ne PRI

### Resource Colocation ###colocation rsc_colocation-1 inf: msPostgresql clnPingdcolocation rsc_colocation-2 inf: master-group msPostgresql:Master

### Resource Order ###order rsc_order-1 0: clnPingd msPostgresql symmetrical=falseorder rsc_order-2 inf: msPostgresql:promote master-group:start symmetrical=falseorder rsc_order-3 0: msPostgresql:demote master-group:stop symmetrical=false

HS (read only) 用仮想IP (vip-slave)起動条件の設定

Masterと仮想IPの起動・停止順番設定

Masterと仮想IPの同居制約設定

商用利用時は、STONITHやディスク監視等、

その他必要なリソースは別途追加すること

商用利用時は、STONITHやディスク監視等、

その他必要なリソースは別途追加すること

Page 32: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

32Copyright(c)2012 NTT, Inc. All Rights Reserved.

重要な点だけピックアップ

Page 33: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

33Copyright(c)2012 NTT, Inc. All Rights Reserved.

PostgreSQLメイン設定部 ~pgsql RA~primitive pgsql ocf:heartbeat:pgsql \

params \

pgctl="/usr/pgsql-9.1/bin/pg_ctl" \

psql="/usr/pgsql-9.1/bin/psql" \

pgdata="/var/lib/pgsql/9.1/data/" \

rep_mode="sync" \

node_list="pm01 pm02" \

restore_command="cp /var/lib/pgsql/9.1/data/pg_archive/%f %p" \

   primary_conninfo_opt="keepalives_idle=60 \

keepalives_interval=5 keepalives_count=5" \

master_ip="192.168.104.110" \

stop_escalate="0" \

op start timeout="30s" interval="0s" on-fail="restart" \

op stop timeout="30s" interval="0s" on-fail="block" \

op monitor timeout="30s" interval="11s" on-fail="restart" \

op monitor timeout="30s" interval="10s" on-fail="restart" role="Master" \

op promote timeout="30s" interval="0s" on-fail="restart" \

op demote timeout="30s" interval="0s" on-fail="block" \

op notify timeout="60s" interval="0s"

primitive pgsql ocf:heartbeat:pgsql \

params \

pgctl="/usr/pgsql-9.1/bin/pg_ctl" \

psql="/usr/pgsql-9.1/bin/psql" \

pgdata="/var/lib/pgsql/9.1/data/" \

rep_mode="sync" \

node_list="pm01 pm02" \

restore_command="cp /var/lib/pgsql/9.1/data/pg_archive/%f %p" \

   primary_conninfo_opt="keepalives_idle=60 \

keepalives_interval=5 keepalives_count=5" \

master_ip="192.168.104.110" \

stop_escalate="0" \

op start timeout="30s" interval="0s" on-fail="restart" \

op stop timeout="30s" interval="0s" on-fail="block" \

op monitor timeout="30s" interval="11s" on-fail="restart" \

op monitor timeout="30s" interval="10s" on-fail="restart" role="Master" \

op promote timeout="30s" interval="0s" on-fail="restart" \

op demote timeout="30s" interval="0s" on-fail="block" \

op notify timeout="60s" interval="0s"

各コマンドやPostgreSQLデータの場所を指定

同期レプリケーション使用 (指定しない場合は通常のAct-Stadby動作)レプリケーションに参加するサーバーの全ホスト名

recovery.conf のrestore_command 設定

vip-repのIPフェイルオーバを高速化するために、Master停止時にimmediate shutdownを使用

monitor(Master時)promote, demotenotifyの動作定義

recovery.confのprimary_conninfo に

追加するオプション

Page 34: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

34Copyright(c)2012 NTT, Inc. All Rights Reserved.

仮想IP vip-slave (ReadOnly用) の起動条件設定部

location rsc_location-2 vip-slave \ rule 200: pgsql-status eq HS:sync \ rule 100: pgsql-status eq PRI \ rule -inf: not_defined pgsql-status \ rule -inf: pgsql-status ne HS:sync and pgsql-status ne PRI

location rsc_location-2 vip-slave \ rule 200: pgsql-status eq HS:sync \ rule 100: pgsql-status eq PRI \ rule -inf: not_defined pgsql-status \ rule -inf: pgsql-status ne HS:sync and pgsql-status ne PRI

pgsql-status = HS:syncならば起動可

pgsql-status = PRIならば起動可

HS:syncの方がスコアが大きい (200 > 100)ため、正常な同期レプリケーション時はSlave側で、それ以外はPRI (Master)側で起動。

primitive vip-slave ocf:heartbeat:IPaddr2 \ params \ ip="192.168.103.111" \ nic="eth3" \ cidr_netmask="24" \ meta \ resource-stickiness="1" \

primitive vip-slave ocf:heartbeat:IPaddr2 \ params \ ip="192.168.103.111" \ nic="eth3" \ cidr_netmask="24" \ meta \ resource-stickiness="1" \

※vip-slaveが起動するノードが固定されないように、resource-stickinessは"1"にしておくこと

Page 35: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

35Copyright(c)2012 NTT, Inc. All Rights Reserved.

仮想IP vip-rep (レプリケーション用) の再起動設定

primitive vip-rep ocf:heartbeat:IPaddr2 \ params \ ip="192.168.104.110" \ nic="eth4" \ cidr_netmask="24" \ meta \ migration-threshold="0" \ op start timeout="60s" interval="0s" on-fail="stop" \ op monitor timeout="60s" interval="10s" on-fail="restart" \ op stop timeout="60s" interval="0s" on-fail="block"

primitive vip-rep ocf:heartbeat:IPaddr2 \ params \ ip="192.168.104.110" \ nic="eth4" \ cidr_netmask="24" \ meta \ migration-threshold="0" \ op start timeout="60s" interval="0s" on-fail="stop" \ op monitor timeout="60s" interval="10s" on-fail="restart" \ op stop timeout="60s" interval="0s" on-fail="block"

レプリケーション用仮想IPは、監視で故障発生しても再起動を試みる設定にする※0は回数制限なし

Page 36: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

36Copyright(c)2012 NTT, Inc. All Rights Reserved.

Masterと仮想IP(vip-master, vip-rep)の起動・停止順番設定部

order rsc_order-2 inf: msPostgresql:promote master-group:start symmetrical=false

order rsc_order-3 0: msPostgresql:demote master-group:stop symmetrical=false

order rsc_order-2 inf: msPostgresql:promote master-group:start symmetrical=false

order rsc_order-3 0: msPostgresql:demote master-group:stop symmetrical=false

promote 後に 仮想IP を起動

demote(PostgreSQL停止)完了後に仮想IPを停止。先に仮想IPを停止すると、レプリケーション接続が切断され、レプリケーションのパケットが届かなくなるのを防ぐため先にdemoteする。

仮想IPを含むグループ

Page 37: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

37Copyright(c)2012 NTT, Inc. All Rights Reserved.

同期レプリケーション時のPacemaker表示例 (crm_mon –Af)Online: [ pm01 pm02 ]

vip-slave (ocf::heartbeat:IPaddr2): Started pm02

Resource Group: master-group

vip-master (ocf::heartbeat:IPaddr2): Started pm01

vip-rep (ocf::heartbeat:IPaddr2): Started pm01

Master/Slave Set: msPostgresql

Masters: [ pm01 ]

Slaves: [ pm02 ]

Clone Set: clnPingd

Started: [ pm01 pm02 ]

Node Attributes:

* Node pm01:

+ default_ping_set : 100

+ master-pgsql:0 : 1000

+ pgsql-data-status : LATEST

+ pgsql-status : PRI

+ pgsql-master-baseline : 00000000150000B0

+ pm02-eth1 : up

+ pm02-eth2 : up

* Node pm02:

+ default_ping_set : 100

+ master-pgsql:1 : 100

+ pgsql-data-status : STREAMING|SYNC

+ pgsql-status : HS:sync

+ pm01-eth1 : up

+ pm01-eth2 : up

Migration summary:

* Node pm01:

* Node pm02:

仮想IPの状態

PostgreSQLのMaster/Slaveの状態

pm01ノードのpgsql-status, pgsql-data-statusの状態

pm02ノードのpgsql-status, pgsql-data-statusの状態

promote直前のxlogの位置

Page 38: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

38Copyright(c)2012 NTT, Inc. All Rights Reserved.

PostgreSQLの設定ポイント

Page 39: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

39Copyright(c)2012 NTT, Inc. All Rights Reserved.

postgresql.conf (重要点のみ) listen_address = *

■ Slaveには仮想IP(vip-master)が存在しないため特定IPでListenはできない synchronous_standby_names はコメントアウト

■ Pacemakerが同期・非同期を切り替えるためユーザ設定不可• RAが/var/lib/pgsql/tmp/rep_mode.conf をincludeする設定を自動追加

restart_after_crash = off■ PacemakerがPostgreSQLの状態管理をするため、自動再起動はoff

replication_timeout = 20s (ぐらい?)■ 誤検知しない程度に短くする。Slave故障時にMasterのトランザクションが止まる時間に影響

hot_standby = on■ Slaveを監視するために必須

max_standby_streaming_delay = -1max_standby_archive_delay = -1■ Slaveの監視クエリがキャンセルされるのを防ぐ

Page 40: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

40Copyright(c)2012 NTT, Inc. All Rights Reserved.

postgresql.conf (その他)

wal_level = hot_standbywal_keep_segments = 64 (ぐらい?)

■ 小さくし過ぎると、レプリケーションに必要なwalがすぐに削除されてしまう

wal_receiver_status_interval = 5s (ぐらい?)■ replication_timeout より短くすること

hot_standby_feedback = onarchive_mode = on

Page 41: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

41Copyright(c)2012 NTT, Inc. All Rights Reserved.

ロックファイル

Page 42: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

42Copyright(c)2012 NTT, Inc. All Rights Reserved.

ロックファイル

PRIを停止すると残るファイル■ データ不整合を避けるために導入

• 本ファイルが存在するとPostgreSQLは起動できない• デフォルトパス : /var/lib/pgsql/tmp/PGSQL.lock

■ HSがいない場合、PRI正常停止時に削除される

★同期レプリケーションの意味★ コミット成功は必ず両サーバにデータが存在することを保証 → つまりコミット失敗時はデータがコミットされたかどうかは不定 → 最悪両サーバ間でデータに差異が発生 → PostgreSQLはこの差異を検知できないため起動をロック

Page 43: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

43Copyright(c)2012 NTT, Inc. All Rights Reserved.

不整合の発生パターン例

問題が発生するパターン■ PRIに7のデータ書き込み

■ PRIが7のデータをHSへ転送中にPRIが故障 (HSにパケット未達)

PRI 1 2 3 4 5 6 7

1 2 3 4 5 6HS

1 2 3 4 5 6 7' 8'

不整合発生

PRI

■ フェイルオーバ発生

• HSは6までのデータでPRIに昇格し7' , 8' のデータを書き込み

HS↓

PRI

HS

■ 旧PRIをHSとして組み込み

• 旧PRIには転送し損ねた7のデータが存在するため、8'からレプリケーションが開始される

1 2 3 4 5 6 7' 8' 9'

アプリケーション

NG

1 2 3 4 5 6 7 8' 9'7

7'

Page 44: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

44Copyright(c)2012 NTT, Inc. All Rights Reserved.

ロックファイル導入後

回避パターン

■ PRI へ昇格時にロックファイル作成

■ PRIに7のデータ書き込み

■ PRIが7のデータをHSへ転送中にPRIが故障 (HSにパケット未達)→ フェイルオーバ発生 (図省略)

PRI 1 2 3 4 5 6 7

1 2 3 4 5 6HS

PRI

HS

■ 旧PRIをHSとして組み込み

→ HS起動時にロックファイルがあるため起動エラーに。

1 2 3 4 5 6 7' 8' 9'

アプリケーション

NG

1 2 3 4 5 6 7起動エラー

ロックファイルがある場合は、新PRIのデータを新HSへコピーし

ロックファイルを削除する手順が必要

ロックファイルがある場合は、新PRIのデータを新HSへコピーし

ロックファイルを削除する手順が必要

Page 45: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

45Copyright(c)2012 NTT, Inc. All Rights Reserved.

HAクラスタ化まとめ

3大機能■ Masterのフェイルオーバ■ レプリケーションの同期・非同期の切替■ データの状態管理

Pacemaker設定のポイント■ レプリケーション用の仮想IP(vip-rep)が必要■ 必要ならばSlaveにReadOnlyクエリ負荷分散用仮想IPを設定可能

運用時の注意■ TimelineIDがずれているとレプリケーションできないため注意■ フェイルオーバ後はTimelineIDのずれに加えデータ不整合も発生する可能性あり

• ロックファイルがある場合、不整合が発生していないデータに入れ替えること

Page 46: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

46Copyright(c)2012 NTT, Inc. All Rights Reserved.

動作環境

Pacemaker 1.0.12 以上推奨■ 1.0.11だとMaster/Slaveバグ回避設定が必要

resource-agents 3.9.3 以上■ Linux-HA Japan Pacemakerリポジトリパッケージ 1.0.12-

1.2 以上に同梱 (2012年7月リリース)■ 色々バグフィックスしているので、pgsql RAだけ最新に入れ替えた方

が無難

PostgreSQL 9.1 以上■ 9.0では動きません■ 9.2では動いたとの報告あり

Page 47: HAクラスタで PostgreSQLを高可用化 (後編) ~ レ …linux-ha.osdn.jp/wp/wp-content/uploads/b754c737d835c...vip-master vip-rep サーバ#1 サーバ#2 古 ④ ⑤ ②停止

47Copyright(c)2012 NTT, Inc. All Rights Reserved.

参考

ソースコード (GitHub上のRA直リンク)■ URL : https://github.com/ClusterLabs/resource-agents/blob/master/heartbeat/pgsql

ドキュメントおよび設定例 (GitHubのWiki)■ https://github.com/t-matsuo/resource-agents/wiki/

Pacemakerダウンロード・インストール■ http://linux-ha.sourceforge.jp/