はじめに
こんにちは、もんすんです。
今回は分散システムについて触れていきます。
現代のインターネットやアプリケーションは、複数のサーバやシステムが連携する「分散システム」で動いています。
この分散システムが効率性・信頼性を保って動作させるためには、「データレプリケーション」や「CAP定理」などの基本概念を理解することが重要です。
本記事では、それぞれの基礎について具体例を交えて説明します。
本題
データレプリケーションとは
データレプリケーションとは、同じデータを複数の場所にコピーし、維持する技術です。
例えば、あるサービスのデータが1つのサーバにしか保存されていないと、そのサーバが故障した場合、データが失われてしまいます。
しかし、データレプリケーションを行えば、別のサーバにもコピーが保存されているため、データを復旧できます。
レプリケーションの種類
- 同期レプリケーション: すべてのコピーが同時に更新されます。一貫性は高いですが、遅延が発生することもあります
- 非同期レプリケーション: 最初に1つのコピーが更新され、その後他のコピーに反映されます。パフォーマンスは良いですが、データの一貫性が一時的に損なわれることがあります
レプリケーション戦略
- マスター・スレーブモデル: 一つのマスターノードが更新を管理し、スレーブノードに変更を伝播します
- マルチマスターモデル: 複数のノードが同時にデータを更新できます
- ピア・ツー・ピアモデル: すべてのノードが対等で、どのノードもデータを更新可能です
データレプリケーションは信頼性や可用性を向上させますが、運用には課題も伴います。
この課題の1つに「CAP定理」があります。
CAP定理
CAP定理(Brewerの定理)は、分散システムで以下の3つの特性を同時に満たすことが不可能であると示しています。
- 一貫性 (Consistency, C): すべてのノードが同じデータを持つ状態。
- 可用性 (Availability, A): すべてのリクエストに対して応答を返せる状態
- 分割耐性 (Partition Tolerance, P): ネットワーク障害が起きてもシステムが動作を継続できる状態
この3つのうち2つは保証できますが、残りの1つは妥協する必要があります。
トレードオフの具体例
3つのうち2つしか保証できないとは、どういうことでしょうか?
例を紹介しながら説明していきます。
分割耐性(P)が保証されないパターン
2つのノード、ノードA
とノードB
からなる分散データベースがあります。
これらのノードは、データを複製し、一貫性を保つために連携しています。
つまり、Cが保証されている状態です。
通常、ノードA
とノードB
は、同じデータを保持し、ユーザーからのリクエストに対して即座に応答します。この状態では、両方のノードが最新のデータを持っているため、可用性(A)も保証されています。
【課題】
さて、ノードA
とノードB
の間のネットワーク接続が切断された場合を考えます。
2つのノードは互いに通信できなくなります。
もし、この状態で、引き続きシステムが稼働していると、ノードA
でのデータ更新があった場合、ノードB
はその情報を得られず、最新の情報を保持できなくなります。
その結果、ノードB
は最新データを保証できなくなり、ノードA
とノードB
のデータの一貫性も失われてしまいます。
つまり、一貫性(C)と可用性(A)が重視できなくなります。
これでは矛盾が生じるので、それを防ぐ(一貫性と可用性を重視する)には、システムを停止するしかありません。
これが、分割耐性が保証されていない(= ネットワーク切断によるノードの分割に対する耐性が低い状態)ということになります。
一貫性(C)が保証されないパターン
2つのノード、ノードA
とノードB
からなる分散データベースがあります。
これらのノードは、可用性(A)が保証され、ユーザーからのリクエストに対して即座に応答します。
ネットワーク障害があってもシステムを動作させるようにしています。
つまり、Pが保証されている状態になります。
【課題】
ノードA
とノードB
の間のネットワーク接続が切断されると、2つのノードは互いに通信できなくなります。
分割耐性(P)維持のため、システムは動作し続けるようになっており、可用性(A)維持のため、それぞれのノードは最新の情報を返却します。
しかし、ノードA
とノードB
は通信できていないため、それぞれが自分の最新情報を正しい情報として返却してしまい、一貫性(C)が失われてしまいます。
可用性(A)が保証されないパターン
2つのノード、ノードA
とノードB
からなる分散データベースがあります。
これらのノードは、データを複製し、一貫性を保つために連携しています。
Cが保証されています。
ネットワーク障害があってもシステムを動作させるようにしています。
Pも保証されています。
【課題】
ノードA
とノードB
の間のネットワーク接続が切断されると、2つのノードは互いに通信できなくなります。
分割耐性(P)維持のため、システムは動作させなければいけません。
このままシステムが動作し続けると、ノード間でデータが同期されず、一貫性(C)が失われてしまうため、ユーザからのリクエストに対してエラーを返却します。
エラー返却ということは、正確な情報をレスポンスできていないということ、つまり可用性(A)が失われることになります。
終わりに
今回は、分散システムにおけるデータレプリケーションとCAP定理について触れました。
分散システムの設計において、データの信頼性や可用性を高めるデータレプリケーションと、CAP定理によるトレードオフの理解は不可欠です。
分散システムは複雑に感じるかもしれませんが、まずは基本的な原則を押さえて、その仕組みや設計の意図をきちんと理解しましょう!