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

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

プロダクトマネジメント ―ビルドトラップを避け顧客に価値を届ける

by Melissa Perri, 吉羽 龍太郎

本書は、顧客に価値を届けるプロダクトを作り出すプロダクトマネジメントについて学ぶ本です。プロダクトマネジメントを理解することで、企業がビジネス目標を達成しながら、顧客の課題を解決する方法を解説します。はじめにプロダクトマネージャーの役割と責任を定義し、優れた意思決定を促す戦略の立て方を紹介します。実験と最適化によって作るべきプロダクトを決めるプロセスを解説し、最後にプロダクト主導の組織を支えるための文化や方針を紹介します。ビルドトラップを避け、顧客の課題にフォーカスするプロダクトマネジメントの原則を解説する本書は、規模の大小を問わずすべてのプロダクトチーム、マネージャー、プログラマ、アーキテクト、デザイナ、マーケターに必携の一冊です。

book

ドメイン駆動設計をはじめよう ―ソフトウェアの実装と事業戦略を結びつける実践技法

by Vlad Khononov, 増田 亨, 綿引 琢磨

ドメイン駆動設計はエリック・エヴァンスにより提唱されたソフトウェア設計の手法です。対象とする事業活動(ドメイン)とその課題の観点から、より良いソフトウェアを構築するために関係者が協力する方法を提供します。本書は4部構成になっており、第Ⅰ部「設計の基本方針」では、ソフトウェアの設計方針を大きな視点から決めるための考え方とやり方を取り上げます。第Ⅱ部「実装方法の選択」ではソースコードに焦点を合わせ、業務ロジックをどう実装するかの選択肢を学びます。第Ⅲ部「ドメイン駆動設計の実践」では、ソフトウェア開発の現場にドメイン駆動設計を実践的に取り入れるための方法を紹介します。第Ⅳ部「他の方法論や設計技法との関係」では、ドメイン駆動設計とそれ以外の方法論や設計技法との関係を検討します。最新の技術トレンドを取り入れながら、ドメイン駆動設計の基本概念と実践方法をわかりやすく解説します。

book

ベタープログラマ ―優れたプログラマになるための38の考え方とテクニック

by Pete Goodliffe, 柴田 芳樹

本書は、優れたコードを作りだし、人々と効率的に働く生産性の高いプログラマになるための考え方とテクニックを38のテーマで紹介します。個人的な活動として、継続的な学習方法と停滞を避けるための課題の見つけ方など、自らを成長させる方法も紹介。さらに組織の中で他の人とコミュニケーションを取りながら、効果的に働くための習慣を解説します。『Code Craft』の著者Pete Goodliffeが、自らの経験を元に「優れたプログラマ」になるための考え方と習慣をまとめた本書は、プログラミングを愛し、長く続けながら、優れたプログラマになりたいと思うすべての人に必携の一冊です。