分散システムの基礎
調整、一貫性、フォールトトレランス、そしてトレードオフといった分散システムの基本概念を理解する。
システムが分散化する理由
単一サーバーは小規模では機能しますが、実際のシステムはトラフィック、データ量、信頼性の要求によってそれを超えて成長します。
- 1台のマシンには、CPU、メモリ、ストレージ、ネットワーク帯域に厳しい制限があります。
- データ量とトラフィックの増加により、垂直スケーリングでは維持できないパフォーマンスのボトルネックが生じます。
- 単一サーバー構成では単一障害点が生まれ、高可用性を実現できません。
詳細
多くのシステムは、構築と管理が簡単なため、単一サーバーから始まります。小規模であれば、1台のマシンでリクエストの処理、ロジックの実行、データの保存を複雑さをあまり伴わずに行えます。
利用が増えると、このモデルは限界に達します。トラフィックの増加はレイテンシの上昇とリソース枯渇を招き、データセットの肥大化はクエリを遅くし、ストレージシステムに負荷をかけます。
信頼性も大きな問題になります。その1台のサーバーが故障すると、システム全体が停止します。継続的な可用性が必要なシステムでは、これは受け入れられません。
これらの制約を克服するために、システムは複数のマシンに処理を分散します。1台のサーバーに依存するのではなく、ワークロードを共有することでスケーラビリティとフォールトトレランスを実現しますが、その代わりに調整と整合性という新たな課題が生まれます。
分散システムとは
分散システムとは、ネットワークを介して連携し、1つのシステムのように動作する複数の独立したマシンのことです。
- 各マシン(ノード)は、それぞれ独自のメモリとリソースを持ち、独立して動作します。
- ノードは共有メモリではなく、ネットワーク呼び出しを通じて通信します。
- システムは、ユーザーには1つの統合されたサービスとして見えるように設計されています。
詳細
分散システムでは、複数のサーバーが協力してリクエストを処理し、データを保存し、ロジックを実行します。各サーバーは別々のマシンであり、しばしば異なる場所で動作していますが、ユーザーの視点ではまとめて1つのシステムを構成しています。
単一マシンのシステムとは異なり、これらのノードはメモリを共有しません。その代わりに、ネットワーク越しにメッセージを送って通信するため、遅延や障害の可能性が生じます。
そのため、調整が非常に重要になります。ノードは、データ値やシステムの判断などの共有状態について合意しなければなりません。たとえ物理的には離れていてもです。
重要な課題は、遅延、障害、ネットワーク越しの部分的な可視性がある中で、この独立したマシンの集まりを、1つのシステムとして一貫性と信頼性を持って動作させることです。
レプリケーション
レプリケーションは、可用性、フォールトトレランス、読み取り性能を向上させるために、複数のマシン間でデータを複製します。
- データはプライマリノードから1つ以上のレプリカノードへコピーされます。
- 1つのノードが故障しても、他のレプリカがリクエストの処理を継続できます。
- 読み取りリクエストはレプリカ間で分散でき、負荷を軽減できます。
詳細
レプリケーションは、同じデータを複数のマシンに保存する分散システムの中核的な技術です。通常、1つのノードがプライマリとして書き込みを担当し、他のノードはデータのコピーを受け取るレプリカとして動作します。
この構成により信頼性が向上します。プライマリまたは任意のレプリカが故障しても、システムは残りのノードを使って動作を継続でき、ダウンタイムを減らせます。
レプリケーションは、特に読み取りが多いシステムで性能も向上させます。すべての読み取りリクエストを1台のマシンに送る代わりに、リクエストを複数のレプリカに分散できます。
ただし、レプリケーションには複雑さも伴います。更新を各ノードへ伝播させる必要があり、同期の遅延によってレプリカ間に一時的な不整合が生じることがあります。
パーティション耐性
パーティション耐性とは、ネットワークの一部が通信できなくなってもシステムが動作を続けることを意味します。
- ネットワーク障害によって、システムが孤立したノードのグループに分断されることがあります。
- ノードは動作を続けていても、互いに通信できない場合があります。
- システムは、完全に停止することなく、これらの障害に対処しなければなりません。
詳細
分散システムでは、マシンはネットワーク越しに通信しますが、ネットワークは本質的に信頼性が低いものです。接続が切れたり、メッセージが遅延したり、システム全体の一部に到達できなくなったりすることがあります。
ネットワークパーティションは、ノードが互いに通信できないグループに分断されるときに発生します。たとえば、Server A はネットワーク障害のために Server B に到達できないことがありますが、両方ともまだ稼働しています。
これにより、根本的な課題が生まれます。パーティションの各側は独立してリクエストを処理し続ける可能性があり、その結果、状態の不整合が発生することがあります。
パーティション耐性とは、ノード間の調整が一時的に不可能になることを受け入れつつ、こうした障害があっても動作を継続できるようにシステムを設計することを意味します。
分散システムにおける一貫性
一貫性は、分散システム内のすべてのノードが同じデータを同じ時点で見るかどうかを定義します。
- 強い一貫性では、すべての読み取りが全ノードにわたる最新の書き込みを返します。
- 結果整合性では、一時的な差異を許容しますが、時間の経過とともに収束することを保証します。
- より高い一貫性は、多くの場合、可用性やパフォーマンスの低下を伴います。
詳細
分散システムでは、データは複数のマシンに複製されることが多く、そのデータを同期し続けるという問題が生じます。一貫性は、それらのレプリカがある時点でどれだけ揃っているかを定義します。
強い一貫性では、一度書き込みが発生すると、その後のすべての読み取りは、どのノードにアクセスしても、更新された値を即座に返します。これにはノード間の緊密な調整が必要です。
結果整合性では、更新は時間をかけて伝播します。書き込みの後、一部のノードは一時的に古いデータを返すことがありますが、最終的にはすべてのノードが同じ状態に収束します。
このトレードオフは避けられません。厳密な一貫性を強制するシステムは、特にネットワーク遅延や障害がある場合、パフォーマンスや可用性を犠牲にすることがよくあります。
CAP定理
CAP定理は、分散システムが一度に保証できる特性は3つのうち2つだけであることを示しています。それは、一貫性、可用性、分断耐性です。
- 一貫性とは、すべてのノードが同じ最新のデータを返すことを意味します。
- 可用性とは、障害が発生している間でも、すべてのリクエストが応答を受け取ることを意味します。
- 分断耐性とは、ネットワーク分断が起きてもシステムが動作を続けることを意味します。
詳細
CAP定理は、分散システムにおける厳しい制約を表しています。ネットワーク分断が発生したとき、完全な一貫性と完全な可用性を同時に維持することはできません。
一貫性を保つには、ノード間の調整が必要です。すべての読み取りで最新の書き込みを返すには、ノードが現在の状態について合意する必要があり、そのためにネットワーク越しの通信を待つ必要がある場合があります。
一方で、可用性は応答性を優先します。いくつかのノードに到達できなくてもシステムはリクエストを処理し続けますが、その結果、古いデータや不整合なデータを返すことがあります。
分断耐性は、実際のシステムでは避けられません。どんな現実のシステムでもネットワーク障害は起こるためです。そのため、システムはトレードオフを迫られます。分断中は、一貫性を保つために応答を遅らせるか、すぐに応答して一時的な不整合を受け入れるかのどちらかを選ばなければなりません。
分散協調
分散協調は、複数のノードが共有された決定とシステム状態について合意することを保証します。
- ノードは、競合や不整合なシステム動作を避けるために協調する必要があります。
- 一般的なパターンには、リーダー選出、分散ロック、コンセンサスがあります。
- ZooKeeper、etcd、Consul のような専用システムは、協調を信頼性高く処理します。
詳細
分散システムでは、複数のノードが独立して動作しますが、多くの操作では協調して動くことが必要です。協調がないと、ノード同士が矛盾する決定を行い、不整合なデータやシステム障害につながる可能性があります。
リーダー選出は、1つのノードを選んで意思決定や重要なタスクを担当させる一般的なパターンです。これにより、複数のノードが同じ操作を同時に実行することを防げます。
分散ロックは、単一マシンの並行処理におけるロックと同様に、1つのノードだけが共有リソースに同時にアクセスまたは変更できるようにしますが、ネットワーク全体にわたって実装されます。
コンセンサスアルゴリズムはさらに進んで、障害が存在してもノードがある値や決定について合意できるようにします。ZooKeeper、etcd、Consul のようなツールは、これらの協調メカニズムを提供するため、エンジニアはゼロから実装する必要がありません。
分散システムの課題
分散システムは、単一マシンのシステムには存在しない障害モードと複雑さをもたらします。
- ネットワーク障害と遅延により、通信は信頼できず予測しにくくなります。
- 複製されたデータは、ノード間で一時的に不整合になることがあります。
- 複数のマシンを調整することで、設計の複雑さが大幅に増します。
詳細
システムが分散されると、ネットワーク上で動作しなければならず、ネットワークは本質的に信頼性が低いものです。メッセージは遅延したり、失われたり、順不同で届いたりするため、単純な操作でも推論がずっと難しくなります。
データの一貫性も課題になります。複製があると、特に負荷が高い場合やネットワーク遅延がある場合に、異なるノードが同じデータの異なるバージョンを持つことがあります。
ノード間の調整は、さらに別の難しさを加えます。複数のマシンが共有状態について合意したり、タスクを正しい順序で実行したりするには、複雑なプロトコルと慎重な設計が必要です。
これらの課題は例外的なケースではなく、本質的なものです。こうした問題があっても正しく信頼性の高いシステムを設計することが、分散システム工学が解決しようとする中心的な問題です。
質問セクション
1 / 5
このレッスンはプレミアムコンテンツです
プレミアムにアップグレードしてぼかしを解除し、全文を読めるようにしましょう。