データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理

Book description

現代の分散システム設計においてデータの扱いは重要な課題です。本書は、データを処理し、保存するさまざまなテクノロジーの特性を詳述することで、ツールの長所と短所を理解し、システムの課題と使用するアプリケーションに適した選択肢の発見を助けます。本書では、データの量や複雑さ、変化が課題となるアプリケーションを「データ指向」と名づけ、データ指向アプリケーションの設計を支える基本的な概念を解説します。そしてレプリケーション、パーティション、トランザクションなど分散データベースについて扱い、さらにバッチ処理、ストリーム処理など、データセットの取り出しや結合について解説します。

Table of contents

  1.  大扉
  2.  原書大扉
  3.  クレジット
  4.  献辞
  5.  献辞(2)
  6.  監訳者まえがき
  7.  はじめに
  8. 第Ⅰ部 データシステムの基礎
  9.  地図
  10.  1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション
  11.   1.1 データシステムに関する考察
  12.   1.2 信頼性
  13.    1.2.1 ハードウェアの障害
  14.    1.2.2 ソフトウェアのエラー
  15.    1.2.3 ヒューマンエラー
  16.    1.2.4 信頼性の重要度
  17.   1.3 スケーラビリティ
  18.    1.3.1 負荷の表現
  19.    1.3.2 パフォーマンスの表現
  20.    1.3.3 負荷への対処のアプローチ
  21.   1.4 メンテナンス性
  22.    1.4.1 運用性:運用担当者への配慮
  23.    1.4.2 単純さ:複雑さの管理
  24.    1.4.3 進化性:変更への配慮
  25.   まとめ
  26.  地図
  27.  2章 データモデルとクエリ言語
  28.   2.1 リレーショナルモデルとドキュメントモデル
  29.    2.1.1 NoSQLの誕生
  30.    2.1.2 オブジェクトとリレーショナルのミスマッチ
  31.    2.1.3 多対一と多対多の関係
  32.    2.1.4 ドキュメントデータベースは歴史を繰り返すのか?
  33.    2.1.5 今日のリレーショナルデータベースとドキュメントデータベース
  34.   2.2 データのためのクエリ言語
  35.    2.2.1 Web上での宣言的クエリ
  36.    2.2.2 MapReduceでのクエリ
  37.   2.3 グラフ型のデータモデル
  38.    2.3.1 プロパティグラフ
  39.    2.3.2 Cypherクエリ言語
  40.    2.3.3 SQLでのグラフクエリ
  41.    2.3.4 トリプルストアとSPARQL
  42.    2.3.5 礎となったもの:Datalog
  43.   まとめ
  44.  地図
  45.  3章 ストレージと抽出
  46.   3.1 データベースを駆動するデータ構造
  47.    3.1.1 ハッシュインデックス
  48.    3.1.2 SSTableとLSMツリー
  49.    3.1.3 Bツリー
  50.    3.1.4 BツリーとLSMツリーの比較
  51.    3.1.5 その他のインデックス構造
  52.   3.2 トランザクション処理か、分析処理か?
  53.    3.2.1 データウェアハウス
  54.    3.2.2 スターとスノーフレーク:分析のためのスキーマ
  55.   3.3 列指向ストレージ
  56.    3.3.1 列の圧縮
  57.    3.3.2 列ストレージにおけるソート順序
  58.    3.3.3 列指向ストレージへの書き込み
  59.    3.3.4 集計:データキューブとマテリアライズドビュー
  60.   まとめ
  61.  地図
  62.  4章 エンコーディングと進化
  63.   4.1 データエンコードのフォーマット
  64.    4.1.1 言語固有のフォーマット
  65.    4.1.2 JSON、XML、様々なバイナリフォーマット
  66.    4.1.3 ThriftとProtocol Buffers
  67.    4.1.4 Avro
  68.    4.1.5 スキーマのメリット
  69.   4.2 データフローの形態
  70.    4.2.1 データベース経由でのデータフロー
  71.    4.2.2 サービス経由でのデータフロー:RESTとRPC
  72.    4.2.3 メッセージパッシングによるデータフロー
  73.   まとめ
  74. 第Ⅱ部 分散データ
  75.   Ⅱ.1 高負荷に対応するスケーリング
  76.    Ⅱ.1.1 シェアードナッシングアーキテクチャ
  77.   Ⅱ.2 レプリケーションとパーティショニング
  78.  地図
  79.  5章 レプリケーション
  80.   5.1 リーダーとフォロワー
  81.    5.1.1 同期と非同期のレプリケーション
  82.    5.1.2 新しいフォロワーのセットアップ
  83.    5.1.3 ノード障害への対処
  84.    5.1.4 レプリケーションログの実装
  85.   5.2 レプリケーションラグにまつわる問題
  86.    5.2.1 自分が書いた内容の読み取り
  87.    5.2.2 モノトニックな読み取り
  88.    5.2.3 一貫性のあるプレフィックス読み取り
  89.    5.2.4 レプリケーションラグへの対処方法
  90.   5.3 マルチリーダーレプリケーション
  91.    5.3.1 マルチリーダーレプリケーションのユースケース
  92.    5.3.2 書き込みの衝突の処理
  93.    5.3.3 マルチリーダーレプリケーションのトポロジー
  94.   5.4 リーダーレスレプリケーション
  95.    5.4.1 ノードがダウンしている状態でのデータベースへの書き込み
  96.    5.4.2 クオラムの一貫性の限界
  97.    5.4.3 いい加減なクオラム(sloppy quorum)とヒント付きのハンドオフ
  98.    5.4.4 並行書き込みの検出
  99.   まとめ
  100.  地図
  101.  6章 パーティショニング
  102.   6.1 パーティショニングとレプリケーション
  103.   6.2 キー‐バリューデータのパーティショニング
  104.    6.2.1 キーの範囲に基づくパーティショニング
  105.    6.2.2 キーのハッシュに基づくパーティショニング
  106.    6.2.3 ワークロードのスキューとホットスポットの軽減
  107.   6.3 パーティショニングとセカンダリインデックス
  108.    6.3.1 ドキュメントによるセカンダリインデックスでのパーティショニング
  109.    6.3.2 語によるセカンダリインデックスでのパーティショニング
  110.   6.4 パーティションのリバランシング
  111.    6.4.1 リバランスの戦略
  112.    6.4.2 運用:自動のリバランスと手動のリバランス
  113.   6.5 リクエストのルーティング
  114.    6.5.1 パラレルクエリの実行
  115.   まとめ
  116.  地図
  117.  7章 トランザクション
  118.   7.1 トランザクションというとらえどころのない概念
  119.    7.1.1 ACIDの意味
  120.    7.1.2 単一オブジェクトと複数オブジェクトの操作
  121.   7.2 弱い分離レベル
  122.    7.2.1 Read Committed
  123.    7.2.2 スナップショット分離とリピータブルリード
  124.    7.2.3 更新のロストの回避
  125.    7.2.4 書き込みスキューとファントム
  126.   7.3 直列化可能性
  127.    7.3.1 完全な順次実行
  128.    7.3.2 ツーフェーズ(2相)ロック(2PL)
  129.    7.3.3 直列化可能なスナップショット分離(SSI)
  130.   まとめ
  131.  地図
  132.  8章 分散システムの問題
  133.   8.1 フォールトと部分障害
  134.    8.1.1 クラウドコンピューティングとスーパーコンピューティング
  135.   8.2 信頼性の低いネットワーク
  136.    8.2.1 ネットワークのフォールトの実際
  137.    8.2.2 フォールトの検出
  138.    8.2.3 タイムアウトと限度のない遅延
  139.    8.2.4 同期ネットワークと非同期ネットワーク
  140.   8.3 信頼性の低いクロック
  141.    8.3.1 単調増加のクロックと時刻のクロック
  142.    8.3.2 クロックの同期と正確性
  143.    8.3.3 同期クロックへの依存
  144.    8.3.4 プロセスの一時停止
  145.   8.4 知識、真実、虚偽
  146.    8.4.1 真実は多数決で決定される
  147.    8.4.2 ビザンチン障害
  148.    8.4.3 システムモデルと現実
  149.   まとめ
  150.  地図
  151.  9章 一貫性と合意
  152.   9.1 一貫性の保証
  153.   9.2 線形化可能性
  154.    9.2.1 システムを線形化可能にする条件は?
  155.    9.2.2 線形化可能性への依存
  156.    9.2.3 線形化可能なシステムの実装
  157.    9.2.4 線形化可能にすることによるコスト
  158.   9.3 順序の保証
  159.    9.3.1 順序と因果関係
  160.    9.3.2 シーケンス番号の順序
  161.    9.3.3 全順序のブロードキャスト
  162.   9.4 分散トランザクションと合意
  163.    9.4.1 アトミックなコミットと2相コミット(2PC)
  164.    9.4.2 分散トランザクションの実際
  165.    9.4.3 耐障害性を持つ合意
  166.    9.4.4 メンバーシップと協調サービス
  167.   まとめ
  168. 第Ⅲ部 導出データ
  169.   Ⅲ.1 記録のシステム(Systems of Record)と導出データ
  170.   Ⅲ.2 各章の概要
  171.  地図
  172.  10章 バッチ処理
  173.   10.1 Unixのツールによるバッチ処理
  174.    10.1.1 単純なログの分析
  175.    10.1.2 Unixの哲学
  176.   10.2 MapReduceと分散ファイルシステム
  177.    10.2.1 MapReduceジョブの実行
  178.    10.2.2 Reduce側での結合とグループ化
  179.    10.2.3 map側での結合(map-side join)
  180.    10.2.4 バッチワークフローの出力
  181.    10.2.5 Hadoopと分散データベースとの比較
  182.   10.3 MapReduceを超えて
  183.    10.3.1 中間的な状態の実体化
  184.    10.3.2 グラフとイテレーティブな処理
  185.    10.3.3 高レベルAPIと様々な言語
  186.   まとめ
  187.  地図
  188.  11章 ストリーム処理
  189.   11.1 イベントストリームの転送
  190.    11.1.1 メッセージングシステム
  191.    11.1.2 パーティション化されたログ
  192.   11.2 データベースとストリーム
  193.    11.2.1 システムの同期の保持
  194.    11.2.2 変更データのキャプチャ
  195.    11.2.3 イベントソーシング
  196.    11.2.4 状態、ストリーム、イミュータビリティ
  197.   11.3 ストリームの処理
  198.    11.3.1 ストリーム処理の利用
  199.    11.3.2 時間に関する考察
  200.    11.3.3 ストリームの結合
  201.    11.3.4 耐障害性
  202.   まとめ
  203.  地図
  204.  12章 データシステムの将来
  205.   12.1 データのインテグレーション
  206.    12.1.1 データの導出による特化したツールの組み合わせ
  207.    12.1.2 バッチ処理とストリーム処理
  208.   12.2 データベースを解きほぐす
  209.    12.2.1 データストレージ技術の組み合わせ
  210.    12.2.2 データフロー中心のアプリケーション設計
  211.    12.2.3 導出された状態の監視
  212.   12.3 正確性を求めて
  213.    12.3.1 データベースのエンドツーエンド論
  214.    12.3.2 制約の強制
  215.    12.3.3 適時性と整合性
  216.    12.3.4 信頼しつつも検証を
  217.   12.4 正しいことを行う
  218.    12.4.1 予測分析
  219.    12.4.2 プライバシーと追跡
  220.   まとめ
  221.  用語集
  222.  著者紹介
  223.  奥付

