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