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つ止まると、注文できない
# 注文には、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時間の記録
| 時間 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| 機械A | 1 | 1 | 0 | 1 | 1 | 1 |
| 機械B | 1 | 0 | 1 | 1 | 1 | 1 |
| 機械C | 1 | 1 | 1 | 0 | 1 | 1 |
| 3台とも必要 | 使える | 使えない | 使えない | 使えない | 使える | 使える |
| どれか1台でよい | 使える | 使える | 使える | 使える | 使える | 使える |
学生が入力するセルは、このプレビューでは空白です。
動いていた時間を数える
# 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台とも必要な作りなら、台数が多いほど止まりやすくなります。