- pg2+globalはErlang/OTP標準のモジュール。
- gproc+gen_leaderはオープンソースの拡張モジュール。
- どちらもプロセスのグループを管理するためのモジュール。
- クラスタ内に複数のノードがいる。
- クラスタ内にノードを跨いだグループがある。
- 各ノードにグループを管理するプロセスがいる。
- 各ノードにグループのメンバになる複数のプロセスがいる。
- 全ノードが同期したメンバ一覧のローカルコピーを持つ。
- メンバ(プロセス)がグループに参加(join)する。
- メンバ(プロセス)がグループから離脱(leave)する。
- ネットワークが分断して、ノードが見えなくなる。
- ネットワークが復旧して、ノードが見えるようになる。
pg2+globalの場合。
- 自ノードのメンバ一覧を更新する。
- 全ノードでロックを取得する!(一つでもロックを取得できないノードがあれば失敗)
- 全ノードに更新したメンバの情報を非同期で送信する。
- 各ノードがメンバ一覧を更新して結果を返す。
- 全ノードの結果を完了した順に受信する。(結果は部分的に失敗することがあり得る)
- 全ノードでロックを解放する。
gproc+gen_leaderの場合。
- 自ノードのメンバ一覧を更新する。
- 全ノードにリーダ経由で更新したメンバの情報を送信する。(到達確認なしのブロードキャスト)
- 各ノードがメンバ一覧を更新する。
基本的にメンバがグループに参加したときと同じ。メンバ一覧の更新が追加か削除かの違い。
どちらの場合も、ノードが停止したとみなして、そのノードにいた全プロセス(メンバ)をグループから離脱させる。
pg2+globalの場合は、残りの各ノードは自分でメンバ一覧を更新する。
gproc+gen_leaderの場合は、残りの各ノードはリーダ経由でメンバ一覧を更新する。
どちらの場合も、ノードが起動したとみなして、そのノードに全メンバの情報を送信する。
pg2+globalの場合は、起動したノードに既存の全ノードが全メンバの情報を送信する!
gproc+gen_leaderの場合は、起動したノードにリーダが全メンバの情報を送信する。
pg2+global | gproc+gen_leader | ZooKeeper(Zab) | |
---|---|---|---|
リーダ選択(Leader election) | なし | あり | あり |
クォーラム(Quorum) | なし | なし | あり |
原子性(Atomicity) | 不完全 | 不完全 | あり |