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