watchdog を構成する諸機能の内部動作

pgpool-II day 2015
2015/05/15
長田 悠吾
pgpool-II Global Development Group自己紹介●

長田 悠吾 (Yugo Nagata)●

pgpool-II 全般の対応●●

なんとなく watchdog 周りを担当することが多い●

2

開発、バグ修正、解析、ドキュメント、リリース、yum レポジトリサーバ、ビルド
ファーム、RPM、 pgpoolAdmin、・・・

たまたま、最初に担当したのが watchdog 機能のテスト＆デバッグだった

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

今日のお話●

Watchdog = pgpool-II 組み込みのHA機能–●●

pgpool-II 自体が単一障害点（SPoF）になることを防ぐ

主な機能–

pgpool-II の死活監視–

仮想 IP の制御–

pgpool-II 間の情報共有

その内部動作について、少しだけ詳しく話しますどんなプロセスで構成されるか– どんな情報をやりとりしているのか– どんな処理をしているのか–注意） pgpool-II 3.4 を前提にしています。
3

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

watchdog 機能概要
クライアントクライアントクライアント
クエリ

スタンバイ（待機系）

アクティブ（稼働系）
仮想IP

仮想IP

制御

制御

クエリ

pgpool-II

監視

相互監視
watchdog

watchdog

監視 pgpool-II

情報共有

クエリ
PostgreSQL
PostgreSQL
PostgreSQL
4

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

watchdog 機能概要
クライアントクライアントクライアント

障害発生

クエリ

ダウン
仮想IP

アクティブ（稼働系）

仮想IP
クエリ

制御
pgpool-II

監視

制御
相互監視

watchdog

watchdog

監視 pgpool-II

情報共有

クエリ
PostgreSQL
PostgreSQLPostgreSQL
5

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

プロセス構成
pgpool-II 親プロセスから複数の子プロセスが fork される●

クライアント仮想IP
pgpoolpgpoolpgpoolpgpoolchild
childchildchildpgpoolparent制御
watchdog
監視pgpoolparentクエリ
ヘルスチェック
フェイルオーバ

制御

通知（受信）
lifechecklifecheck

通知（送信）
heartbeatheartbeatsendersenderheartbeatheartbeatreceiverreceiver相互監視

PostgreSQL
PostgreSQL
PostgreSQL
6

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

watchdog
heartbeatheartbeatreceiverreceiverheartbeatheartbeatsendersenderクライアント
クライアントクライアント

死活監視

クエリ

スタンバイ（待機系）

アクティブ（稼働系）
仮想IP

仮想IP

制御

制御

クエリ

pgpool-II

監視

相互監視
watchdog

watchdog

監視 pgpool-II

情報共有

クエリ
PostgreSQL
PostgreSQL
PostgreSQL

7Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

死活監視（life check）：概要●

pgpool-II の障害発生の有無を監視する機能●●「ハートビート信号」を互いに交換することで、他の pgpool-II の障害を検知– 定期的にハートビートを送信– これが一定時間以上途切れたら、相手の pgpool-II は死んでいる
自分自身の pgpool-II プロセスが生きているかも、定期的に確認
watchdog
プロセス
監視
pgpool-II

8watchdog
ハートビート信号

プロセス
監視
pgpool-II

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

死活監視：障害が発生した場合の挙動●

自分自身の障害を検出した場合●

自分に障害が発生したことを他の pgpool-II に通知
watchdog

watchdog

障害通知

監視
pgpool-II●

自分以外のアクティブ pgpool-II の障害を検出した場合●

スタンバイのうち１つが、新しいアクティブに昇格する

アクティブ
pgpool-II

9pgpool-II

検出 / 通知スタンバイ
pgpool-II

昇格

スタンバイ
pgpool-II

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

アクティブ
pgpool-II死活監視：全体像
仮想IP

仮想IP制御制御
pgpoolparent監視

heartbeatreceiver 1

定期的にチェック

ハートビート信号
最終受信時刻lifecheck

更新

heartbeatsender 1
heartbeatreceiver 2
heartbeatsender 2

10

