「Web開発者のための大規模サービス技術入門」を読んだ

Web開発者のための大規模サービス技術


はてなさんの技術知識/ノウハウが詰まった大規模Webサービスを支えるための技術書。著者/編集者様より献本いただきました。id:naoyaさん、id:stanakaさん、そして技術評論社さん、ありがとうございます!

[Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ)

[Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ)


このブログでもお世話になっている、はてなさんのWebサービスは今や月間ユニークユーザ数は1500万人超とのこと。大きなトラフィックを支える多くの技術要素は一日一晩で身につくものではありません。この書籍では、はてなのサービスを題材として、大規模Webサービスを運営する上での知識やノウハウについて、非常に丁寧に解説されています。

書籍の最初の方でも記載されていますが、この本では所謂、開発・運用上でのハウツーについてはあまり触れられておらず、大規模サービスを開発・運用していく上での基本的な考え方といった概論や、大規模なデータ・トラフィックを捌く上で、実際に苦労された課題に対して、どのような知識が必要で、どう取り組んできたのかの解決例、といった開発・運用上の"コツ"や"戦略"が散りばめられています。


元々は、はてなのインターンシップでの講義をベースとした解説書ということで、原理等、一般論も含めた"教科書"のような構成になっていて、大規模Webサービス運営に関わっている方はもちろん、これからWebサービスの開発や運用に触れようとする技術者の方にもオススメです。こうした大規模Webサービスを作る上で、考えなければいけないポイントや注意点、どう向き合っていくべきかといった戦略までを体系的に学べる書籍は、ほとんど無かったので非常に私も勉強になりました。

以下が本書の目次(サイトから引用)です。あらゆるレイヤの視点から体系的に網羅されていることがわかっていただけるかと思います。

* 第1回 大規模Webサービスの開発オリエンテーション―全体像を把握する
  + Lesson 0 本書の源 ―本書で説明すること,しないこと
  + Lesson 1 大規模なサービスと小規模なサービス
  + Lesson 2 成長し続けるサービスと,大規模化の壁
  + Lesson 3 サービス開発の現場 
* 第2回 大規模データ処理入門 ―メモリとディスク,Webアプリケーションと負荷
  + Lesson 4 はてなブックマークのデータ規模 ―データが大きいと処理に時間がかかる
  + Lesson 5 大規模データ処理の難所 ―メモリとディスク
  + Lesson 6 スケーリングの要所
  + Lesson 7 大規模データを扱うための基礎知識 
* 第3回 OSのキャッシュと分散 ―大きなデータを効率良く扱うしくみ
  + Lesson 8 OSのキャッシュ機構
  + Lesson 9 I/O負荷の軽減策
  + Lesson 10 局所性を活かす分散 
* 第4回 DBのスケールアウト戦略 ―分散を考慮したMySQLの運用
  + Lesson 11 インデックスを正しく運用する ―分散を考慮したMySQL運用の大前提
  + Lesson 12 MySQLの分散 ―スケーリング前提のシステム設計
  + Lesson 13 MySQLのスケールアウトとパーティショニング 
* 第5回 大規模データ処理[実践]入門 ―アプリケーション開発の勘所
  + Lesson 14 用途特化型インデクシング ―大規模データを捌く
  + Lesson 15 理論と実践の両側から取り組む 
* 第6回 [課題]圧縮プログラミング ―データサイズ,I/O高速化との関係を意識する
  + Lesson 16 [課題]整数データをコンパクトに持つ
  + Lesson 17 VB Codeと速度感覚
  + Lesson 18 課題の詳細と回答例 
* 第7回 アルゴリズムの実用化 ―身近な例で見る理論・研究の実践投入
  + Lesson 19 アルゴリズムと評価
  + Lesson 20 はてなダイアリーのキーワードリンク
  + Lesson 21 はてなブックマークの記事カテゴライズ 
* 第8回 [課題]はてなキーワードリンクの実装 ―応用への道筋を知る
  + Lesson 22 [課題]はてなキーワードリンクを作る
  + Lesson 23 回答例と考え方 
* 第9回 全文検索技術に挑戦 ―大規模データ処理のノウハウ満載
  + Lesson 24 全文検索技術の応用範囲
  + Lesson 25 検索システムのアーキテクチャ
  + Lesson 26 検索エンジンの内部構造 
