motacaplaのめう

日頃得られた知見と気付きをdumpするところ

合意プロトコル(Consensus Protocol)についてまとめてみる 第3章 3-phase commit (3PC)

この記事は何?

下記の続編で、3記事目である。

tikeda-meu.hatenablog.com

というわけで今日は3-phase commit (3PC) についてまとめてみる。

3-phase commit (3PC) とは

commitまでに3つのフェーズが存在し、それらをpassした時にのみcommitする、そうでなければabortする。2PCと凄く似ているが、2PCが同期(ブロッキング)なのに対して3PCは非同期(non-blocking)な合意プロトコルである。

3PCではトランザクションがcommitかabortされる間の時間に上限(time out)を設けている。time outを持っている理由は、デッドロックを回避するためである。

例えば、2PCにおけるcommit-request phaseで、coordinatorがall participantsから返事を受け取ったとしよう。この時coordinatorがロックを取得した後に死ぬと、participantsはデッドロックに陥る。

よって、もしあるトランザクションが3PCによりcommitしようとしてロックを行っている場合、time outによりそのロックが解除されることが保証される。

全体の処理シーケンスは下図になる。

f:id:tikeda_meu:20190627214701p:plain

基本的には2PCと同等である。

非常に興味深い点は、coordinatorがpreCommitを実施する際に、participantsからの返事の多数決がyesであれば、commitフェーズに以降して続行される点である。

問題点

  • ネットワークがセグメント化された場合に、いかなる方法を持ってしても回復できない

※ Keidar and Dolev's E3PC algorithmでこの欠点を解消している。

References

Three-phase commit protocol - Wikipedia

分散システムについて語らせてくれ

Consensus, Two Phase and Three Phase Commits - Balraja Subbiah - Medium