そこに仁義はあるのか(仮)

略してそこ仁!

「Web開発者のための大規模サービス技術入門」は実践的な技術を学べる一冊でした

「株式会社はてな」さんのインターンシップでの講義内容をまとめた本とのことで、大規模サービスを構築・運用するということに特化した実践的な内容が多い、とても良い本でした。概念的な話だけではなく、実際にシステムを運用した経験からくる、「仮想化によってどれくらいのボトルネックが発生するか」「キャッシュサーバーに最適な要領はどれくらいか」というような話も多い本でした。人に勧めたくなる一冊。
インターン生にむけた講義内容を収録した講義ベースの本ということで、解説も丁寧でわかりやすかったです。
ただ、おそらくインターン生のレベルが高く*1、先日「インフラエンジニアの教科書2」を読んでおいてちょうど良いレベルの難易度でした。小規模のWebサービスを構築する際の基礎知識はある程度わかっているとサクサクと内容が入ってくると思います。
この本の初版は2010年8月とのことで、「当時とは採用している技術も違うんだろうな〜」と思いながらも大規模サービスを運用する上で基本となる考え方はしっかりと学べました
個人的には口語で書かれている箇所が多く、文語の方が読む負荷は少なかったな〜、と感じました。

📖 目次

  • 第1回 大規模Webサービスの開発オリエンテーション―全体像を把握する
  • 第2回 大規模データ処理入門 ―メモリとディスク,Webアプリケーションと負荷
  • 第3回 OSのキャッシュと分散 ―大きなデータを効率良く扱うしくみ
  • 第4回 DBのスケールアウト戦略 ―分散を考慮したMySQLの運用
  • 第5回 大規模データ処理[実践]入門 ―アプリケーション開発の勘所
  • 第6回 [課題]圧縮プログラミング ―データサイズ,I/O高速化との関係を意識する
  • 第7回 アルゴリズムの実用化 ―身近な例で見る理論・研究の実践投入
  • 第8回 [課題]はてなキーワードリンクの実装 ―応用への道筋を知る
  • 第9回 全文検索技術に挑戦 ―大規模データ処理のノウハウ満載
  • 第10回 [課題]全文検索エンジンの作成 ―基本部分,作り込み,速度と精度の追求
  • 第11回 大規模データ処理を支えるサーバ/インフラ入門 ―Webサービスのバックエンド
  • 第12回 スケーラビリティの確保に必要な考え方 ―規模の増大とシステムの拡張
  • 第13回 冗長性の確保,システムの安定化 ―ほぼ100%の稼動率を実現するしくみ
  • 第14回 効率向上作戦 ―ハードウェアのリソースの使用率を上げる
  • 第15回 Webサービスとネットワーク ―ネットワークで見えてくるサービスの成長
  • 特別編 いまどきのWebサービス構築に求められる実践技術 ―大規模サービスに対応するために

「大規模サービス」はどれくらいの規模?

書籍の中では、インターン実施時と書籍執筆時の2回、はてなさんのサービス規模について記載されています。
ご参考までに載せておくので目安として考えてください。1年足らずでもユーザー数、ハードウェア数がすごく増えています。

2009/8時点

  • 登録ユーザは100万人以上、 1,500万UU(ユニークユーザー)/月
  • 数十億アクセス/月 (画像などへのアクセスを除く)
  • ピーク時の回線トラフィック量は430Mbps
  • ハードウェア(サーバ)は500台以上

2010/4時点

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

本の内容と現在のはてなさんのインターン資料 / 研修資料

はてなさんはインターン資料も新入社員への研修資料も公開してくれています。こちらの内容と本の内容は、対応領域があまり被っていない感じなので、ベースとして求められるスキルセットが変わってきたのかもしれません。
講義パート - はてなサマーインターン2019 レポートサイト
GitHub - hatena/Hatena-Textbook: はてな研修用教科書

公開されている研修資料の中に「インフラ屋さん、今昔物語」というスライドがあり、その中には

  • 2007年〜2015年:クラウドシフト期
  • 2013年〜2017年:サーバレスアーキテクチャの幕開け

と記載されているので、2010年出版の書籍とは状況も違いますね。
Hatena-Textbook/slide.pdf at master · hatena/Hatena-Textbook · GitHub
書籍にはクラウドサービスに対して「アプリケ=ションやDBを本格的に置くというのはまだ時期尚早と考えています。」と記載があるのに対して、2019年インターン資料ではAWSのデプロイが講義内容に組み込まれているようでした。
採用技術が2020年にアップデートされた書籍も読んでみたい…!

実践的な内容が多く記載されている

利用ユーザーとトラフィックがとても多いWebサービスの負荷をどのように運用していくのかの実践的ノウハウがたくさん詰まっていました。
圧縮のアルゴリズムや全文検索の内容が組み込まれているのははてなさんのインターンらしいな、と思いつつも、大規模Webサービスになると確かに欠かせない技術だと思います。
また、メモリが安く購入できるという状況から、チューニングをやるのとメモリを増設するのでどちらを選択するか検討する、など、サービス運営する上で意識するポイントも書かれています。
インデックスをつける前後でどれくらいSQLの応答時間に差が出るか、など、大規模なデータを使った実行結果も載っています。

マスタ / スレーブの冗長構成はマスタ1台+スレーブ3台=4台必要

マスタ1台+スレーブ2台=3台の場合

スレーブの1台が故障したら、リカバリのために新しいサーバにデータをコピーする際にサービスが停止する。
スレーブへのデータコピーのために

  • スレーブを止めたら参照ができない
  • マスタを止めたら書き込みができない

→冗長構成は取れていない。

マスタ1台+スレーブ3台=4台の場合

スレーブ3台のうち、1台が故障した場合でも、スレーブの2台のうちの1台を止めて新しいサーバにデータをコピーすることで、無停止リカバリができる。(ただし、リカバリ時に稼働しているサーバの負荷は高くなる。)

MySQLのストレージエンジン MyISAMとInnoDB

MyISAMとInnoDBのそれぞれにどのような特徴があって、どういうケースでどちらを選択するのか。

アクセスパターン 適したストレージエンジン
追記しかない MyISAM
更新頻度が高い InnoDB
トランザクションが必要 InnoDB
SELECT CCOUNT(*)を使用 MyISAM

💬 まとめ

「Web開発者のための大規模サービス技術入門」は大規模サービスに特化したシステム構築・運用について学べる一冊でした。
インターン生にむけて、実際に知っておいて欲しい内容が盛り込まれているので、すごく実践的な内容です。
利用技術は2010年のものなので、現在とギャップはあると思いますが、概念や考え方などを学ぶ上ですごく役に立つので、人にお勧めしたくなる本でした。

*1:文中で「形態素解析のMeCabを半数以上の参加者が使ったことがある」などの記載がありました。