スケーラビリティを向上させるためには?4つのアプローチ方法を紹介

スケーラビリティを向上させるためには?4つのアプローチ方法を紹介

皆さんこんにちは、システム部エンジニアのシカです。
GMOリサーチでは、毎日数百万のトラフィックを処理するために、様々なアプローチでスケーラビリティを実現しています。

システムを開発するために、スケーラビリティを意識することは重要で、自分自身がレベルアップするためにも欠かせない知識だと思っています。今回の記事では、そのスケーラビリティを実現するための方法について、調べたことを紹介していきます。

スケーラビリティとは?

まず、スケーラビリティとは利用者や仕事の増大に適応できる能力・度合いのことを指します。電気通信やソフトウェア工学において、システムまたはネットワークまたはアルゴリズムの、持つべき望ましい特性の1つで、一種の拡張性のことです。
※参照:Wikipedia

システムは利用者、データ、トラフィックが増加しても性能を下げたり、信頼性を失うといった犠牲を払うことなく、扱える必要があります。SNSのプラットフォームやeコマース、Webサイト、モバイルアプリなど大幅な成長が見込まれるシステムには特にこの拡張性が必要になります。

スケーラビリティを高める手法①負荷分散

システムのパフォーマンスと可用性は、負荷分散によって向上します負荷分散とは、システムにかかる負荷を複数のサーバーに分散させ、1つのサーバーに負担が集中することを防ぎ、システム全体がトラフィック増加に対応しやすくするための方法です。

負荷分散には、ハードウェアベースとソフトウェアベースがあり、IPハッシュ、最小接続、ラウンドロビンなど、様々な方法を使用して負荷を分散させることができます。

複数のサーバーにトラフィックを分散させ、1つのサーバーに負荷がかからないようにすることで、より多くのリクエストを処理し、より迅速に対応することができます。負荷分散は、サーバーがダウンしていることを自動的に識別し、アクセス可能な別のサーバーにトラフィックを転送することで、冗長性を提供することもできます。

また、NGINXやHAProxyなどのソフトウェアベースのロードバランサーの利用は、よく知られる負荷分散方法の1つです。これらの解決法が提供する柔軟性とシンプルさにより、エンジニアはシステムの要件に合わせて負荷分散アルゴリズムを変更することができます。さらに、仮想マシンやコンテナーにインストールすることもできるため、水平スケーリングも簡単になります。
※水平スケーリング:同種のリソースをシステムへ追加投入してパフォーマンスを向上させること。

※引用:「Nginxによるロードバランサーでサーバーの負荷分散をする

スケーラビリティを高める手法②キャッシュ

アクセスするユーザー数が増えると、負荷分散を行う複数のサーバー間でのオーバーヘッドが増大し、レスポンスタイムが遅くなることがあります。そのため、このような場合にはキャッシュを利用することが有効な解決策となります。

キャッシュとは、データベースへの負荷を軽減し、システムの速度を向上させるために、頻繁にリクエストされるデータをメモリに保存することを言い、データベースからデータを取得するのにかかる時間を短縮させられるため、 システム効率を高めるための一般的な戦略とされています。頻繁に使用されるデータをメモリに格納することで、リクエストに迅速に対応し、ユーザーの応答時間を短くすることができます。また、キャッシュを利用することでデータベースへの負荷が軽減され、より多くのリクエストを処理できるようになります。

キャッシュは、アプリケーション、Web サーバー、データベースなど、いくつかのシステムレベルで実行することができます。また、メモリ内キャッシュ、ページ キャッシュ、CDN キャッシュなど、さまざまな形式があります。ページ キャッシュはページ出力全体をキャッシュするのに対し、メモリ内キャッシュはアプリケーションのメモリにデータを保存します。CDNキャッシュは、サーバーの負担を軽減するために、写真やビデオなどの静的アセットをコンテンツ配信ネットワーク(CDN)に格納します。

ですが、キャッシュの実装は、キャッシュ内のデータがデータベースと一貫性のある同期がされているかを確認する必要があるため、困難な場合があります。

