成長するWebサービスと大規模データ⁠その密接な関係とは

大規模なWebサービスは何が難しいの?

Webサービス全盛の今、サービスの成長に伴い、扱うデータは刻々と増え続けています。とあるWebアプリケーションが注目を浴びユーザの人気を集める過程で、大きなテーマとして浮かび上がるのが「データ量」です。とはいえ、大規模データも単なるデータ、一体何が難しいのでしょうか?

データの通り道とデバイス間の速度差

計算機(コンピュータ)は、ディスク(ハードディスク、HDD)からデータをロードしメモリにストア、メモリにストアされたデータをCPUがフェッチ(fetch)して何らかの処理を行います。またメモリからフェッチされた命令は、より高速なキャッシュメモリにキャッシュされます。このようにデータは、ディスク→メモリ→キャッシュメモリ→CPUといくつかの層を経由して処理されていきます。

この計算機の各層の間には非常に大きな速度差があるのが近年の計算機の特徴です。ハードディスクからデータを読み取るにはその構造上、ヘッドの移動や円盤の回転といった物理的動作が伴います。そのため、電気的に読み取るだけでいいメモリやキャッシュメモリからのデータの読み取りと比較すると10の6乗~10の9乗もの速度差が生まれます。

この速度差を吸収するため、OSはあの手この手を使います。たとえばディスクからロードしたデータをメモリでキャッシュしておくなどを行い、全体としてデバイス間の速度差を体感速度に影響を与えないようにしています。DBなどのミドルウェアも、基本この速度差を意識したデータ構造、実装を採用しています。

データ量の増大、大規模サービスの難所

OSやミドルウェアなどのソフトウェアが頑張るとは言っても、当然限界はあります。データ量が多くなると、そもそもキャッシュミスが多発し結果として低速なディスクへI/Oが多く発生するようになります。ディスクI/O待ちに入ったプログラムは、他のリソースが空いていても読み取りが完了するまで次の処理を行うことができません。これがシステム全体の速度低下を招きます。

大規模Webアプリケーションを運用するにあたっての苦労の多くは、この大規模データの扱いに集約されます。データが小さいうちはとくに工夫をしなくてもすべてメモリで処理できますし、複雑なアルゴリズムを使うよりもナイーブなアルゴリズムのほうがオーバーヘッドがないため速いこともままあって、I/O負荷などはまず問題となりません。しかし、サービスが成長しある程度以上の規模になるとデータは一気に増加します。このデータ量が分水域を超えたところで問題が顕在化します。そしてその対策は応急処置ではなかなかに難しい。ここが大規模サービスの難所です。

いかにしてデータを小さく持つか、複数サーバに分散させるか、必要なデータを最小限の回数で読み取るか... そこが本質的な課題になります。たしかに複雑な大規模データではありますが、現行の多くのユーザを集めている数々のサービスでは問題を取り除き止まらない十分に快適なサービスが実現されています。成長するサービスにとって非常に重要な側面を持つ大規模データ。その性質を知り取り扱いのコツを押さえて、柔軟に対応できるよう準備しておきたいものです。

『⁠⁠Web開発者のための]大規模サービス技術入門 ――データ構造、メモリ、OS、DB、サーバ/インフラ⁠⁠、第1回「大規模Webサービスの開発オリエンテーション」の内容を元に一部改変。