技術ブログ
目次
Oracle ACEの渡部です。 監訳者のこばさんから書籍を献本いただいたので、紹介記事を書かせていただきます。
書籍冒頭の「監訳者まえがき」と「本書が対象とする範囲」に明確に書かれていますが、以下を中心に説明している書籍です。
データベースには上記以外のコンポーネントとして、クエリ言語の構文解析(端的にはSQLのパース処理)、クエリオプティマイザ(クエリ最適化)、ワークロード処理におけるリソース管理、データモデルやメタデータの管理がありますが、これらについてはほとんど触れられていない点に注意してください。
目次を見れば、取り上げられている内容を理解できるはずです。
第I部 ストレージエンジン
1章 基本事項の紹介と概要
* メモリベースのDBMSとディスクベースのDBMS
* 列指向DBMSと行指向DBMS
2章 Bツリーの基本
3章 ファイルフォーマット
* データのバイナリ表現
* ページ構造
4章 Bツリーの実装
5章 トランザクション処理とリカバリ
* バッファ管理(キャッシュ管理)
* トランザクションログとリカバリ、ARIES
* トランザクションの同時実行制御
* 直列化可能性(シリアライザブル)
* トランザクションの分離レベル
* 楽観的同時実行制御と悲観的同時実行制御
6章 Bツリーの亜種
* コピーオンライト
* ノード更新の抽象化
* 遅延Bツリー
* FDツリー
* Bwツリー
* キャッシュオブリビアスBツリー
7章 ログ構造化ストレージ
* LSMツリー
第II部分散システム
8章 基本事項の紹介と概要
9章 障害検出
* ハートビート
* ゴシップ
10章 リーダー選出
* 様々なリーダー選出アルゴリズム
11章 レプリケーションと一貫性
* CAP
* 一貫性モデル
12章 アンチエントロピーと情報散布
13章 分散トランザクション
* ツーフェーズコミット / 2PCコミット
* その他のアルゴリズム
14章 合意
* ブロードキャスト
* Paxos
* Raft
* ビザンチン合意
原著の著者である、Alex Petrov氏はApache Cassandraのコミッターとのことで、心かなしか、
気がします。
なお、監訳者はDatabaseInternals輪読会 の発起人/管理人であり、多くのイベントでNoSQL/NewSQLに関する発表をなされており、連載記事クラウドネイティブ時代のデータベースを寄稿なされている こばさん ですから、翻訳書でありがちな意味不明な訳もなく、とても読みやすい文章になっています。技術的な観点でもとても安心できます。
書籍冒頭の「監訳者まえがき」に、対象とする読者が書かれていますが、
- データベースを利用するアプリケーション開発者
- データベースを管理するエンジニア
- データベース自体を開発するOSSコントリビュータ
- データベースに関する研究者
- コンピュータサイエンスを学ぶ学生
しいて言えば、私は
- データベースを利用するアプリケーション開発者
- データベースを管理するエンジニア
に該当するのだと思います。
そして、Oracle Databaseを主戦場としており、Oracle Database以外のDBMSとしてMySQLやPostgreSQL、MS SQL Serverに関する知識はありますが、 残念ながら分散データベース(や分散データベースを支える基礎技術)に関する知識はあまりありません。
その一方で、Oracle Databaseについては数年のサポートエンジニア経験があり、Oracle Databaseの内部構造に関する比較的詳しい知識があります。 (幸運なことに、Oracle Databaseの内部構造に関する丸20日以上にも及ぶオラクル社のセミナーを受講する機会に恵まれました)
「詳解データベース」の「第I部 ストレージエンジン」は、RDBMSの内部構造について説明したもので、 比較的わかりやすくまとまっているように思えます。 ただ、説明に使用される用語が、特定の製品で使用される用語ではなく、おそらくアカデミックな世界で使用される用語であるため、 若干理解しにくい箇所もありました。 これについては、本記事の後半にメモを残しておこうと思います。
「第II部分散システム」については、あまり知らない領域の内容であるため、新しい知識を学びながら興味深く読めました。
分散データベースにおけるキーテクノロジについて、1つ先の知識を得たい方に本書をおススメします。
私は、Oracle Databaseを主戦場とするデータベースエンジニアです。 私に似たバックグラウンドの方が書籍「詳説データベース」の「第I部 ストレージエンジン」を読み進める助けとなるよう、 少しですがOracle観点からでの用語メモをまとめておきます。
データベースシステムでは通常、データファイルとインデックスファイルが分けられています。 データファイルにはデータレコードを格納します。 一方、インデックスファイルにはレコードメタデータを格納し、それを使用してデータファイル内でレコードを格納します。
書籍「詳説データベース」における「データファイル」は、Oracleでは「表セグメント」に対応するはずです。 同様に「インデックスファイル」は「索引セグメント」に対応するはずです。
Oracleでは、テーブルやインデックスに対応するのは論理的な記憶域であるセグメントであり、 ファイルに対応するわけではありません。
一瞬混乱しましたが、「ユビキタスBツリー」というBツリーがあるわけではなく、おふざけ気味に「Bツリー」に仰々しい修飾語を付けているだけのようです。
データベースシステムは、データレコードをデータファイルとインデックスファイルに格納します。 これらのファイルは、ページと呼ばれる固定長のユニットに分割され…
書籍「詳説データベース」における「ページ」は、Oracleの「データブロック」に対応します。
なお、PostgreSQLでは「ページ」という用語を用いています。
テーブルとインデックスはすべて、固定サイズ(通常8キロバイト。サーバのコンパイル時に異なるサイズを設定可能)のページの集まりとして格納されます。
ページをスロットまたはセルのコレクションに編成し、ページの両側にある2つの独立したメモリ領域にポインタとセルをそれぞれ配置します。
スロット化ページには、ページとセルに関する重要な情報が保持される固定長のヘッダがあります。
書籍「詳説データベース」における「スロット」、「セル」は、Oracleにおける「行断片」に対応すると思われます。 「スロット」と「セル」の意味の違いについては、よくわかりませんでした。
また、Oracleデータベースのデータブロック構造は、書籍「詳説データベース」における「スロット化ページ」によく似ています。
ただし、ヘッダのサイズは可変長です。
WALは、ログレコードで構成されます。すべてのレコードは、ユニークで単調に増加するログシーケンス番号(LSN)を持ちます。
書籍「詳説データベース」における「WAL」は、Oracleにおける「REDO」に対応します。 また、「LSN」は「SCN」に対応します。
ロールバック時やリカバリ時にクラッシュした後もシステムが正常に機能し続けられるようにするために、一部のシステムではundoを行うときに補償ログレコード(Compensation Log Record、CLR)を使用し、それをログに格納します。
書籍「詳説データベース」における「補償ログレコード」は、Oracleにおいて、UNDOデータを書き込むときにREDOを生成する動作を示していると考えています。 実際、この動作により、UNDOデータの書き込み時に障害が発生した場合でも、REDOをもとに障害から復旧可能になっています。
WALは通常、プライマリのストレージ構造と関連付けられます。これらを関連付けるインターフェイスは、チェックポイントに到達するたびに、WALのトリミングを可能にします。
チェックポイントが完了した場合、それよりも古いWALは不要になるため、 RDBMSによってはこれらのWALを削除することが「論理的には可能」という話と理解しています。
ただ、実際にWALを削除するデータベースがあるかは、知りません。個人的には、わざわざ削除する必要はないのかなぁと思います。
本書は、書籍冒頭の「監訳者まえがき」と「本書が対象とする範囲」に書かれているとおり、分散データベースにおけるキーテクノロジである、ストレージエンジンと分散トランザクションマネージャについてまとめられた書籍です。翻訳書でありがちな意味不明な訳もなく、とても読みやすい文章になっています。分散データベースにおけるキーテクノロジについて、1つ先の知識を得たい方におススメします。
ただ、注意いただきたいのは、Oracleに代表される「従来型の原則非分散RDBMS」における、直近の仕事に役立つ書籍ではないことです。Oracleに関連する部分の説明はごく限られていますし、この部分についての解説はあまり丁寧ではありません(著者の力点は、「新しいデータベース」特有の技術にある)。
なお、「第I部 ストレージエンジン」に関連して、Oracle観点での内部アーキテクチャ説明を読みたい場合は、プロとしてのOracleアーキテクチャ入門 を読んでもよいかもしれません!(失礼、私の本 ;-P 本書に比べるとだいぶレベルは易しめかな・・・)
あと、RDBMS解剖学、トランザクション処理 上、トランザクション処理 下もお勧め!