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

無料レッスン

分散システムとは何か

このレッスンのあとで: システムを複数の機械で動かす理由と、そのとき壊れやすくなるものを説明できます。

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

1台が止まると、全部が止まる

分散システムとは、複数の機械がネットワークでつながり、1つのシステムのように働く仕組みです。通販サイトも地図アプリもチャットも、たいていは分散システムです。

なぜ1台ではいけないのでしょうか。理由を知ると、システムを設計するときに、何を守るべきかが見えてきます。

このレッスンのゴール

メモ

システムを複数の機械で動かす理由と、そのとき壊れやすくなるものを説明できます。

キーワード

ことばいみ
分散システム複数の機械が連絡し合って、1つのシステムとして働く仕組み
ノード分散システムの中の1台の機械
レイテンシ頼んでから答えが返るまでの時間
スケールアウト機械の台数を増やして、能力を上げること
単一障害点止まると全体が止まってしまう部分
部分的な障害一部の機械だけが壊れて、ほかは動いている状態

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

機械を増やす理由は3つある

1つ目は速さです。大勢の人の頼みを、台数に分けて受ければ、待ち時間が短くなります。2つ目は大きさです。1台に入らないデータは、複数の機械に分けて置きます。

3つ目は故障への強さです。1台が壊れても、ほかの機械が仕事を続けられます。台数を増やして能力を上げることを、スケールアウトと呼びます。

例: セール当日の注文

サーバーの台数1秒に答えられる数セール当日の500件に足りるか
1台(1台で200件)200件足りない
2台400件足りない
3台600件足りる

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

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

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

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

1台しかないサーバーに呼びかける

コマンド
v PING

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

1台だけの部分が、弱点になる

ラボのValkeyは、1台だけで動いています。この1台が止まると、保存したデータへ、誰もアクセスできません。このような部分を単一障害点と呼びます。

分散システムは、重要な部分を2台以上に増やして、単一障害点をなくします。

1台のサーバーに在庫を入れる

コマンド
v SET ds:ticket 300

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

入れた値をもう一度尋ねる

コマンド
v GET ds:ticket

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

一部だけが壊れ、しかも見分けにくい

機械が増えると、新しい問題が生まれます。部分的な障害です。ほかの機械は元気なのに、1台だけが止まったり、1本の通信線だけが切れたりします。

さらに困ることがあります。答えが返ってこないとき、相手が壊れたのか、遅いだけなのかは、外からは分かりません。

部品が1つ止まると、注文できない

コード: python
# 注文には、Web、在庫、決済の3つが必要です。1つでも止まれば注文できません。
parts = {"web": True, "stock": True, "payment": False}
ok = True
for name in parts:
    if not parts[name]:
        print(name, "が止まっています")
        ok = False
if ok:
    print("注文できます")
else:
    print("注文できません")
# "payment" の False を True に変えて、もう一度実行してみましょう。

可用性は、動いていた時間の割合

可用性は、システムが使えた時間の割合です。次の表は、3台の機械の6時間の記録です。1は動いている、0は止まっているを表します。

3台とも必要な作りなら、1台でも止まった時間は使えません。どれか1台でよい作りなら、全部が止まった時間だけが使えません。

例: 3台の6時間の記録

時間123456
機械A110111
機械B101111
機械C111011
3台とも必要使える使えない使えない使えない使える使える
どれか1台でよい使える使える使える使える使える使える

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

動いていた時間を数える

コード: python
# 3台の機械の、6時間の記録です。1は動いている、0は止まっている。
status = [[1, 1, 0, 1, 1, 1], [1, 0, 1, 1, 1, 1], [1, 1, 1, 0, 1, 1]]
all_up = 0
any_up = 0
for hour in range(6):
    up = 0
    for machine in status:
        up = up + machine[hour]
    if up == 3:
        all_up = all_up + 1
    if up >= 1:
        any_up = any_up + 1
print("3台とも動いていた時間:", all_up)
print("どれか1台が動いていた時間:", any_up)

よくある間違い

注意

機械を増やせば、必ず速く、安全になると考えがちです。増やした分だけ、連絡の遅れと、一部だけの故障も増えます。3台とも必要な作りなら、台数が多いほど止まりやすくなります。

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

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