分散システムとは、さまざまなコンポーネントがネットワーク上の複数のコンピューター(または他のコンピューティングデバイス)に分散しているコンピューティング環境のことです。分散されたデバイスで作業を分担し、調整して行うため、1台のデバイスで行うよりも効率よくタスクを完了させることができます。
1台のコンピューターだけでは処理しきれないほど膨大で複雑な業務関連ジョブがますます増える中、分散システムはITやコンピューターサイエンスに大きな発展をもたらしているといえるでしょう。分散コンピューティングには、従来のコンピューティング環境にはないメリットもあります。分散コンピューティングでは単一障害点により生じるリスクが軽減され、システム全体の信頼性やフォールトトレランスが高まります。一般に、最新の分散システムはほぼリアルタイムで拡張できるように設計されており、追加のコンピューティングリソースをすばやく投入してパフォーマンスを向上させ、作業の完了までの時間をさらに短縮することができます。
これまで分散コンピューティングは高額で、さらに設定も複雑で、管理が容易ではありませんでした。しかし、拡張機能を提供するSoftware as a Service (SaaS)プラットフォームのおかげで、分散コンピューティングはより効率化され、企業の規模を問わず手頃な価格で利用できるようになりました。その結果、今ではデータベース管理からビデオゲームに至るあらゆる種類のコンピューティングジョブで、分散コンピューティングが活用されています。実際のところ、暗号通貨システム、科学的シミュレーション、ブロックチェーン技術、AIプラットフォームなどのソフトウェアは、こうしたプラットフォームなしにはまったく実現し得なかったことでしょう。
この記事では、分散システムの運用、分散プラットフォームの課題とリスク、そして分散コンピューティングが持つ数々のメリットについて紹介していきます。
分散システムとは:目次
分散システムは時間の経過とともに進歩してきました。今日最も主流となっている実装は、インターネット経由、より具体的にはクラウドを介して、動作するというものです。分散システムは、1つのタスクから始まります。たとえば、公開用の完成版ビデオをレンダリングするタスクがある場合、このタスクを管理しているWebアプリケーション(分散アプリケーション)が、クライアントコンピューター上のビデオエディターのように機能して、ジョブを分割します。この簡単な例では、アルゴリズムにより、ビデオの各フレームが12台の異なるコンピューター(またはノード)にそれぞれ割り当てられ、各コンピューターがフレームのレンダリングを行います。割り当てられたフレームのレンダリングが完了すると、管理アプリケーションがそのノードに別のフレームを再度割り当て、ノードでレンダリングが行われます。そして、ビデオ全体のレンダリングが完了し、すべての要素がつなぎ合わされてビデオが完成するまで、このプロセスが繰り返されます。このようなシステムでは、もちろんノードの数は12である必要はなく、数百、数千のノードにジョブを分散させて、1台のコンピューターでは数日かかるタスクを数分で完了させることができます。
現在、分散システムには多くのモデルやアーキテクチャが使用されています。クライアント/サーバーシステムはこれまで最も利用されてきた、シンプルなかたちの分散システムで、ネットワーク接続された多数のコンピューターが、データの保存や処理、その他の共通の目的のために中央サーバーと連携します。また、携帯電話ネットワークは高度な分散システムで、携帯電話、交換機、インターネットベースのデバイス間でワークロードを共有しています。さらに、同じソフトウェアを実行する数百、数千のコンピューターの間でワークロードを分散させるピアツーピアネットワークも、分散システムのアーキテクチャの一例です。今日の企業で使用されている最も一般的な分散システムは、Web上で動作し、クラウドベースの仮想サーバーインスタンスを使うものです。必要に応じてクラウドベースの仮想サーバーインスタンスを多数作成し、ワークロードを共有して、タスクの完了とともにインスタンスを終了させます。
分散システムは、一般に以下のような特徴と機能によって定義されます。
分散トレーシングは、分散リクエストトレーシングとも呼ばれ、一般に分散システム上にデプロイされたアプリケーション(通常、マイクロサービスアーキテクチャで構築されたアプリケーション)を監視する手法です。本質的には分散コンピューティングの一形態であり、分散システム上で実行されるアプリケーションの動作を監視する目的でよく使用されます。
トレーシングとは、ソフトウェアの開発や運用においてアプリケーションを通過するトランザクションの経過を追跡する機能です。たとえば、オンラインでのクレジットカード取引の場合、トランザクションが、顧客が購入を開始した時点から、検証と承認のプロセスを経て、トランザクションの完了に至るまでの軌跡を追跡します。トレーシングシステムはこのプロセスを段階的に監視し、開発者はこれによってアプリケーションのバグやボトルネック、遅延などの問題を見つけることができます。
現代のソフトウェアアーキテクチャは非常に複雑であるため、分散トレーシングは必要不可欠です。分散トレーシングシステムは分散サービスインフラストラクチャで動作するように設計されており、多くの同時接続ノードやコンピューティング環境にわたって複数のアプリケーションやプロセスを同時に追跡することができます。分散トレーシングがなければ、マイクロサービスアーキテクチャで構築され、大規模で複雑なシステム上(グローバルな分散システム環境など)で実行しているアプリケーションを、効果的に監視することはまず不可能でしょう。
ソフトウェア設計パターンとは、特定のコンテキストで発生するプログラミングの問題に対する理想的な解決策として定義されたプログラミング言語のことです。パターンは、一般的な問題に対する再利用可能な解決策であり、その時点で利用可能なベストプラクティスです。完成したコードは提供しませんが、レプリケーション機能と、特定の問題を解決する方法や必要な機能を実装するためのガイダンスを提供します。
分散コンピューティングプラットフォームの課題について考える際のコツは、その課題を相互に連携する一連のパターンに分解することです。システムをより小さく、より管理しやすく、より理解しやすいコンポーネントへと単純化していくことで、複雑なアーキテクチャを要約することができます。パターンは、Command and Query Responsibility Segregation (CQRS)やTwo-Phase Commit (2PC)などの分散システムを説明するためによく使用されます。分散システムの設計にはさまざまなパターンの組み合わせが使われますが、それぞれのアプローチには独自の長所と短所があります。
分散システムは、モノリシックなシステムと比較して、次のようなメリットがあります。
モノリシックなコンピューティング環境と比較した場合、分散システムはかなり複雑で、設計、運用、保守に関する課題が多くあります。具体的には、次のような課題が挙げられます。
上記に挙げた分散システムの課題に関連して、さまざまなリスクが生じます。具体的には、次のようなリスクが挙げられます。
分散コンピューティング環境でアクセス制御を管理するため、管理者は従来のアクセス制御リスト(ACL)からロールベースのアクセス制御(RBAC)まで、さまざまなアプローチを利用しています。分散システムにおける最も有望なアクセス制御メカニズムの1つは、属性ベースのアクセス制御(ABAC)です。これは、ユーザー、リクエストされたアクション、そのリクエストの環境に関する情報を含んだルールを使って、オブジェクトやプロセスへのアクセスを制御するというものです。また、ロールタイプをさらに詳細に定義して、特定の時間帯または特定の場所へのアクセスを制限するといったこともできます。
分散システムは、ワークロードが大きすぎて1台のコンピューターやデバイスでは処理できないといった場合に使用されます。また、サイバーマンデーのeコマースのトラフィックなど、ワークロードが変化しやすい状況にも役立ちます。今日では、インターネットに接続されたWebアプリケーションのほぼすべてが何らかのかたちで分散システム上に構築されています。
分散システムの代表例には、次のようなものがあります。
分散システムのデプロイは、LAN単位の小規模な単一部門へのデプロイから、グローバルレベルの大規模なデプロイまでさまざまです。デプロイの際には、デプロイ先の規模と全体的な複雑さに加えて、コンピューターネットワークの規模と容量、使用するデータの量、プロセスの実行頻度、プロセスがスケジュールされるかアドホックで実行されるか、システムにアクセスするユーザー数、データセンターのキャパシティ、データの精度と可用性の要件を考慮する必要があります。
これらの考慮事項に応じて、分散システムのデプロイは部門単位、小規模企業、中規模企業、大規模企業に分類できます。中規模企業と大規模企業を分ける正式な基準はありませんが、これらは、分散コンピューティングシステムを導入するために必要なリソースを見積もるための出発点となります。また、分散システムは、企業の成長や事業の拡張に合わせて、部門単位から小規模企業へと拡大することもできます。
今日のコンピューティングは、分散システムなしでは成り立たち得ないといっても過言ではありません。ワイヤレスネットワークやクラウドコンピューティングサービス、インターネットの運用に、分散システムは不可欠です。分散システムが存在しなければ、これらの技術も存在しなかったでしょう。
しかし、大規模で複雑な通信ネットワークを使用しない企業レベルの業務にも分散システムは必要なのでしょうか。ほとんどの場合、その答えは「イエス」です。分散システムは、モノリシックなシステムでは成し得ない方法で拡張性とパフォーマンスの向上を実現します。さらに、他のコンピューティングデバイスやプロセスの機能を活用することができるため、単一のシステムでは開発が困難もしくは不可能な機能を提供できます。
たとえば、サーバーやアプリケーションのオフサイトバックアップでは、マスターカタログで復元に必要なセグメントの一部が見つからない場合、他のオフサイドノードに依頼してそのセグメントを送信してもらうことができます。メールの送信、ゲーム、Webでのこの記事の閲覧など、今日、私たちがコンピューティングデバイスで行っているほぼすべてのことに、分散システムが活用されています。
当面の間、分散システムがコンピューティングの主流として優勢をふるうことは間違いありません。ほとんどすべてのタイプのアプリケーションやサービスが、何らかのかたちで分散コンピューティングを取り入れることになるでしょう。いつでもどこでも利用できるコンピューティングに対するニーズの高まりが、この傾向を後押ししています。さらに、日常的な業務にモバイルデバイスを利用するユーザーが増加していることも追い風となっています。今後、企業の開発者は、開発の効率化、システムやインフラの導入、運用の促進、アプリケーションの管理に、以前にも増して分散ツールを使用するようになり、グローバルコンピューティングにおける分散システムの重要性はますます確固たるものになっていくでしょう。