スケーラビリティを高める手法③分散ファイルシステム

分散ファイルシステムとは、複数のホストがコンピュータネットワークを経由して共有しつつ、ファイルにアクセスすることを可能にするファイルシステムのことです。
参照:「Wikipedia

ファイルはどのシステムからでも閲覧できるため、分散ファイルシステムによって、可用性と拡張性が向上します。Hadoop 分散ファイルシステム (HDFS)、Google ファイルシステム (GFS)、Amazon S3 は、分散ファイルシステムの一例です。

分散ファイルシステムはどのシステム機器からでもアクセスできるため、大容量のデータを管理することが可能です。複数の機器にファイルを分散させることで、1台の機器で管理するよりも多くのデータを管理することができます。分散ファイルシステムは冗長性を提供することもできます。そのため、1台以上のマシンに障害が発生した場合でもファイルを引き続き使用できます。

例えば、ビッグデータアプリケーションでよく利用されるHadoop分散ファイルシステム(HDFS)は、よく知られている分散ファイルシステムの1つです。大量のデータを扱うことを目的として作られた HDFS は、高い可用性と障害耐性の特徴があります。また別の例として、クラウド上で利用可能なオブジェクトストレージサービスのAmazon S3は、任意のデータ量を保存および取得でき、システムやサービスが必要に応じて自動的に拡張することができる設計となっています。

スケーラビリティを高める手法④シャーディング

データは、シャーディングと呼ばれるデータベース分割技術を使って、より小さなパーツに分割され、他のワークステーションに分散されます。データのサブセットは各機器に格納され、システムは関連するシャードにアクセスしてクエリに応答できます。システムは、多数の機器にデータを分散配置させるシャーディングと呼ばれる水平スケーリングの手法を用いることで、大規模なデータ量を管理することができます。

ただし、シャーディングには、複数のシャード間のデータの整合性を確保しなければならないなど、新たな問題が生じます。クエリが複数のシャードからのデータを必要とする場合、システムは全ての関連シャードからデータを取得し、その結果を組み合わせる必要があります。大規模なデータセットを扱う場合、この方法は面倒で時間がかかる可能性があります。シャーディングは、レンジベース、ハッシュベース、ロケーションベースのシャーディングなど、さまざまな方法で実行できます。顧客IDや日付範囲など、変化の範囲に応じてデータを分割するのがレンジベースシャーディングです。ハッシュベースのシャーディングは、顧客 ID や商品 ID などの特定のカラムを使用してデータを断片化します。ロケーションベースのシャーディングを使用する場合、データはユーザーまたは機器の場所に基づいてデータが分割されます。

結論

スケーラビリティを実現するのは非常に難しい事ですが、システム設計の重要な要素です。スケーラビリティを実現するために、エンジニアは負荷分散、キャッシュ、分散ファイルシステム、シャーディングなどのさまざまなアプローチを採用しています。それぞれの手法には長所と短所があるため、特定のシステムに対して最適な手法を選択するためにはトレードオフを理解することが重要です。

スケーラブルなシステムを設計する際には、システムの要件、アーキテクチャ、予測されるシステムの成長性を考慮することが重要となります。スケーラビリティは、後から追加するのではなく、最初にシステムに組み込んでおく必要があります。 システムを正常に拡張し続けるためには、必要に応じてそのパフォーマンスを監視し、調整することも重要です。

結論として、大幅な成長が見込まれるシステムを成功させるためは、ワークロードやユーザーリクエスト等の急激な変化に対応できるシステムである事が必要になります。エンジニアは、この記事で説明した原則を適用することで、パフォーマンスや信頼性を犠牲にすることなく、増大するトラフィック、データ、およびユーザーを処理できるシステムを構築することができます。細心の注意を払い、慎重な計画を立てることで、ゼロから数百万人ものユーザーを対象としたシステムを構築することができます。

読んでいただきありがとうございました。

参考文献:「System Design Interview

前の記事
«
次の記事
»

技術カテゴリの最新記事