Product information

  • Title: データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理
  • Author(s): Martin Kleppmann, 斉藤 太郎, 玉川 竜司
  • Release date: July 2019
  • Publisher(s): O'Reilly Japan, Inc.
  • ISBN: 9784873118703

You might also like

book

並行プログラミング入門 ―Rust、C、アセンブリによる実装からのアプローチ

by 高野 祐輝

複数のプログラムを同時に実行する「並行プログラミング」は、処理速度を飛躍的に向上させる手法で、タスク管理、プロセス管理、スレッド管理をはじめ、複雑な仕組みについての幅広い知識とテクニックが必要となります。本書はRustとアセンブリ、そして一部Cを用い、CPUのアトミック命令、グリーンスレッド、アクターモデル、π計算、ソフトウェア・トランザクショナルメモリ、async/awaitなど、並行プログラミングに関する理論的な背景から実装までをカバー。さらに、アセンブリ実装の理解を深めるため、AArch64とx86-64アーキテクチャの説明も付録として収録。一歩一歩、着実に理解できるように、その仕組みから順を追って詳しく説明します。GitHub上で公開されているソースコードを実際に動かしながら、並行プログラミングの知識と理解を深めることができます。

book

初めてのSQL 第3版

by Alan Beaulieu, 株式会社クイープ