通知
ハートビート信号を定期的に送受信(UDP パケット）
192.168.10.0/24

watchdogheartbeat
sender 1
heartbeatreceiver 1
heartbeatsender 2

192.168.20.0/24

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

heartbeatreceiver 2

死活監視：ハートビート通信（相互監視）
仮想IP

ハートビート信号受信が一定時間途ない・・・→ 相手 pgpool-II に障害が発生！

ハートビート信号最終受信時刻

11

更新

仮想IP

制御
watchdog

lifecheck

heartbeatreceiver 1

定期的にチェック

アクティブに昇格
仮想 IP を起動

ハートビート信号を定期的に送受信(UDP パケット）

heartbeatsender 1

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

heartbeatsender 1
heartbeatreceiver 1

死活監視：プロセス監視（自己監視）
仮想 IP を起動
仮想 IP の停止

仮想IP
制御

pgpoolparent監視

自分自身に障害が発生したことを通知

制御
watchdog

lifecheck

定期的に pgpool-II 親プロセスが存在しているかをチェックする

通知を受けてアクティブに昇格

親プロセスが存在しない場合には自分自身に障害が発生したとみなす

12

仮想IP

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

死活監視：ハートビート通信の多重化

ハートビート経路の多重化（経路の数だけプロセスを生成）

heartbeatreceiver 1

定期的にチェック

ハートビート信号
最終受信時刻更新

heartbeatsender 1
heartbeatreceiver 2
heartbeatsender 2

13

watchdog

lifecheck192.168.10.0/24

heartbeatsender 1
heartbeatreceiver 1
heartbeatsender 2

192.168.20.0/24

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

heartbeatreceiver 2

クライアント
クライアントクライアント仮想 IP 制御

クエリ

スタンバイ（待機系）

アクティブ（稼働系）
仮想IP

仮想IP

制御

制御

クエリ

pgpool-II

監視

相互監視
watchdog

watchdog
情報共有

クエリ
PostgreSQL
PostgreSQL
PostgreSQL

14

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

監視 pgpool-II

仮想 IP の制御●

仮想 IP 起動:●●

スタンバイ pgpool-II がアクティブに昇格するとき

仮想 IP 停止●

アクティブ pgpool-II がダウンするとき
仮想IP
制御

制御

障害通知
lifecheck
監視pgpool
parent15

watchdog
heartbeatheartbeatsendersender

他の pgpool-II
相互監視

heartbeatheartbeatreceiverreceiverCopyright © 2015 SRA OSS, Inc. Japan All rights reserved.

仮想 IP の制御：コマンド●

仮想 IP の起動 / 停止の際に呼ばれるコマンド●

デフォルトでは ifconfig コマンドを使用（次期バージョンからは ip コマンドを使用するよう変更されている）●

仮想 IP 起動
if_up_cmd = 'ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0'●

仮想 IP 停止
if_down_cmd = 'ifconfig eth0:0 down'●

仮想 IP 起動後はネットワーク内のARP キャッシュを更新する
arping_cmd = 'arping ­U $_IP_$ ­w 1'●

AWS の CLI などを実行するカスタムコマンドを設定することも可能●

16

クラウドでの利用のためには、さらなる検証 & 改良が必要
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

クライアント
クライアントクライアント

情報共有

クエリ

スタンバイ（待機系）

アクティブ（稼働系）
仮想IP

仮想IP

制御

制御

クエリ

pgpool-II

監視

相互監視watchdog

watchdog
情報共有

クエリ
PostgreSQL
PostgreSQL
PostgreSQL

17

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

監視 pgpool-II

情報共有：pgpool-II サーバ情報●pgpool-II 間で互いの情報を共有している●

ホスト名、ポート番号–●

ステータス–●

新アクティブを決める際に利用される

起動時に、他の pgpool-II に対して自分のサーバ情報を送信する●

18

全ての pgpool-II で同じである必要がある

起動時刻
–

●

アクティブ / スタンバイ / ダウン など

仮想 IP 設定–●

通信の他、各 pgpool-II の ID 情報として使われる

再起動時には、そのサーバに関する情報が更新される

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

情報共有：DBノード情報の共有●DB ノード情報●

各バックエンド DB が pgpool-II の管理下にあるか or ないか、
プライマリ DB か or スタンバイ DB か、などといった情報●

DB のフェイルオーバやフェイルバックなどが発生した時●他の pgpool-II にイベントの内容を通知する●

通知の種類：「切り離し」「復帰」「昇格」「オンラインリカバリの開始/終了」
DB #1 の切り離し処理
pgpoolparent

ファイルオーバ発生！
DB #1 の切り離し処理を実行

watchdog

通知
ヘルスチェック
フェイルーバ
PostgreSQL
PostgreSQL
PostgreSQL

19

signalpgpoolparentDB #1 の切り離し処理を実行

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

参考情報
●

●

pgpool-II オフィシャルサイト
●http://www.pgpool.net/●

http://www.pgpool.net/jp/

SRA OSS, Inc. 日本支社●

セミナー資料、事例情報、技術情報
http://www.sraoss.co.jp/●●

20Let's Postgres●

PostgreSQL 情報のポータルサイト●

http://lets.postgresql.jp/

メーリングリスト●

pgpool-general-jp@sraoss.jp●

pgpool-general@pgpool.net
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

最後に●watchdog の動きが何となくイメージできたでしょうか？
●

死活監視

●

仮想 IP 制御●

情報共有
クライアント
仮想IP

クライアントクライアントクライアント
クエリ

スタンバイ（待機系）

アクティブ（稼働系）
仮想IP

仮想IP

制御

制御

pgpoolpgpoolpgpoolpgpool
child
child
child
child

pgpoolparent制御
watchdog

制御

通知
lifecheck

クエリ

pgpool-II

監視

相互監視
watchdog

watchdog
情報共有監視
pgpoolparent監視 pgpool-II

クエリ
ヘルスチェック
フェイルオーバ

lifecheck

通知
heartbeatheartbeat
sendersenderheartbeatheartbeatreceiverreceiverクエリ
PostgreSQL
PostgreSQL
PostgreSQL

●

21

相互監視

watchdog
heartbeatheartbeatreceiverreceiverheartbeatheartbeatsendersenderPostgreSQL
PostgreSQL
PostgreSQL

分からないことがあれば、後で直接でもメールでもご質問ください（可能な範囲で）お答えいたします！
Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

予備スライド

22

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

watchdog ステータス●ステータス●

アクティブ（稼働系）
–

●

●

23

（全体で１つのみ存在）

スタンバイ（待機系）–

仮想 IP を保持していない pgpool-II–

アクティブに昇格することができるダウン–●

仮想 IP を保持している pgpool-II障害が発生したとみなされている pgpool-II

pgpool-II 起動時の動作●

最初に起動した pgpool-II がアクティブとして起動する●

2番目以降に起動した pgpool-II はアクティブに対してクラスタ参加申請●

これが受理されるとスタンバイとして起動できる

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

死活監視（life check）：概要
pgpool-II の障害発生の有無を監視する機能●

死活監視には２種類のモードがある●●

クエリモード（非推奨）●●「SELECT 1」などのクエリを発行して pgpool-II の応答をチェック
watchdog

watchdog

SELECT 1

SELECT 1
pgpool-II

SELECT 1

pgpool-II

ハートビートモード（標準）●「ハートビート信号」の交換によって、他の pgpool-II の障害を検知

watchdog
プロセス監視watchdog
ハートビート信号pgpool-II

プロセス
監視
pgpool-II

以降は、ハートビートモードの使用を前提に進めます。
24

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

死活監視：障害が発生した場合の挙動●

自分自身の障害を検出した場合●

自分に障害が発生したことを他の pgpool-II に通知
watchdog

watchdog
監視障害通知pgpool-II
障害発生●pgpool-II

自分以外のアクティブ pgpool-II の障害を検出した場合、あるいは、アクティブ pgpool-II から障害通知（上述）を受け取った場合●

スタンバイのうち１つが、新しいアクティブに昇格する–

最も起動時間の早い pgpool-II

アクティブ 障害発生
pgpool-II

検出 / 通知スタンバイ
pgpool-II(0:00 起動）比較

新アクティブに昇格
25

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

スタンバイ
pgpool-II(1:00 起動）

仮想 IP の制御： root 権限●「仮想 IP の制御には root 権限が必要」

1. root ユーザで pgpool-II を起動する
2. sudo 権限のあるユーザで pgpool-II を起動する●

仮想 IP 制御コマンドを “sudo ifconfig ...” などに設定

3. ifconfig コマンド等に setuid を設定する# chmod 4755 /usr/sbin/ifconfig
●

●

26

一般ユーザが root 権限でコマンドを実行可能になる
実際には「pgpool-II 実行ユーザ専用の ifconfig コマンド」を用意するのがよい

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

情報共有：セキュアな通信●

セキュリティの問題●●

watchdog 通信のプロトコルを知っていれば、pgpool-IIになりすまして他の pgpool-II に影響を与えることができる

対応策●全ての pgpool-II で共通の「認証キー」を設定–

認証キーの異なる pgpool-II からの通信は無視する
受信パケット

送信パケット通信

パケット本文

認証情報

パケット本文

認証情報
比較

送信側
認証キー
27

md5ハッシュ化

受信側
認証キー

Copyright © 2015 SRA OSS, Inc. Japan All rights reserved.

md5ハッシュ化