London Tech Talk のサブコンテンツとして運営している Bookclub ですが、次回の第四弾では "Database Internals" を選定しました。
過去二回の Bookclub では、ソフトウェアアーキテクチャ寄りの書籍を選びました。間口が広かった分、読みやすかったとも言えます。一方で、Bookclub 第一回目の "Designing Data-Intensive Application" (DDIA) の時は、難易度が高かった本であるだけに、読み終えた時の達成感や、参加者同士協力して乗り切った爽快感が感じられました。ある程度ボリュームがあり、一人で読むと挫折してしまう人もいる、程よい難易度の本を選びたかったというのが第一の理由です。
Bookclub の成功要因の一つとして、ファシリテーターである自分自身が情熱を持ってお勧めできる本を選定するべき、ということは前回言語化できました。本書は、Apache Cassandra のコミッター自身が、数多くの論文や参照実装を噛み砕いて紹介しているという点において、稀有で貴重な学習リソースであり、データベースに詳しくなりたい人にとっては絶好の教材です。自分自身が、完璧に理解するまで何度読んでも良いと思えるような内容ですし、データベースという領域だからこそ、議論の場でも有益な情報を提供できるという自信があった、というのが第二の理由です。
自分が運営する Bookclub は、多様な参加者が集うコミュニティであり続けたいと願っています。ですから、特定のプログラミング言語に依存する書籍だと、参加者が絞られてしまうという恐れがありました。本書は、リファレンスとなるコードがほとんどなく、概念や背景技術の紹介がメインです。コードに依存していない書籍ですので「データベースについて知りたい」という知的好奇心さえあれば、誰でも手に取れる本です。
TypeScript を書くフロントエンドエンジニアでも、Swift や Kotlin を触るモバイルエンジニアでも、データベースは利用します。数あるデータベース関連書籍の中でも、特定の言語を利用してデータベースを実装していく本よりも、参入障壁がかえって低いはず、というのが第三の理由です。
データベースの内部実装を紐解いていく本書は、なかなか難易度高めの本となっています。本書に書いてある内容をすでに熟知しているのは、現役のデータベース開発者くらいではないでしょうか。過去に本書を手に取ったけれども、途中で挫折したという方もいるかもしれません。
そのような「一度読んで挫折した」「とても興味あるけど難しそう」という不安な方こそ Bookclub に参加してほしいと思います。仕組みとしての Bookclub が、学習装置としてどこまで機能するか、一緒に試してみましょう。
本書の構成をざっくり二つに分けて紹介します。
そもそもデータベースとはなんでしょうか。データベースに求められる要件には、二つの機能があります。第一に、データを保存すること。第二に、データを利用できるように配布すること。データベースによって、ファイルシステムに保存したりメモリに保存したり、保存場所は違うでしょう。ですが、データを保存し、それがある程度の速度内でアクセスできるようにデータを配布するというのは、すべてのデータベースに求められる本質です。本書は、その二つの機能に沿って Part I と Part II に分かれています。
Part I では、単一のノードで動くデータベースというプロセスが、どのようにデータを保存するのか、という観点に絞って書かれています。ファイルシステムに、どのようなレイアウトでデータを保存するのか。一般的にランダムアクセスが遅いとされているディスクにファイルを書き出すときに、どのようなデータ構造を使うことによって書き込みのパフォーマンスを担保しているのか。メモリをキャッシュとして活用することで、どのように読み取りのパフォーマンスをあげているのか。ノードが故障したりプロセスを再起動したりする際に、どのようにデータを復旧させるのか。
Part II では、複数のノードで、それらのデータがどのように分散されるのか、という観点に絞って書かれています。そして、複数のノードを運用する際の知見と解決手法について紹介されています。例えば、複数のノードのうち、いくつかが故障してしまったらどのようにリカバリーするのか。どのようにデータを複製するのか。データ複製時に発生する遅延を、どう乗り越えて整合性を担保するのか。どのノードからどのノードにデータを複製するのか、どうやって合意を形成して決定するのか。
Part | Requirments | Scope | Analogy |
---|---|---|---|
Part I | Storage | Node-local | Microscope 🔍 |
Part II | Distribution | Multiple nodes | Bird-eye 🕊️ |
アプリケーション開発者だろうが、モバイル開発者だろうが、バックエンド開発者だろうが、Site Reliability Engineer だろうが、以下のような問いを過去に持ったことがある人にとっては、刺さる内容になるのではないでしょうか。
一方で、SQL のアンチパターンについて紹介したり、リレーショナルデータベースにおけるデータモデルの手法について紹介している本ではありません。特定のフレームワークにおけるデータベースの効率な使い方が書かれているわけでもありません。MySQL などの特定のデータベースに特化したパフォーマンスチューニングの本でもありません。Apache Cassandra のコミッターが書いてるからといって、Apache Cassandra の宣伝本でもありません。
第四弾となる Bookclub をファシリテーションする自分としての、裏目標もあります。それは、「難しい書籍を選んだとしても、最後まで離脱率を最小限に抑えつつ完走できるか」という目標です。
読む前は B-Tree なんて聞いたことしかなかったフロントエンジニアの人が、本書を読み終えて LSM Trees や B-Trees の亜種について自慢げに語れるようになれたら、すごいことです。
参加する前は、合意形成アルゴリズムも整合性モデルについても知らなかったモバイルエンジニアの人が、Bookclub を通じてコンセプトを理解し、実質分散環境であるようなモバイルプラットフォームの開発に知見を活かせたら、素晴らしいことです。
最初は CAP 定理について齧ったことしかないバックエンドエンジニアの人が、Two-Phase Commit や Three-Phase Commit などの分散トランザクションの仕組みについて理解し、会社で起こった高難易度の不整合なデータについて解決策とともに提案できたら、素敵なことです。
そのように、Bookclub を通じて大活躍してくれるような人が一人でも増えたら嬉しい。
難しい内容だからこそチャレンジする価値がありますし、わからないからこそ読むことに挑戦する意義があります。それを、Bookclub のような相互学び合いの場の力を借りながら、教え合いや助け合いが自然発生する空間づくりをすることで、参加者の学びが最大化できる仕組みを実現してみたい。そして、それを「オンライン」の場で、かつ「持続可能・再現可能」な形で、何度も実現し続ける、というのが目標です。