現代の分散システム設計において、データの扱いは重要な課題です。システムは、スケーラビリティ、一貫性、信頼性、効率性、保守性を維持する必要があり、そのためにリレーショナルデータベース、NoSQLデータストア、データウェアハウス、データレイク、クラウドサービス、オンプレミスのサービス、組み込みデータベースなどのツールが数多く存在します。本書は、データを処理し、保存するさまざまなテクノロジーの特性を詳しく解説することで、ツールの長所と短所を理解し、システムが抱える課題や用途に適した選択肢を見つける手助けをします。
第2版では、第1版の内容をもとに、新しいテクノロジーや最新の動向を取り入れてアップデートしています。現代のデータシステムを構築する際に生じるさまざまな選択肢とトレードオフを整理しながら、主要なクラウドサービスがスケーラビリティ、耐障害性、一貫性をどのように実現しているのかを解説します。
普段利用しているシステムの内部の仕組みを理解し、現代のデータベースや分散システムを支える基本原理を学べる一冊です。
データ指向アプリケーションデザイン 第2版
―信頼性、拡張性、保守性の高い分散システム設計の原理
Martin Kleppmann、Chris Riccomini 著、斉藤 太郎 訳
- TOPICS
- Database , System/Network
- 発行年月日
- 2026年11月05日
- PRINT LENGTH
- 664
- ISBN
- 978-4-8144-0180-2
- 原書
- Designing Data-Intensive Applications, 2nd Edition
- FORMAT
目次
はじめに
1章 データシステムアーキテクチャにおけるトレードオフ
1.1 オペレーショナルシステムと分析システム
1.1.1 トランザクション処理とアナリティクスの特徴
1.1.2 データウェアハウジング
1.1.3 記録のシステムと導出データ
1.2 クラウドとセルフホスティング
1.2.1 クラウドサービスの利点と欠点
1.2.2 クラウドネイティブなシステムアーキテクチャ
1.2.3 クラウド時代の運用
1.3 分散システムと単一ノードシステム
1.3.1 分散システムの問題
1.3.2 マイクロサービスとサーバーレス
1.3.3 クラウドコンピューティングとスーパーコンピューティングの比較
1.4 データシステム、法律、そして社会
1.5 まとめ
2章 非機能要件を定義する
2.1 ケーススタディ:ソーシャルネットワークのホームタイムライン
2.1.1 ユーザー、投稿、フォローの表現
2.1.2 タイムラインのマテリアライズと更新
2.2 パフォーマンスの表現方法
2.2.1 レイテンシとレスポンスタイム
2.2.2 平均値、中央値、パーセンタイル
2.2.3 レスポンスタイムメトリクスの活用
2.3 信頼性と耐障害性
2.3.1 耐障害性
2.3.2 ハードウェアとソフトウェアの障害
2.3.3 人間と信頼性
2.4 スケーラビリティ
2.4.1 負荷を理解する
2.4.2 共有メモリ、共有ディスク、シェアードナッシングアーキテクチャ
2.4.3 スケーラビリティの原則
2.5 メンテナンス性
2.5.1 運用性:運用を容易にする
2.5.2 簡潔性:複雑さを管理する
2.5.3 発展性:変更を容易にする
2.6 まとめ
3章 データモデルとクエリ言語
3.1 リレーショナルモデルとドキュメントモデル
3.1.1 オブジェクトリレーショナルミスマッチ
3.1.2 正規化、非正規化、結合
3.1.3 多対一と多対多のリレーションシップ
3.1.4 スターとスノーフレーク:分析のためのスキーマ
3.1.5 どのモデルをいつ使うか
3.2 グラフ型データモデル
3.2.1 プロパティグラフ
3.2.2 Cypher クエリ言語
3.2.3 SQL によるグラフクエリ
3.2.4 トリプルストアとSPARQL
3.2.5 Datalog:再帰的リレーショナルクエリ
3.2.6 GraphQL
3.3 イベントソーシングとCQRS
3.4 データフレーム、行列、配列
3.5 まとめ
4章 ストレージと検索
4.1 OLTP のためのストレージとインデックス
4.1.1 ログ構造化ストレージ
4.1.2 B ツリー
4.1.3 B ツリーとLSM ツリーの比較
4.1.4 マルチカラムインデックスとセカンダリインデックス
4.1.5 インデックス内へのバリューの格納
4.1.6 すべてをメモリに保持する
4.2 分析のためのデータストレージ
4.2.1 クラウドデータウェアハウス
4.2.2 カラム指向ストレージ
4.2.3 クエリ実行:コンパイルとベクター処理
4.2.4 マテリアライズドビューとデータキューブ
4.3 多次元インデックスと全文検索
4.3.1 全文検索
4.3.2 ベクトル埋め込み
4.4 まとめ
5章 エンコーディングと発展性
5.1 データのエンコーディング形式
5.1.1 言語固有のフォーマット
5.1.2 JSON、XML、およびバイナリの派生フォーマット
5.1.3 Protocol Buffers
5.1.4 Avro
5.1.5 スキーマの利点
5.2 データフローのモード
5.2.1 データベースを介したデータフロー
5.2.2 サービスを介したデータフロー:REST とRPC
5.2.3 耐久性のある実行とワークフロー
5.2.4 イベント駆動アーキテクチャ
5.3 まとめ
6章 レプリケーション
6.1 シングルリーダーレプリケーション
6.1.1 同期レプリケーションと非同期レプリケーション
6.1.2 新しいフォロワーのセットアップ
6.1.3 ノード障害への対応
6.1.4 レプリケーションログの実装
6.1.5 レプリケーションラグに起因する問題
6.1.6 レプリケーションラグへの対策
6.2 マルチリーダーレプリケーション
6.2.1 地理的に分散した運用
6.2.2 同期エンジンとローカルファーストソフトウェア
6.2.3 コンフリクトのある書き込みへの対処
6.3 リーダーレスレプリケーション
6.3.1 ノードがダウンしているときのデータベースへの書き込み
6.3.2 シングルリーダーとリーダーレスレプリケーションのパフォーマンス比較
6.3.3 マルチリージョンオペレーション
6.3.4 並行書き込みの検出
6.4 まとめ
7章 シャーディング
7.1 シャーディングの長所と短所
7.2 マルチテナンシーのためのシャーディング
7.3 キーバリューデータのシャーディング
7.3.1 キー範囲によるシャーディング
7.3.2 キーのハッシュによるシャーディング
7.3.3 偏ったワークロードとホットスポットの緩和
7.3.4 運用:自動リバランシングと手動リバランシング
7.4 リクエストルーティング
7.5 シャーディングとセカンダリインデックス
7.5.1 ローカルセカンダリインデックス
7.5.2 グローバルセカンダリインデックス
7.6 まとめ
8章 トランザクション
8.1 トランザクションとは正確には何か?
8.1.1 ACID の意味
8.1.2 シングルオブジェクト操作とマルチオブジェクト操作
8.2 弱い分離レベル
8.2.1 リードコミッテッド
8.2.2 スナップショット分離とリピータブルリード
8.2.3 ロストアップデートの防止
8.2.4 ライトスキューとファントム
8.3 シリアライザブル
8.3.1 実際の逐次実行
8.3.2 2 相ロック
8.3.3 シリアライザブルスナップショット分離
8.4 分散トランザクション
8.4.1 2 相コミット
8.4.2 異なるシステム間の分散トランザクション
8.4.3 データベース内部の分散トランザクション
8.4.4 厳密に1 回のメッセージ処理を再考する
8.5 まとめ
9章 分散システムの厄介な問題
9.1 障害と部分障害
9.2 信頼性のないネットワーク
9.2.1 TCP の限界
9.2.2 実運用でのネットワーク障害
9.2.3 障害の検出
9.2.4 タイムアウトと上限のない遅延
9.2.5 同期ネットワークと非同期ネットワーク
9.3 信頼できないクロック
9.3.1 モノトニッククロックと実時間クロック
9.3.2 クロックの同期と精度
9.3.3 同期クロックへの依存
9.3.4 プロセスの一時停止
9.4 知識、真実、そして虚偽
9.4.1 多数決の原則
9.4.2 分散ロックとリース
9.4.3 ビザンチン障害
9.4.4 システムモデルと現実
9.4.5 形式手法とランダム化テスト
9.5 まとめ
10章 一貫性と合意
10.1 線形化可能性
10.1.1 線形化可能なシステムとは何か?
10.1.2 線形化可能性に依存する場面
10.1.3 線形化可能なシステムの実装
10.1.4 線形化可能性のコスト
10.2 ID ジェネレータと論理クロック
10.2.1 論理クロック
10.2.2 線形化可能なID ジェネレータ
10.3 合意
10.3.1 合意の多様な側面
10.3.2 合意の実践
10.3.3 コーディネーションサービス
10.4 まとめ
11章 バッチ処理
11.1 Unix ツールによるバッチ処理
11.1.1 単純なログ分析
11.1.2 コマンドの連鎖とカスタムプログラム
11.1.3 ソートとインメモリ集約
11.2 分散システムにおけるバッチ処理
11.2.1 分散ファイルシステム
11.2.2 オブジェクトストレージ
11.2.3 分散ジョブオーケストレーション
11.3 バッチ処理モデル
11.3.1 MapReduce
11.3.2 データフローエンジン
11.3.3 データのシャッフル
11.3.4 結合とグループ化
11.3.5 クエリ言語
11.3.6 データフレーム
11.4 バッチ処理のユースケース
11.4.1 Extract-Transform-Load
11.4.2 アナリティクス
11.4.3 機械学習
11.4.4 導出データを供給する
11.5 まとめ
12章 ストリーム処理
12.1 イベントストリームの伝送
12.1.1 メッセージングシステム
12.1.2 ログベースメッセージブローカー
12.2 データベースとストリーム
12.2.1 システム間の同期の維持
12.2.2 チェンジデータキャプチャ
12.2.3 状態、ストリーム、イミュータビリティ
12.3 ストリームの処理
12.3.1 ストリーム処理の用途
12.3.2 時間という概念を考える
12.3.3 ストリーム結合
12.3.4 耐障害性
12.4 まとめ
13章 ストリーミングシステムの哲学
13.1 データインテグレーション
13.1.1 導出データを用いて専用ツールを組み合わせる
13.1.2 バッチ処理とストリーム処理
13.2 データベースの機能を分離する
13.2.1 データストレージ技術を組み立てる
13.2.2 データフローを中心としたアプリケーション設計
13.2.3 導出された状態の観測
13.3 正確性を目指して
13.3.1 データシステムにおけるエンドツーエンド原則
13.3.2 制約の強制
13.3.3 適時性と完全性
13.3.4 信頼しつつも検証を
13.4 まとめ
14章 正しいことをする
14.1 予測分析
14.1.1 バイアスと差別
14.1.2 責任と説明責任
14.1.3 フィードバックループ
14.2 プライバシーと追跡
14.2.1 監視
14.2.2 同意と選択の自由
14.2.3 プライバシーとデータの利用
14.2.4 資産や権力としてのデータ
14.2.5 産業革命に思いを馳せて
14.2.6 法規制と自主規制
14.3 まとめ
付録A 用語集
訳者あとがき
索引
コラム目次
用語:フロントエンドとバックエンド
過負荷になったシステムが回復しない場合
レスポンスタイムのユーザーへの影響
パーセンタイルの計算
信頼性はどれほど重要か?
用語:宣言型クエリ言語
セマンティックWeb
組み込みストレージエンジン
SSD におけるシーケンシャルライトとランダムライト
バックアップとレプリケーション
オブジェクトストレージを基盤としたデータベース
リージョンとアベイラビリティゾーン
並行性、時間、そして相対性
シャーディングとパーティショニング
データウェアハウスにおけるパーティショニングとレンジクエリ
レプリケーションと永続性
TCP とUDP の比較
レイテンシとリソース利用率
ビザンチン将軍問題
決定性の力
線形化可能性と直列化可能性
役に立たないCAP 定理
合意の不可能性
リーダーの選出における一貫性と可用性
コーディネーションサービスによる設定管理
分散ファイルシステムとネットワークストレージ
MapReduce と関数型プログラミング
バッチ処理とクラウドデータウェアハウスの融合
チェンジデータキャプチャとデータベーススキーマ
インクリメンタルビューメンテナンス
スキーマのマイグレーションと鉄道