合意プロトコル(Consensus Protocol)についてまとめてみる 第3章 3-phase commit (3PC)
この記事は何?
下記の続編で、3記事目である。
というわけで今日は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によりそのロックが解除されることが保証される。
全体の処理シーケンスは下図になる。
基本的には2PCと同等である。
非常に興味深い点は、coordinatorがpreCommitを実施する際に、participantsからの返事の多数決がyesであれば、commitフェーズに以降して続行される点である。
問題点
- ネットワークがセグメント化された場合に、いかなる方法を持ってしても回復できない
※ Keidar and Dolev's E3PC algorithmでこの欠点を解消している。
- トランザクション完了までに3RTTs(Rount-Trip Time)必要なため、レイテンシが高い。
References
Three-phase commit protocol - Wikipedia
Consensus, Two Phase and Three Phase Commits - Balraja Subbiah - Medium