SQL言語に初めて触れるプログラマを対象に、SQL言語の基本を解説します。データベースの歴史、概念などの基礎知識から、データベースの作成、クエリの基本、フィルタリング、トランザクションなどまで、実践に必要なポイントを過不足なくコンパクトにまとめ、理解を深められるよう練習問題を用意しています。改訂にあたり、「ビュー」「メタデータ」「解析関数」「大規模なデータベースの操作」「SQLとビッグデータ」の章が追加され、さらに充実しました。SQLを学び始めるのに最適の一冊です。

book

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

by Andreas C. Muller, Sarah Guido, 中田 秀基

Pythonの機械学習用ライブラリの定番、scikit-learnのリリースマネージャを務めるなど開発に深く関わる著者が、scikit-learnを使った機械学習の方法を、ステップバイステップで解説します。ニューラルネットを学ぶ前に習得しておきたい機械学習の基礎をおさえるとともに、優れた機械学習システムを実装し精度の高い予測モデルを構築する上で重要となる「特徴量エンジニアリング」と「モデルの評価と改善」について多くのページを割くなど、従来の機械学習の解説書にはない特長を備えています。

book

大規模データ管理 ―エンタープライズアーキテクチャのベストプラクティス

by Piethein Strengholt, 村上 列

データ管理と統合が急速に進化する中、複雑で緊密に結合したアーキテクチャから、現代のビジネスに対応できる、より柔軟なデータアーキテクチャへの移行が求められます。 本書は、変化が激しい時代でも長期的に持続可能な方法で大規模なデータ管理を行い、さまざまなユースケースに対応できる統合アーキテクチャを紹介します。この統合アーキテクチャを構成する、膨大なデータ利用に向けた「読み出し専用データストアアーキテクチャ」、リアルタイムなアプリケーションのための「APIアーキテクチャ」、大容量のスループットを実現する「ストリーミングアーキテクチャ」を詳述します。また技術開発、法規制、プライバシーに関する懸念など、データ管理全体を説明し、データガバナンスとセキュリティ、マスターデータ管理、セルフサービスとデータマーケットプレイス、メタデータの重要性について解説します。 企業のデータ戦略にかかわる本書は、アーキテクトはもちろん、経営者、ガバナンスチーム、データ分析・エンジニアリングチーム必携の一冊です。