Skip to content

Instantly share code, notes, and snippets.

@t3t5u
Created May 13, 2015 06:54
Show Gist options
  • Save t3t5u/8096d9c4b560ebad5987 to your computer and use it in GitHub Desktop.
Save t3t5u/8096d9c4b560ebad5987 to your computer and use it in GitHub Desktop.
pg2+globalとgproc+gen_leaderの比較。

pg2+globalとgproc+gen_leaderの比較。


想定する利用状況。

  • クラスタ内に複数のノードがいる。
  • クラスタ内にノードを跨いだグループがある。
  • 各ノードにグループを管理するプロセスがいる。
  • 各ノードにグループのメンバになる複数のプロセスがいる。
  • 全ノードが同期したメンバ一覧のローカルコピーを持つ。

発生するイベント。

  • メンバ(プロセス)がグループに参加(join)する。
  • メンバ(プロセス)がグループから離脱(leave)する。
  • ネットワークが分断して、ノードが見えなくなる。
  • ネットワークが復旧して、ノードが見えるようになる。

メンバがグループに参加したときの処理。

pg2+globalの場合。

  1. 自ノードのメンバ一覧を更新する。
  2. 全ノードでロックを取得する!(一つでもロックを取得できないノードがあれば失敗)
  3. 全ノードに更新したメンバの情報を非同期で送信する。
  4. 各ノードがメンバ一覧を更新して結果を返す。
  5. 全ノードの結果を完了した順に受信する。(結果は部分的に失敗することがあり得る)
  6. 全ノードでロックを解放する。

gproc+gen_leaderの場合。

  1. 自ノードのメンバ一覧を更新する。
  2. 全ノードにリーダ経由で更新したメンバの情報を送信する。(到達確認なしのブロードキャスト)
  3. 各ノードがメンバ一覧を更新する。

メンバがグループから離脱したときの処理。

基本的にメンバがグループに参加したときと同じ。メンバ一覧の更新が追加か削除かの違い。


ネットワークが分断して、ノードが見えなくなったときの処理。

どちらの場合も、ノードが停止したとみなして、そのノードにいた全プロセス(メンバ)をグループから離脱させる。

pg2+globalの場合は、残りの各ノードは自分でメンバ一覧を更新する。

gproc+gen_leaderの場合は、残りの各ノードはリーダ経由でメンバ一覧を更新する。


ネットワークが復旧して、ノードが見えるようになったときの処理。

どちらの場合も、ノードが起動したとみなして、そのノードに全メンバの情報を送信する。

pg2+globalの場合は、起動したノードに既存の全ノードが全メンバの情報を送信する!

gproc+gen_leaderの場合は、起動したノードにリーダが全メンバの情報を送信する。


おまけ。

ZooKeeperとの比較。

pg2+global gproc+gen_leader ZooKeeper(Zab)
リーダ選択(Leader election) なし あり あり
クォーラム(Quorum) なし なし あり
原子性(Atomicity) 不完全 不完全 あり
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment