書籍「Hadoop Hacks」のZooKeeperの章を読んで
ZABによる多数決の仕組みについて疑問が湧きましたので
質問させていただきます。
ZABがデータ同期を保証するために、二層コミットを使っており、
コミットの実行条件として、ZooKeeperサーバの多数決を取っている。
多数決が決まるには過半数の投票がないといけないので、
ZooKeeperサービスの稼働には過半数以上のサーバ数の稼働が必要という制限がある。
というのはわかりました。
Hadoop HacksのP.361 図68-1で「ACK総数 > Lerner総数/2」とありますが、
文章では「Leaderは各Followerから返信されたACKパケットを確認し、
過半数(>全Follower数/2)を超えているかを確認。」とあります。
最初、Lernerについて説明がないので、Followerの誤字と思われましたが、
以下の9ページ目にPaxosの二層コミットの仕組みが掲載されており、
「Learner」とあります(結局、誤字ではあるのですが)
9ページ目の図から、Learnerはデータを保存する役割のように考えられます。
そうすると、上記の「Lerner総数」はLeaderを含んだZooKeeperサーバ数と考えられます。
一方、ACKはFollowerから返ってきます。
上記の条件式ではLeaderがFollowerからZooKeeperサーバ数の
過半数のACKを受け取ればコミットできるということになります。
(3台構成で2台のFollowerからのACKが必要)
3台構成(Leaderが1台、Followerが2台)でFollowerが1台故障した場合、
「ACK総数>Learner総数/2」の条件を満たせなくなるので、
ZooKeeperはサービスを提供できなくなるのではないか?という疑問が湧きました。
しかし、3台構成なら1台の故障を許容できるはずです。
コミット準備が完了したサーバ数という意味でLeaderを含めて
「ACK総数 + 1 > Learner総数」とすればFollowerが1台故障しても条件を満たせるので
Followerが1台故障しても、ZooKeeperがサービスを提供できることに納得できます。
このような理解で間違いないでしょうか。
長文となりましたが、よろしくお願い致します。