はじめに

システムを構築する上での対立軸として「設計」と「詳細」があります。 以前読んだClean Architectureは「設計」についての本でしたが、今回読んだLinux-DBシステム 構築/運用入門は「詳細」についての本でした。

『Linux-DBシステム 構築/運用入門』はどのような本なのか

この本は、基本的にはデータベースの運用方法について書いてある本です。例えば高可用性を実現する方法とかレプリケーションのやり方とか、シャーディングのやり方とかが書いてあります。しかしそれだけではなく、データベースのパフォーマンスチューニングについて、かなりの分量を割いて解説されています。インデックスの正しい貼り方とかオプティマイザの気持ちとか、OSのチューニングの話とかメトリクスの見方なども書いてあり、最後の章では、実際にありそうなシステム障害を例にパフォーマンスチューニングが「実演」されます。

実務レベルの「ハイパフォーマンス・ハイアベイラビリティ」なWebシステムを作りたい人は非常に勉強になると思います。平易な記述で読みやすいしオススメです。ただしLinuxやWebアプリケーションに関する知識・経験はある程度前提とされていること1と、内容が若干古い部分があるということには留意する必要があるでしょう2。 とはいえ本の内容の大部分は2019年でも十二分に役に立つと思います。

注意しておくと、この本を読んだからといってDBの内部構造にめっちゃ詳しくなったり、OSを理解できるようになるということはないです。この本は、実務上問題になることについてのHow-toであり、また、更に深い知識を得るためのインデックスであると理解するのが正しいと思います。 この本で取り上げられている内容について更に詳しくなるためには、それぞれの分野についてのより詳細な資料をあたる必要があるでしょう。より詳細な資料情報を募集しています3

なぜこの本を読んだのか

就職活動を始めたころから「業務レベルのWebアプリケーションが作れるようになりたい」という気持ちがありました。ここでいう「業務レベル」というのは、例えばソースコードの質(修正のしやすさなど)であったり、高速な応答速度や、大量のリクエストを捌けること、落ちないことなどです。 企業に就職したのもその気持ちを満たすためという側面が大きいです4。 つまり、実務レベルのWebシステムに触れ、現場の先輩エンジニアから教えを請うことによって、そのようなアプリケーションの作り方を学びたいと考えていました。

そういうわけで企業に入社して、社のSlackでオススメの本を聞いたら出てきたのがLinux-DBシステム 構築/運用入門だったのです5

ISUCONに出ます

この本のパフォーマンスチューニングの部分を読んだことで、ISUCONに出たくなりました。本を読んだら実践したくなるのは当然ですよね。

実は去年もISUCONには参加していたのですが、予選敗退(しかも1点もスコアが伸びなかった)という苦い結末に終わり、悔しすぎて実はまだ去年の予選問題の解説記事を一切読んでいません。なので今年も出ないつもりだったのですが、この本を読んで出たくなってしまいました(申し込んだ)。

今年も一人枠があるとのことなので一人枠で出るつもりです。チームを組むと技術的な問題以外にもチームビルディングとか連携の話とかが出てきて、いろいろ面倒になると感じたからです。今の僕のレベルで仮に予選を通過できたとしても、それはチームメイトのおかげですし、それは全然嬉しくない。どうせ予選通過を狙えるレベル感でもないので、一箇所でもボトルネックを潰してスコアを多少でも伸ばす、ということを目標に今年はやっていこうと思います6。そのうちレベルが上って、上を目指すためにはチームを組む必要があるなと感じたら、そのときに誰かとチームを組んで出れたらいいなあと思っています。

この本を読んで思ったこととしては、ISUCON出るならある程度勉強してから出たほうが良かったなということでした。この本を読んだことで、「このあたりから攻めればよいだろう」「このあたりはチェックする必要がある」というようなことを目星がつけられるようになったと思います7。また、パフォーマンスチューニングの「実演」を通じて、プロはどのようにボトルネックを見つけているのかを知ることができたので非常に参考になりました。

去年ISUCONに出たときは、過去問解いたり解説記事を読んだりはしましたが、基礎的な勉強を一切せずに出ました。そのため、雰囲気でチューニングを試みて爆死するという自体になってしまいました。とはいえ去年は卒論もあり忙しかったし、勉強しようにも何を読んだらいいのか全くわからんという状態だったので仕方がないとは思います。そういった意味で、知識を得るために “"”人脈””” というのは非常に大きなファクターだなあと痛感しています。

おわりに

大学を卒業してから比較的時間が取れるようになったので、色んな本とか講義資料とかを頑張って漁っています。 物事を深く理解するのは楽しいし、知識と知識がフォローしあってさらに深い理解ができるようになるという瞬間はとても気持ち良いです。 なぜ学生時代にやらなかったのか…と思わなくもないですが89

  1. この本は第一章でいきなり論理ボリュームを作り始める。パーテイションを自分で切ったことがないとこの章はちんぷんかんぷんなのではないか。 

  2. SSDに関する記述が若干弱い(2009年の本だからね)。一方でHDDに関する記述はかなり手厚い(これはこれで非常に興味深い話だと思った10)。あとは(おそらく)オンプレミスでインフラを構築することを念頭に置いたハードウェアに関する記述11がそこそこある。現代で新しくWebシステムを組みますとなったときに、この知識がどの程度役に立つのかよくわからない。実際役に立つんですかね。いや、超大規模でそれなりに歴史のあるWebシステムは未だにバリバリオンプレでやってるというのは知っているんですが… 

  3. DBの内部構造についてはCMUの講義資料を途中まで読んでいますがめちゃめちゃ面白いし詳しくなれます。OSに関する資料は、詳解Unixプログラミングを7割ぐらい読みました。あとは同期の人から教えてもらったOperating Systems: Three Easy Piecesはじめて読む486を読みたいと思っています。それ以外の良さげな資料があったら教えて下さい。 

  4. もちろん金を稼いで独立したいみたいなのも当然あります。 

  5. 現場に出て “本物” のWebアプリケーションに触れるまではあと1.5ヶ月ぐらいかかるので、しょうがないから本を読んでいます。 

  6. なので当然言語はRubyを使う。去年はGoを使ったがやはりRubyの方が僕にとっては読み書きしやすいので。 

  7. もちろん網羅できているわけではないと思うが、はじめの一歩的なチェックリストはできた。 

  8. 答えは明確で、「学科選びを間違えたから」ですね。選択は重要。間違えたと思ったら即座に動くことが大事だと思う。 

  9. とはいえそもそも「難しい本を頑張って読んで理解する」という行動ができるようになったのは、明らかに卒論を書いてからなので、情報学科に進学していたとしてもたいして変わらなかったかもしれない。 

  10. ちょっと前にDwangoがOSS化した frugalos という分散オブジェクトストレージがあるが、これもHDDの特性を知るとますます納得がいく。つまり、動画みたいなBLOBはシーケンシャルリードになるので、HDDでもそこそこ高い性能で読み書きできるというやつ。知識が増えていくと既存の知識を更に深く理解することができて気持ちいいですね。 

  11. ライトキャッシュの話とかハードウェアの選び方とか