* 第10回 [課題]全文検索エンジンの作成 ―基本部分,作り込み,速度と精度の追求
  + Lesson 27 [課題]はてなブックマーク全文検索を作る
  + Lesson 28 回答例と考え方 
* 第11回 大規模データ処理を支えるサーバ/インフラ入門 ―Webサービスのバックエンド
  + Lesson 29 エンタープライズ vs. Webサービス
  + Lesson 30 クラウドvs.自前インフラ 
* 第12回 スケーラビリティの確保に必要な考え方 ―規模の増大とシステムの拡張
  + Lesson 31 レイヤとスケーラビリティ
  + Lesson 32 負荷の把握,チューニング 
* 第13回 冗長性の確保,システムの安定化 ―ほぼ100%の稼動率を実現するしくみ
  + Lesson 33 冗長性の確保
  + Lesson 34 システムの安定化
  + Lesson 35 システムの安定化対策 
* 第14回 効率向上作戦 ―ハードウェアのリソースの使用率を上げる
  + Lesson 36 仮想化技術
  + Lesson 37 ハードウェアと効率向上 ―低コストを実現する要素技術 
* 第15回 Webサービスとネットワーク ―ネットワークで見えてくるサービスの成長
  + Lesson 38 ネットワークの分岐点
  + Lesson 39 さらなる上限へ 
* 特別編 いまどきのWebサービス構築に求められる実践技術 ―大規模サービスに対応するために
  + Special Lesson 1 ジョブキューシステム ―TheSchwartz、 Gearman
  + Special Lesson 2 ストレージの選択 ―RDBMSかkey-valueストアか
  + Special Lesson 3 キャッシュシステム ―Squid,Varnish
  + Special Lesson 4 計算クラスタ ―Hadoop 

正直、全ての項が興味深いのですが、このエントリで1つ興味深く感じた部分を私らしく取り上げるとすると、Lesson 30の「クラウドvs.自前インフラ」でしょうか。

クラウドを利用するメリットと自前インフラを利用するメリットを整理した上で、はてなが現時点では、自前インフラを選択しているという話題が書かれています。(はてなでは、部分的にAWSを利用していて、現時点では主に欧米の"うごメモ"ユーザ向けのメディアファイル配信を、CDNであるAmazon CloudFrontを利用しているとのこと。)

自前インフラのメリットとして、「柔軟なハード構成」「サービスからの要望への柔軟な対応」「ボトルネックのコントロール」と紹介されていますが、私もこの2年くらいクラウドと向きあってきて、運用上のポイントとして、まさにコントロールできない部分の"制約"をどうクリアするか、受け入れるかといった部分の考え方が大事だと思っています。

もちろん、柔軟なハード構成やシステムアーキテクチャ(ボトルネックがコントロールできる状態)を取ろうとするとコストはかかる場合があるわけで、そこを汎用で経済の規模を働かせたクラウドを採用するかの選択が増えたことは非常に良いことですが、全面的にいってしまうとクラウド心中する覚悟もいるので、やはり適材適所でメリット/デメリットを見極めて、選択していくことが大事だと考えています。


ちなみに、はてなさんのサービス規模(2010/4)としては以下のような感じで、"中堅どころ"の規模とのことです。(書籍内より引用)

  • 登録ユーザ数は150万人、1,900万UU/月
  • 数十億アクセス/月 (画像などへのアクセスを除く)
  • ピーク時の回線トラフィック量は850Mbps
  • ハードウェアは600台以上 (22ラック、仮想サーバ数換算で1300台)

こういった定量的な数値も、各サービスを題材として挙げられている際に、具体的な数値として出てきますので、結構参考になります。


少し話は逸れてしまいましたが、本当に体系的な学習書としても、実践的に取り組む際の方針決めの参考書としても良い書籍だと思いますので、手元に一冊持っておいて損は無いと思います! (私も一緒に仕事をするメンバーには是非読んで欲しいと思っています。)


ちなみに、本書に書かれていないような、もう少しハウツーに近いところに手を出す際は、「24時間365日 サーバ/インフラを支える技術」がオススメです。過去のエントリでも書きましたが、こちらもかなりの良書ですよ。