分散システムの基本
IT Chrissy Kidd分散システムは複雑に思えるかもしれませんが、幸いにもその概念を理解するのは簡単です。
分散システムとは、ネットワーク上に分散している複数のコンピューターやデバイスが、さまざまなタスクやコンポーネントを処理する環境の総称です。分散システム内の複数のコンポーネントが作業を分割して処理し、1台のデバイスで行う場合よりも効率的に作業ができるように負荷を調整します。
インターネットによって私たちはリモートで仕事ができるようになりました。また、今日の計算作業の多くは、1台のコンピューターでは処理できないほど複雑になっています。こうした現状を踏まえると、分散システムが増え続けているのも当然の流れだと言えます。異なる地域やチームで効率的に仕事ができるというのはとても大きな利点です。分散システムがなければ、できることがほとんどなくなってしまいます。
この記事では、分散システムの運用、分散プラットフォームの課題とリスク、そして分散コンピューティングが持つ数々のメリットについて紹介します。
分散システムとは?
かつての分散コンピューティングは高額で、設定も複雑であり、管理も容易ではありませんでした。しかし、Software as a Service (SaaS)ソリューションのおかげで、分散コンピューティングはより効率化され、企業の規模を問わず手頃な価格で利用できるようになりました。
その結果、今ではデータベース管理からビデオゲームに至るあらゆる種類のコンピューティングジョブで、分散コンピューティングが活用されています。実際のところ、暗号通貨システム、科学的シミュレーション、ブロックチェーン技術、AIプラットフォームなどのソフトウェアは、こうしたプラットフォームなしにはまったく実現し得なかったことでしょう。
分散システムは、ワークロードが大きすぎて1台のコンピューターやデバイスでは処理できないといった場合に使用されます。また、サイバーマンデーのeコマースのトラフィックや、貴社の発表に反応して発生する多くのWebトラフィックなど、ワークロードが変化しやすい状況でも分散システムが重要になります。
分散システムは、他のコンピューティングデバイスやプロセスの能力を活用できるため、単一のシステムでは開発が困難または不可能な機能を提供することができます。
たとえば、サーバーやアプリケーションのオフサイトバックアップでは、マスターカタログで復元に必要なセグメントの一部が見つからない場合、他のオフサイトノードに依頼してそのセグメントを送信してもらうことができます。メールの送信、ゲーム、Webでのこの記事の閲覧など、今日、私たちがコンピューティングデバイスで行っているほぼすべてのことに、分散システムが活用されています。
分散システムの一般的な例には、次のようなものがあります。
- モバイル通信とインターネットの両方をサポートする通信ネットワーク
- グラフィックやビデオレンダリングシステム
- タンパク質フォールディングや遺伝子研究などの科学計算
- 航空会社やホテルの予約システム
- マルチユーザー用ビデオ会議システム
- 暗号通貨処理システム(ビットコインなど)
- ピアツーピアのファイル共有システム
- 分散コミュニティコンピューティングシステム
- マルチプレーヤービデオゲーム
- グローバルな分散小売業者やサプライチェーン管理
分散システムの実例
分散システムは、1つのタスクから始まります。たとえば、完成版ビデオをレンダリングするタスクがあると仮定しましょう。
このタスクを管理しているアプリケーション(分散アプリケーション)が、クライアントコンピューター上のビデオエディターのように機能して、ジョブを分割します。この簡単な例では、アルゴリズムにより、ビデオの各フレームが12台の異なるコンピューター(ノード)にそれぞれ割り当てられ、各コンピューターがフレームのレンダリングを行います。割り当てられたフレームのレンダリングが完了すると、管理アプリケーションがそのノードに別のフレームを再度割り当て、ノードでレンダリングが行われます。そして、ビデオ全体のレンダリングが完了し、すべての要素がつなぎ合わされてビデオが完成するまで、このプロセスが繰り返されます。
このようなシステムでは、もちろんノードの数は12である必要はなく、数百、数千のノードにジョブを分散させて、1台のコンピューターでは数日かかるタスクを数分で完了させることができます。
分散コンピューティングプラットフォームの課題について考える際のコツは、その課題を相互に連携する一連のパターンに分解することです。システムをより小さく、より管理しやすく、より理解しやすいコンポーネントへと単純化していくことで、複雑なアーキテクチャを抽象化できます。パターンは、以下のような分散システムを説明するためによく使用されます。
- CQRS (Command Query Responsibility Segregation:コマンドクエリ責任分離)
- 2PC (Two-Phase Commit:2相コミット)
分散システムの設計にはさまざまなパターンの組み合わせが使われますが、それぞれのアプローチには独自の長所と短所があります。
分散システムの種類
現在、分散システムには多くのモデルやアーキテクチャが使用されています。
- クライアント/サーバーシステムは、これまで最も利用されてきたシンプルなかたちの分散システムで、ネットワーク接続された多数のコンピューターが、データの保存や処理、その他の共通の目的のために中央サーバーと連携します。
- ピアツーピアネットワークは、同じソフトウェアを実行する数百、数千のコンピューターの間でワークロードを分散させます。
- 携帯電話ネットワークは高度な分散システムで、携帯電話、交換機、インターネットベースのデバイス間でワークロードを分担しています。
ここまで読んだ皆さんは、次のことに気がつくでしょう。現代において最も一般的な分散システムは、インターネットを介して動作しており、大量のクラウドベースの仮想サーバーインスタンスにワークロードを振り分けるタイプのものです。こうしたインスタンスは必要に応じて作成され、タスクが完了すると終了します。
分散システムの主な特徴
これまでの説明で、分散システムの概要について理解していただけたと思います。次はその特徴について見てみましょう。効果的な分散システムは一般的に次のような特徴を備えています。
拡張性:分散システムに欠かせない機能として、ワークロードのサイズの増加に合わせて拡張できる能力が挙げられます。必要に応じてネットワークに処理ユニットやノードを追加することでこれを行います。
同時実行性:分散システムのコンポーネントは同時に実行されます。また、「グローバルクロック」がないという特徴があり、タスクは順不同、かつ異なる速度で処理されます。
可用性とフォールトトレランス:1つのノードに障害が起きた場合でも、残りのノードは動作し続けることができ、全体的な処理は中断されません。
異種混合性:ほとんどの分散システムにおいて、ノードやコンポーネントはそれぞれ別のハードウェア、ミドルウェア、ソフトウェア、オペレーティングシステムを持ち、多くの場合、互いに同期していません。こうした特性により、新しいコンポーネントを追加して分散システムを拡張することができます。
レプリケーション:分散システムでは情報共有やメッセージングが可能になり、それにより、ソフトウェアやハードウェアコンポーネントなどの冗長なリソース間の整合性が保たれ、フォールトトレランス、信頼性、アクセシビリティが向上します。
透明性:エンドユーザーは、分散システムを、その潜在的な部分を意識せずに、単一のコンピューティングユニットとして見ることができ、システムのアーキテクチャを気にすることなく、1つの論理デバイスとしてデータをやりとりできます。
分散システムのメリット、課題、リスク
分散システムは、モノリシックなシステムと比較して、次のような多数のメリットがあります。
- 拡張性と柔軟性:サービスのニーズに合わせて容易にコンピューティング能力を増やすことができます。現在のほとんどの分散システムではサーバーを即座に追加できるため、パフォーマンスを高め、処理が完了するまでの時間を短縮できます。
- フォールトトレランス:分散コンピューティングでは単一障害点によるリスクが軽減され、システム全体の信頼性やフォールトトレランスが高まります。
- 信頼性:分散システムを適切に設計すると、1つ以上のノードに障害が起きた場合でも、パフォーマンスに深刻な影響を与えることなくそれに耐えることができます。モノリシックなシステムでは、サーバーがダウンするとアプリケーション全体がダウンしてしまいます。
- スピード:トラフィック量が増えていずれかのサーバーの速度が低下すると、全ユーザーのパフォーマンスに影響するおそれがあります。分散データベースやその他の分散システムでは、その優れた拡張性により、パフォーマンスを容易に高いレベルに保ち、それを持続させることができます。
- 地理的分散:分散コンテンツ配信は、インターネットユーザーにとっては直感的なものであり、グローバル企業にとっては極めて重要な機能です。
モノリシックなコンピューティング環境と比較した場合、分散システムはかなり複雑で、設計、運用、保守に関する課題が多くあります。たとえば、以下のような課題です。
障害が発生する可能性の増加:コンピューティング環境に追加するシステムが増えるほど、障害が発生する可能性が高くなります。システムが慎重に設計されていなければ、1つのノードがクラッシュすると、システム全体がダウンしかねません。分散システムはフォールトトレラント設計ではあるものの、フォールトトレランスは自動でも、絶対確実なものでもありません。
同期プロセスに関する課題:分散システムはグローバルクロックなしで動作するため、エラーやデータ破損の原因となる伝送遅延を防ぐため、プロセスを適切に同期させるように注意深いプログラミングが求められます。マルチプレーヤービデオゲームなどの複雑なシステムでは、同期が難しい場合があります。これは特に、データトラフィックを運ぶパブリックネットワークで顕著になります。
不十分な拡張性:分散システムのノード数を2倍にしても、必ずしもパフォーマンスが2倍になるわけではありません。拡張性を最大限に高める効果的な分散システムを設計するには、ロードバランシングや帯域幅管理、その他の問題を考慮する必要があり、複雑な作業となります。
より複雑なセキュリティ:異種環境やグローバルな分散環境で多数のノードを管理する場合、セキュリティ上の課題が数多く生じます。ファイルシステムや大規模な分散システムネットワークに弱点が1つあるだけで、システム全体が攻撃にさらされる可能性があります。
複雑さの増大:従来のコンピューティング環境に比べ、分散システムの設計、管理、把握は、はるかに複雑です。
こうした分散システムの課題に関連して、さまざまなリスクが生じます。
- セキュリティ:分散システムの攻撃に対する脆弱性は他のシステムと同程度ですが、分散という性質上、組織を脅威にさらす攻撃対象ははるかに大きくなります。
- ネットワーク障害のリスク:分散システムはデータの送受信をパブリックネットワークに依存しています。そのため、インターネットの1つのセグメントが使用できなくなったり、過負荷になったりすると、分散システムのパフォーマンスが低下するおそれがあります。
- ガバナンスとコントロールの問題:分散システムには、単一サーバーベースのモノリシックなシステムが備えているガバナビリティが欠けているため、データプライバシー保護法に関する監査や遵守の問題を引き起こしています。グローバルな分散環境では、一定水準の保証を提供したり、データの保存場所を正確に把握したりすることが難しくなります。
- コスト管理:一元化されたシステムとは異なり、分散システムでは、その優れた拡張性のおかげで、必要に応じて簡単に容量を追加できます。ただし、その分コストもかさみます。クラウドベースの分散コンピューティングシステムの価格は、使用量(時間の経過とともに消費されるメモリリソースやCPUの数など)に基づいて設定されており、使用量が急増すると多額の請求が発生しかねません。
実際に分散システムを設定する場合に役立つヒント
分散システムの導入は、LAN単位の小規模な単一部門への導入から、グローバルレベルの大規模な導入までさまざまです。導入の際には、規模や全体の複雑さのほかに、以下のような考慮事項があります。
- コンピューターネットワークの規模と容量
- 使用するデータの量
- プロセスの実行頻度、およびプロセスがスケジュールとアドホックのどちらで実行されるか
- システムにアクセスするユーザー数
- データセンターのキャパシティ
- 必要なデータの忠実度と可用性の要件
分散システムの導入は部門単位、小規模企業、中規模企業、大規模企業に分類できます。正式な分類ではありませんが、これらは、分散コンピューティングシステムを導入するために必要なリソースを見積もるための出発点となります。
また、分散システムは、企業の成長や事業の拡張に伴い、部門単位から小規模企業へと拡大していく可能性があります。
分散システム内の動きを追跡する
分散システムには多くのメリットがあるものの、複雑でもあります。そこでシステム内で何が起きているかを知ること(つまりシステムのオブザーバビリティ)ができれば、さらに大きなメリットを得ることができます。幸いにも、分散トレーシングによってオブザーバビリティを確保することができます。
分散トレーシングがなければ、グローバルな分散システム環境を効果的に監視することはまず不可能でしょう。
分散トレーシングは、分散リクエストトレーシングとも呼ばれ、一般に分散システム上にデプロイされたアプリケーション(通常、マイクロサービスアーキテクチャで構築されたアプリケーション)を監視する手法です。本質的には分散コンピューティングの一形態であり、分散システム上で実行されるアプリケーションの動作を監視する目的でよく使用されます。
トレーシングとは、ソフトウェアの開発や運用においてアプリケーションを通過するトランザクションの経過を追跡する機能です。たとえば、オンラインでのクレジットカード取引の場合、顧客が購入を開始した時点から、検証と承認のプロセスを経て完了に至るまで、トランザクションの軌跡を追跡します。トレーシングシステムはこのプロセスを段階ごとに監視します。開発者はこれによってアプリケーションのバグやボトルネック、遅延などの問題を見つけることができます。
現代のソフトウェアアーキテクチャは非常に複雑であるため、分散トレーシングは必要不可欠です。分散トレーシングシステムは分散サービスインフラストラクチャで動作するように設計されており、多くの同時接続ノードやコンピューティング環境にわたって複数のアプリケーションやプロセスを同時に追跡することができます。
分散システムへのアクセス制御の導入
分散コンピューティング環境でのアクセス制御を管理するため、管理者は従来のアクセス制御リスト(ACL)からロールベースのアクセス制御(RBAC)まで、さまざまなアプローチを利用しています。
分散システムにおける最も有望なアクセス制御メカニズムの1つは、属性ベースのアクセス制御(ABAC)です。これは、ユーザー、リクエストされたアクション、そのリクエストの環境に関する情報を含んだルールを使って、オブジェクトやプロセスへのアクセスを制御するというものです。また、ロールタイプをさらに詳細に定義して、特定の時間帯または特定の場所へのアクセスを制限するといったこともできます。
分散システムは今後も主流
当面の間、分散システムがコンピューティングの主流として優勢をふるうことは間違いありません。ほとんどすべてのタイプのアプリケーションやサービスが、何らかのかたちで分散コンピューティングを取り入れることになるでしょう。いつでもどこでも利用できるコンピューティングに対するニーズは、今後も衰えることはないでしょう。
関連記事

ITイベント分析の完全ガイド

従来のAppからIT Essentials Workに移行すべき理由
