クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

分散合意とクォーラム

このレッスンのあとで: 機械どうしが多数決でリーダーや値を決める仕組みを説明できます。

55分のレッスンコマンド4件Valkey ラボ:Redis 互換のキーバリューストアで、キー、有効期限、リスト、カウンターを学ぶ

誰が新しいリーダーか

分散合意とは、一部の機械が壊れたり、通信が遅れたりしても、複数の機械が1つのリーダーや1つの値に同意することです。機械どうしが、全員に聞こえる会議室を持っていないからこそ、決め方が必要になります。

プライマリが応答しなくなったとき、2台が「自分が新しいプライマリだ」と言い出したら、どうなるでしょうか。

このレッスンのゴール

メモ

機械どうしが多数決でリーダーや値を決める仕組みを説明できます。

キーワード

ことばいみれい
合意複数の機械が、同じ1つの答えを選ぶこと
過半数全体の半分を超える数
クォーラム決めるのに必要な、最小の台数5台なら3台
リーダー選出仕事をまとめる機械を、1台だけ選ぶこと
任期リーダーの代が変わるたびに増える番号
スプリットブレイン2台以上が、同時に自分がリーダーだと思う状態

学生が入力するセルは、このプレビューでは空白です。

多数決なら、二つのグループは同時に決められない

過半数は、全体の半分を超える数です。5台なら3台、4台なら3台です。決めるのに必要な台数をクォーラムと呼びます。

5台が3台と2台に分かれても、決められるのは3台のグループだけです。2つの過半数には必ず重なる機械があるので、二つのグループが別々の答えを決めることはありません。

例: 台数ごとの過半数

全体の台数過半数止まってよい台数
3台2台1台
4台3台1台
5台3台2台
6台4台2台
7台4台3台

学生が入力するセルは、このプレビューでは空白です。

過半数を台数ごとに数える

コード: python
# 台数ごとの過半数と、止まってよい台数を表にします。
for n in [3, 4, 5, 6, 7]:
    need = n // 2 + 1
    print(n, "台のとき、過半数は", need, "台。止まってよいのは", n - need, "台")
# [3, 4, 5, 6, 7] に 9 を足して、もう一度実行してみましょう。

5台の過半数を計算する

コマンド
echo $((5 / 2 + 1))

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

6台の過半数を計算する

コマンド
echo $((6 / 2 + 1))

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

リーダーは、過半数の票で選ぶ

リーダー選出では、リーダーを待つノードが、自分を候補にして票を集めます。各ノードは、1つの任期に、1票しか投じません。

過半数の票を得た候補が、新しいリーダーです。票が割れて誰も届かなければ、任期を1つ進めて、もう一度選びます。古い任期のリーダーが戻っても、新しい任期の言うことを聞きます。

例: 5台の選挙

ノード投票先結果
n1n1n1に1票
n2n1n1に2票
n3n3n3に1票
n4n1n1に3票。過半数に届いた
n5連絡がつかない票なし

学生が入力するセルは、このプレビューでは空白です。

票を数える

コード: python
# 5台のノードが、1票ずつ投じました。None は、連絡がつかなかったノードです。
votes = ["n1", "n1", "n3", "n1", None]
counts = {}
for vote in votes:
    if vote is not None:
        if vote in counts:
            counts[vote] = counts[vote] + 1
        else:
            counts[vote] = 1
print(counts)
print("必要な票:", len(votes) // 2 + 1)
# 3つ目の "n3" を "n1" に変えると、どうなるでしょうか。

書く台数と読む台数は、重なる必要がある

値を書くときに w 台、読むときに r 台へ尋ねるとします。全体が n 台のとき、w と r を足して n を超えれば、読む台数の中に、必ず最新の値を持つ機械が1台は含まれます。

足して n 以下なら、読んだ機械が全部古い、ということが起こり得ます。

例: 3台の書く台数と読む台数

書く台数読む台数合計必ず重なるか
2台2台4重なる
1台1台2重ならない
3台1台4重なる(書き込みが遅い)
1台3台4重なる(読み取りが遅い)

学生が入力するセルは、このプレビューでは空白です。

小さなクライアント v を作る

コマンド
v() ( printf '%s\r\n' "$*" | nc -w 1 valkey 6379 )

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

2台の確認を、0.1秒待つ

コマンド
v WAIT 2 100

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある間違い

注意

半数に届けば決まると考えがちです。ちょうど半数では、6台が3台と3台に分かれたとき、二つのグループが別々の答えを決めてしまいます。過半数は、半分を超える数です。

このラボとソースについて: Valkey ラボ:Redis 互換のキーバリューストアで、キー、有効期限、リスト、カウンターを学ぶ

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。