データ指向アプリケーションデザインを読んでいる+諸概念をまとめている

Edit

データ指向アプリケーションデザインを読んでいる

目次

オライリーのデータ指向アプリケーションデザインの紹介サイト から目次を引用しました。


第I部データシステムの基礎

  • 1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション
    • 1.1 データシステムに関する考察
    • 1.2 信頼性
      • 1.2.1 ハードウェアの障害
      • 1.2.2 ソフトウェアのエラー
      • 1.2.3 ヒューマンエラー
      • 1.2.4 信頼性の重要度
    • 1.3 スケーラビリティ
      • 1.3.1 負荷の表現
      • 1.3.2 パフォーマンスの表現
      • 1.3.3 負荷への対処のアプローチ
    • 1.4 メンテナンス性
      • 1.4.1 運用性:運用担当者への配慮
      • 1.4.2 単純さ:複雑さの管理
      • 1.4.3 進化性:変更への配慮
    • まとめ
  • 2章 データモデルとクエリ言語
    • 2.1 リレーショナルモデルとドキュメントモデル
      • 2.1.1 NoSQLの誕生
      • 2.1.2 オブジェクトとリレーショナルのミスマッチ
      • 2.1.3 多対一と多対多の関係
      • 2.1.4 ドキュメントデータベースは歴史を繰り返すのか?
      • 2.1.5 今日のリレーショナルデータベースとドキュメントデータベース
    • 2.2 データのためのクエリ言語
      • 2.2.1 Web上での宣言的クエリ
      • 2.2.2 MapReduceでのクエリ
    • 2.3 グラフ型のデータモデル
      • 2.3.1 プロパティグラフ
      • 2.3.2 Cypherクエリ言語
      • 2.3.3 SQLでのグラフクエリ
      • 2.3.4 トリプルストアとSPARQL
      • 2.3.5 礎となったもの:Datalog
    • まとめ
  • 3章 ストレージと抽出
    • 3.1 データベースを駆動するデータ構造
      • 3.1.1 ハッシュインデックス
      • 3.1.2 SSTableとLSMツリー
      • 3.1.3 Bツリー
      • 3.1.4 BツリーとLSMツリーの比較
      • 3.1.5 その他のインデックス構造
    • 3.2 トランザクション処理か、分析処理か?
      • 3.2.1 データウェアハウス
      • 3.2.2 スターとスノーフレーク:分析のためのスキーマ
    • 3.3 列指向ストレージ
      • 3.3.1 列の圧縮
      • 3.3.2 列ストレージにおけるソート順序
      • 3.3.3 列指向ストレージへの書き込み
      • 3.3.4 集計:データキューブとマテリアライズドビュー
    • まとめ
  • 4章 エンコーディングと進化
    • 4.1 データエンコードのフォーマット
      • 4.1.1 言語固有のフォーマット
      • 4.1.2 JSON、XML、様々なバイナリフォーマット
      • 4.1.3 ThriftとProtocolBuffers
      • 4.1.4 Avro
      • 4.1.5 スキーマのメリット
    • 4.2 データフローの形態
      • 4.2.1 データベース経由でのデータフロー
      • 4.2.2 サービス経由でのデータフロー:RESTとRPC
      • 4.2.3 メッセージパッシングによるデータフロー
    • まとめ

第II部 分散データ

  • II.1 高負荷に対応するスケーリング

    • II.1.1 シェアードナッシングアーキテクチャ
  • II.2 レプリケーションとパーティショニング

  • 5章 レプリケーション

    • 5.1 リーダーとフォロワー
      • 5.1.1 同期と非同期のレプリケーション
      • 5.1.2 新しいフォロワーのセットアップ
      • 5.1.3 ノード障害への対処
      • 5.1.4 レプリケーションログの実装
    • 5.2 レプリケーションラグにまつわる問題
      • 5.2.1 自分が書いた内容の読み取り
      • 5.2.2 モノトニックな読み取り
      • 5.2.3 一貫性のあるプレフィックス読み取り
      • 5.2.4 レプリケーションラグへの対処方法
    • 5.3 マルチリーダーレプリケーション
      • 5.3.1 マルチリーダーレプリケーションのユースケース
      • 5.3.2 書き込みの衝突の処理
      • 5.3.3 マルチリーダーレプリケーションのトポロジー
    • 5.4 リーダーレスレプリケーション
      • 5.4.1 ノードがダウンしている状態でのデータベースへの書き込み
      • 5.4.2 クオラムの一貫性の限界
      • 5.4.3 いい加減なクオラム(sloppyquorum)とヒント付きのハンドオフ
      • 5.4.4 並行書き込みの検出
    • まとめ
  • 6章 パーティショニング

    • 6.1 パーティショニングとレプリケーション
    • 6.2 キー‐バリューデータのパーティショニング
      • 6.2.1 キーの範囲に基づくパーティショニング
      • 6.2.2 キーのハッシュに基づくパーティショニング
      • 6.2.3 ワークロードのスキューとホットスポットの軽減
    • 6.3 パーティショニングとセカンダリインデックス
      • 6.3.1 ドキュメントによるセカンダリインデックスでのパーティショニング
      • 6.3.2 語によるセカンダリインデックスでのパーティショニング
    • 6.4 パーティションのリバランシング
      • 6.4.1 リバランスの戦略
      • 6.4.2 運用:自動のリバランスと手動のリバランス
    • 6.5 リクエストのルーティング
      • 6.5.1 パラレルクエリの実行
    • まとめ
  • 7章 トランザクション

    • 7.1 トランザクションというとらえどころのない概念
      • 7.1.1 ACIDの意味
      • 7.1.2 単一オブジェクトと複数オブジェクトの操作
    • 7.2 弱い分離レベル
      • 7.2.1 ReadCommitted
      • 7.2.2 スナップショット分離とリピータブルリード
      • 7.2.3 更新のロストの回避
      • 7.2.4 書き込みスキューとファントム
    • 7.3 直列化可能性
      • 7.3.1 完全な順次実行
      • 7.3.2 ツーフェーズ(2相)ロック(2PL)
      • 7.3.3 直列化可能なスナップショット分離(SSI)
    • まとめ
  • 8章 分散システムの問題

    • 8.1 フォールトと部分障害
      • 8.1.1 クラウドコンピューティングとスーパーコンピューティング
    • 8.2 信頼性の低いネットワーク
      • 8.2.1 ネットワークのフォールトの実際
      • 8.2.2 フォールトの検出
      • 8.2.3 タイムアウトと限度のない遅延
      • 8.2.4 同期ネットワークと非同期ネットワーク
    • 8.3 信頼性の低いクロック
      • 8.3.1 単調増加のクロックと時刻のクロック
      • 8.3.2 クロックの同期と正確性
      • 8.3.3 同期クロックへの依存
      • 8.3.4 プロセスの一時停止
    • 8.4 知識、真実、虚偽
      • 8.4.1 真実は多数決で決定される
      • 8.4.2 ビザンチン障害
      • 8.4.3 システムモデルと現実
    • まとめ
  • 9章 一貫性と合意

    • 9.1 一貫性の保証
    • 9.2 線形化可能性
      • 9.2.1 システムを線形化可能にする条件は?
      • 9.2.2 線形化可能性への依存
      • 9.2.3 線形化可能なシステムの実装
      • 9.2.4 線形化可能にすることによるコスト
    • 9.3 順序の保証
      • 9.3.1 順序と因果関係
      • 9.3.2 シーケンス番号の順序
      • 9.3.3 全順序のブロードキャスト
    • 9.4 分散トランザクションと合意
      • 9.4.1 アトミックなコミットと2相コミット(2PC)
      • 9.4.2 分散トランザクションの実際
      • 9.4.3 耐障害性を持つ合意
      • 9.4.4 メンバーシップと協調サービス
    • まとめ

第III部 導出データ

  • III.1 記録のシステム(SystemsofRecord)と導出データ
  • III.2 各章の概要
  • 10章 バッチ処理
    • 10.1 Unixのツールによるバッチ処理
      • 10.1.1 単純なログの分析
      • 10.1.2 Unixの哲学
    • 10.2 MapReduceと分散ファイルシステム
      • 10.2.1 MapReduceジョブの実行
      • 10.2.2 Reduce側での結合とグループ化
      • 10.2.3 map側での結合(map-sidejoin)
      • 10.2.4 バッチワークフローの出力
      • 10.2.5 Hadoopと分散データベースとの比較
    • 10.3 MapReduceを超えて
      • 10.3.1 中間的な状態の実体化
      • 10.3.2 グラフとイテレーティブな処理
      • 10.3.3 高レベルAPIと様々な言語
    • まとめ
  • 11章 ストリーム処理
    • 11.1 イベントストリームの転送
      • 11.1.1 メッセージングシステム
      • 11.1.2 パーティション化されたログ
    • 11.2 データベースとストリーム
      • 11.2.1 システムの同期の保持
      • 11.2.2 変更データのキャプチャ
      • 11.2.3 イベントソーシング
      • 11.2.4 状態、ストリーム、イミュータビリティ
    • 11.3 ストリームの処理
      • 11.3.1 ストリーム処理の利用
      • 11.3.2 時間に関する考察
      • 11.3.3 ストリームの結合
      • 11.3.4 耐障害性
    • まとめ
  • 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 正しいことを行う
      • 12.4.1 予測分析
      • 12.4.2 プライバシーと追跡
    • まとめ
  • 用語集
  • 索引

圧倒的な情報量

目次でわかりますよね、この本の圧倒的な情報量…。和訳バージョンは634ページほどのボリュームで、母国語で読むだけでも半年はかかるのではないかと思う。

著者のMartin Kleppmannはケンブリッジ大学で分散システムに関する研究を行っている現役の研究者で、4年かけてこの本を作成したらしいです。当然、一流の研究者が4年かけて書いた本なだけあってページ数も多い上に、各ページの情報量も多いですね。

重要な用語を頭に叩き込む

長い上に内容も難しいものになっているので、工夫して読む必要があります。

入門書としてこの本を使った場合は知らない単語に遭遇することが多いので、各章ごと読む前に重要な単語を頭に叩き込みましょう。

* 表の内容の一部は他の表の内容と多重することがあります。

1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション

単語(日本語) 単語(英語)
キャッシュ cache
シェアードナッシング shared-nothing
ストリーム処理 stream process
耐障害性 fault-tolerant
パーセンタイル percentile
バッチ処理 batch process

2章 データモデルとクエリ言語

単語(日本語) 単語(英語)
グラフ graph
スキーマ schema
正規化 normalized
宣言的 declarative
結合 join
ノード node
バッチ処理 batch process
非正規化 denormalize
ローカリティ locality

3章 ストレージと抽出

単語(日本語) 単語(英語)
ETL(抽出、変換、ロード) ETL(Extract, Transform, Load)
OLAP(オンライン分析処理) OLAP(Online Analytic Processing)
OLTP(オンライントランザクション処理) OLTP(Online Transaction Processing)
インデックス index
スキーマ schema
セカンダリインデックス secondary index
全文検索 full-text search
データウェアハウス data warehouse
トランザクション transaction
ハッシュ hash
バッチ処理 batch process
プライマリーキー primary key
マテリアライズ(実体化) materialize
ログ log

4章 エンコーディングと進化

単語(日本語) 単語(英語)
スキーマ schema
タイムアウト timeout
分散 distributed
冪等 idempontent

第II部 分散データ

単語(日本語) 単語(英語)
シェアードナッシング shared-nothing
耐障害性 fault-tolerant
ノード node
パーティショニング partitioning
レプリケーション replication

5章 レプリケーション

単語(日本語) 単語(英語)
クオラム quorum
合意 consensus
ストアドプロシージャ stored procedure
スプリットブレイン split brain
同期 synchronous
トランザクション transaction
非同期 asynchronous
フェイルオーバー failover
フォロワー follower
リーダー leader
レプリケーション replication
ログ log

6章 パーティショニング

単語(日本語) 単語(英語)
シェアードナッシング shared-nothing
スキュー skew
セカンダリインデックス secondary index
パーティショニング partitioning
ハッシュ hash
リバランス rebalance
レプリケーション replication

7章 トランザクション

単語(日本語) 単語(英語)
2相コミット two-phase commit
アトミック atomic
インデックス index
決定的 deterministic
スキュー skew
ストアドプロシージャ stored procedure
セカンダリインデックス secondary index
線形化可能性 linearizability
耐久性/永続性 durable
直列化可能 serializable
ツーフェーズロック(2PC) two-phase locking(2PC)
トランザクション transaction
パーティショニング partitioning
分離性 isolation
レプリケーション replication

8章 分散システムの問題

単語(日本語) 単語(英語)
クオラム quorum
合意 consensus
タイムアウト timeout
同期 synchronous
ノード node
バックプレッシャー(フロー制御) backpressure(flow control)
ビザンチン障害 Byzantine fault
非同期 asynchronous
有限 bound
有限でない unbound
リーダー leader

9章 一貫性と合意

単語(日本語) 単語(英語)
2相コミット two-phase commit
CAP定理 CAP theorem
アトミック atomic
因果関係 causality
クオラム quorum
合意 consensus
スプリットブレイン split brain
線形化可能性 linearizability
全順序 total order
直列化可能 serializable
トランザクション transaction
ノード node
分散 distributed
リーダー leader
レプリケーション replication
ログ log

第III部 導出データ

単語(日本語) 単語(英語)
記録のシステム Systems of Record
非正規化 denormalize
ロック lock

10章 バッチ処理

単語(日本語) 単語(英語)
OLAP(オンライン分析処理) OLAP(Online Analytic Processing)
OLTP(オンライントランザクション処理) OLTP(Online Transaction Processing)
インデックス index
グラフ graph
シェアードナッシング shared-nothing
スキュー skew
耐障害性 fault-tolerant
結合 join
パーティショニング partitioning
ハッシュ hash
バッチ処理 batch process
マテリアライズ(実体化) materialize
ログ log

11章 ストリーム処理

単語(日本語) 単語(英語)
アトミック atomic
ストリーム処理 stream process
耐障害性 fault-tolerant
導出データ derived data
バックプレッシャー(フロー制御) backpressure(flow control)
バッチ処理 batch process
分散 distributed
冪等 idempontent
有限 bound
有限でない unbound
ログ log

12章 データシステムの将来

単語(日本語) 単語(英語)
インデックス index
キャッシュ cache
スキーマ schema
ストリーム処理 stream process
全文検索 full-text search
導出データ derived data
分散 distributed
冪等 idempontent
リーダー leader

重要な用語の詳細な説明

1章から初めて登場する用語

キャッシュ(cache)

  • 低速なデータストレージシステムから取得したデータのうち、将来同じデータを参照するときの読み取りの高速化のために、直前に読み取ったものや使用頻度が高いものを記憶することや、記憶する記憶装置や、そこで複製されたデータ自体のこと

バッチ処理(batch processing)

  • 蓄積された大量のデータを定期的に処理する
  • 大量の入力データを受け取り、出力として他のデータを生成する演算処理

ストリーム処理(stream processing)

  • イベントが生じるたびに連続的に処理をする
  • 終わりのないイベントのストリームを入力として取り、そこから何らかの出力を導き出す連続的な演算処理
  • ストリームの意味
    • 時間の経過に伴って徐々に利用できるようになるデータ

耐障害性(fault-tolerant)

  • 何か問題(マシンのクラッシュ, ネットワークのリンクの失敗)が生じても自動的に回復できるシステムの性質

パーセンタイル(percentile)

  • ある閾値以上あるいは以下の値がいくつあるのかを数えることによって値の分布を計測する手法

シェアードナッシング(shared-nothing)

  • それぞれにCPU, メモリ, ディスクを持つ独立したノード群が従来のネットワークで接続されたアーキテクチャ
  • 共有メモリや共有ディスクのアーキテクチャとは対照的である

2章から初めて登場する用語

ローカリティ(locality)

  • 頻繁に同時に必要になる複数のデータ片を同じ場所に置くこと
    • ドキュメントデータベースに関する文脈でよく使われる
  • パフォーマンス最適化の一種

結合(join)

  • 共通する属性を持つレコード同士をまとめること
  • あるレコードが他のレコードへの参照(外部キー、ドキュメント参照、グラフにおける辺)を持ち、クエリがその参照先のレコードを取得する必要がある場合がよく使われる場合に結合がよく使われる

正規化(normalized)

  • 冗長性や重複がないように構造化されていること
    • 正規化したデータベースでは、データの一部が変更された場合、その変更が必要なのは一箇所だけであり、複数の様々な箇所で複数のコピーを変更する必要はない

非正規化(denormalize)

  • 正規化されたデータセットにある程度の冗長性や重複を導入すること
  • クエリを高速化するために使う

スキーマ(schema)

  • この本の扱う範囲では、概念スキーマを示す
    • 概念スキーマ
      • DB上のフィールドやその型およびフィールド同士の関係を定義する論理データ(RDBならばテーブルに相当)

宣言的(declarative)

  • 宣言的な言語は求めるデータのパターンや変換(ex. ソート、グループ化、集計)だけを指定し、それを得るための具体的な方法を記述しない
    • 宣言的な言語の例
      • SQL
  • 対義語的に、命令的な言語というものが存在し、目的とそれを達成するための具体的な方法を記述する
    • 宣言的な言語の例
      • IMS
      • CODASYL

ノード(node)

  • コンピュータ上で何らかのソフトウェアが動作しているインスタンス
  • タスクを実行するために、他のノードとネットワークを通じて通信する

グラフ(graph)

  • 頂点と辺からなるデータ構造
    • 頂点
      • ノード、エンティティとも呼ばれること
      • 関係性、弧とも呼ばれる
  • グラフでモデル化できる典型的なもの
    • ソーシャルグラフ
      • 頂点が人
      • 辺が知人関係
    • Webグラフ
      • 頂点がWebページ
      • 辺が他のWebページへのHTMLリンク

3章から初めて登場する用語

インデックス(index)

  • 特定のフィールドに特定の値を持つすべてのレコードを効率的に検索できるようにしたデータ構造
  • 元のデータから導出される追加のデータ構造
  • 影響するのはクエリのパフォーマンスのみ
    • 書き込みの速度を低速にする
    • 読み出しの速度を高速にする
  • データベースの内容には影響しない

ハッシュ(hash)

  • 入力をランダムに見える数値に変換する関数
  • 同じ入力からは常に同じ数値が出力として返される
  • 2つの異なる入力からは、2つの異なる数値が出力として返される可能性が極めて低いものの、2つの異なる入力が同じ出力を生成することはありえる(衝突という)

ログ(log)

  • 追記のみが行われるデータを保有するファイル
  • 様々なログ
    • write-aheadログ
      • redoログとも呼ばれる
      • クラッシュに対して耐性をストレージエンジンに持たせるために利用される
      • Bツリーの場合、すべての変更内容をツリーのページに反映させる前に書き込む
        • クラッシュ後にwrite-aheadログを使ってBツリーを整合性の取れた形に回復させる
    • log-structuredストレージエンジン
      • ストレージフォーマットとしてログを利用している
      • イミュータブルなデータ構造を持ち、関数型プログラミング言語で使用されることが多い
      • log-structuredストレージエンジンの例
        • LSMツリー
    • レプリケーションログ
      • リーダーがトランザクションを処理する際に生成されるデータベースへの書き込みイベントのストリーム
      • 詳細な役割の説明
        • クライアントがリクエストをリーダに送信してデータベースへ書き込みを行い、リーダーが新しいデータをローカルストレージに書き込む、そして、フォロワー(リーダーではない他のノード)にレプリケーションログの一部としてリーダーの変更データを送信する
    • イベントログ
      • データストリームを表現する
      • ログベースメッセージブローカーの実装に利用される
        • ログベースメッセージブローカーとは
          • コンシューマに配信されてもメッセージを消去しないメッセージブローカー

セカンダリインデックス(secondary index)

  • 特定条件にマッチするレコードの効率的な検索を可能にするインデックス構造
  • キーがユニークではない
  • 使い方の例
    • user_id列にセカンダリインデックスを持たせて、同じユーザに属する列をすべて見つけられるようにする

プライマリーキー(primary key)

  • レコードをユニークに特定する値
  • 多くのアプリケーションでは、プライマリーキーはレコードの生成時にシステムによって生成される
  • プライマリーキーは通常ユーザーによって設定されることはない

  • セカンダリインデックスの一種
  • 任意のキーワードによるテキストの検索
  • しばしば、綴りの似た単語や類義語のマッチといった追加機能を持つ

トランザクション(transaction)

  • トランザクションはデータベース管理システムにおける動作の分割不可能な論理単位
  • トランザクションは複数の操作を1つのステップとして表す
    • 操作はデータベースレコードの読み取りと書き込みが含まれる
  • トラザクションは全体として以下のいずれかのような形で終了する
    • コミット(commit)
      • トランザクションの処理をすべて成功させる
    • 中断(abort)、ロールバック(rollback)
      • トランザクションの処理をすべて無効にして破棄する
  • トランザクションはACIDという頭文字の略語が示す安全性を保証している
    • A…原子性(Atomicity)
      • 詳細
        • 以下の2つの状態のいずれかしか見ることができない
          • 処理のすべてが成功している
          • 処理のいずれも成功していない
      • 目的
        • アプリケーションが前回の処理をリトライさせるとき、データが重複したり不正確になったりするのを防ぐため
    • C…一貫性(Consistency)
      • 詳細
        • 処理の前後でデータの制約、参照整合性が保たれたまま、矛盾の無い状態が継続される
        • 送金トランザクションで口座の残高の値がマイナスにならない
      • 注意
        • アプリケーションが不変性に違反する悪いデータを書き込んだときにデータベースはその書き込みを止めることができない
        • 一貫性を保つことはデータベースの責任ではなく、アプリケーションの責任でもある
    • I…分離性(Isolation)
      • 詳細
        • それぞれの処理がデータベース全体の中で行われている唯一の処理である
          • 直列化可能性と同じ意味である
        • 並行して実行される複数の処理が、互いに干渉を受けずに実行できる
        • 「ある数字に対して1を加えた数字を書き戻す」というインクリメント操作を0に対して5個複数並行して行っても、最終的な値は5になる
    • D…永続性(Durability)
      • 詳細
        • 単一ノードの場合
          • コミットされた処理のすべての変更をディスク上に永続化する
        • レプリケーションされているデータベースの場合
          • 一定数のノードへのデータのコピーが成功する

OLTP(オンライントランザクション処理=Online Transaction Processing)

  • ユーザからの多数のリクエストとトランザクションを処理する
  • クエリは事前に定義されていて、短時間で処理される
  • 特性
    • 読み取りのパターン
      • クエリごとに少数のレコードをキーに基づいてフェッチ
    • 書き込みのパターン
      • ユーザの入力によるランダムアクセスと低レイテンシの書き込み
    • 主な利用者
      • Webアプリケーションを利用するエンドユーザ、顧客
    • データの内容
      • 現時点でのデータの最新の状態
    • データセットのサイズ
      • ギガバイトからテラバイト

OLAP(オンライン分析処理=Online Analytic Processing)

  • 集計処理を行い、主に分析とデータウェアハウス用途で使用される
  • 実行時間が長く、アドホックなクエリの処理が可能
  • 特性
    • 読み取りのパターン
      • 大量のレコードを集計
    • 書き込みのパターン
      • バルクインポート(ETL)あるいはイベントストリーム
    • 主な利用者
      • 経営判断を支援する組織内のアナリスト
    • データの内容
      • 時間の経過とともに生じた出来事の履歴
    • データセットのサイズ
      • テラバイトからペタバイト

データウェアハウス(data warehouse)

  • 複数の異なるOLTPシステムからのデータを組み合わせ、分析目的で利用できるようにした独立したデータベース
  • OLTPの処理に影響を及ぼすことなく重要なデータに対するクエリを実行できる

ETL(抽出=Extract、変換=Transform、ロード=Load)

  • データをデータベースから抽出(Extract)し、分析に適したクエリに適したスキーマに変換(Transform)し、データウェアハウスあるいはバッチ処理をするシステムへロード(Load)する処理のこと

マテリアライズ(materialize)

  • 演算を要求された時点で行うのではなく、事前に行ってその結果を書き出しておくこと

4章から初めて登場する用語

分散(distributed)

  • ネットワークによって接続された複数のノード上で動作すること
  • 部分障害によって特徴付けられる
    • システムの一部が壊れているかもしれないものの他の部分は依然として動作している
    • しばしばソフトウェアによっては正確に何が壊れているかを知ることが不可能である

タイムアウト(timeout)

  • 一定時間内にレスポンスがないことを確認してフォールトを検出する方法
  • リモートノード、ネットワーク、どちらの問題によってフォールトが発生したかわからない

冪等(idempontent)

  • 安全にリトライできる処理のこと
  • 仮に2回以上実行されたとしても、1回だけ実行されたのと同じ効果しか及ぼさない

第II部導入から初めて登場する用語

レプリケーション(replication)

  • 同じデータのコピーを複数のノードに保持する方法
    • ノードは様々な地域に置かれることもある
  • レプリケーションは冗長性を提供する
  • レプリケーションはパフォーマンスの改善にも役立つ

パーティショニング(partitioning)

  • 巨大なデータベースをパーティションと呼ばれる小さなサブセットに分割する方法
  • それぞれのパーティションは別々のノードに割り当てられる
    • シャーディングと呼ばれることもある

5章から初めて登場する用語

リーダー(leader)

  • 変更を行うことが許されたレプリカ
  • リーダーは何らかのプロトコルを通じて選出されるか、管理者によって手動で選択される
  • プライマリあるいはマスターと呼ばれることもある

フォロワー(follower)

  • リーダーから受信したデータの変更だけを処理するレプリカ
  • クライアントから見るとリードオンリーである
  • セカンダリ、スレーブ、リードレプリカ、ホットスタンバイと呼ばれることもある

同期(synchronous)

  • 何か(ネットワークを通じた他のノードへのデータ送信など)が終わるのを待ち、その処理の時間の限度に前提を置くこと

非同期(asynchronous)

  • 何か(ネットワークを通じた他のノードへのデータ送信など)が終わるのを待たず、その処理の時間の限度に前提を置かないこと

合意(consensus)

  • 何かについて複数のノードの合意を取ること
    • データベースクラスタのリーダーにどのノードがなるべきかなど
  • 形式化された説明
    • 1つ以上のノードが値を提案(propos)し、合意アルゴリズムはそれらの値の中から1つを決定(decide)する
    • 合意アルゴリズムは以下の性質を満たす
      • 一様合意 (uniform agreement)
        • 2つのノードが異なる決定をしていないこと
      • 整合性 (integrity)
        • 2回決定しているノードがないこと
      • 妥当性 (validity)
        • ノードが値vを決定したら、vを提案しているノードがあること
        • 何を提案してもnullを決定するアルゴリズムがあったら、一様合意と整合性は満たしているものの、妥当性は満たさない
      • 終了性 (termination)
        • クラッシュしていないすべてのノードは、最終的に何らかの値を決定すること
        • もしいくつかのノードに障害があっても、他のノードは決定に達しなければならない

フェイルオーバー(failover)

  • リーダーシップの役割をあるノードから他のノードへ移すプロセス

スプリットブレイン(split brain)

  • 2つのノードが同時に自分がリーダーだと信じてしまい、そのためにシステムの保証が破られかねないような状態

決定的(deterministic)

  • 同じ入力が与えられれば常に同じ出力を生成する関数のこと
    • 関数が乱数や、時刻、ネットワークの通信、あるいはその他の予測できないことに依存できないことを意味する

ストアドプロシージャ(stored procedure)

  • トランザクションのロジックを完全にデータベースサーバー上で実行し、トランザクションの間、クライアントとのやりとりを不要にするようなロジックのエンコーディング方法
  • 外部とのやりとりを行う複数文を含むトランザクションを禁止して、トランザクションのコード全体を事前にデータベースに登録する

クオラム(quorum)

  • 操作が成功したと見なされるために、投票する必要があるノードの最小数
    • 通常、全体のノードの過半数
  • 「w + r > n」のようなクオラムの条件に従って行う読み書きをクオラム読み取り、クオラム書き込みと呼ぶ
    • wは成功した書き込み
    • rは成功した読み込み
    • nはレプリカ数

6章から初めて登場する用語

スキュー(skew)

  • 意味が複数あるので注意
  • パーティション間での負荷の不均衡
    • いくつかのパーティションが大量のリクエストやデータを持ち、その他のパーティションははるかに少ない場合など
    • 不均等な高負荷が集中しているパーティションは「ホットスポット」と呼ばれる
  • タイミングの異常
    • イベントが予想外に、シーケンシャルでない順序で現れる原因となる

リバランス(rebalance)

  • 負荷を公平に分散させるために、データあるいはサービスをあるノードから別のノードへ移動させること
  • リバランスが満たす必要がある最低限のこと
    • リバランスの終了後、負荷はクラスタ内のノード間で公平に分配されていなければならない
    • リバランスが行われている間、データベースは読み書きを受け付け続けなければならない
    • ノード間を移動させるデータは必要最小限にとどめ、リバランスが高速で行われ、ネットワークやディスクI/Oの負荷が最小になるようにする

7章から初めて登場する用語

直列化可能(serializable)

  • 複数のトランザクションが並行に実行されたときに、それらがある順序に従って1つずつ実行されたのと同じように振る舞うことの保証

分離性(isolation)

  • トランザクションの文脈において、並行に実行されているトランザクション同士が、お互いに干渉しない度合いを示す

耐久性/永続性(durable)

  • 様々なフォールトがあったとしても、データが失われることがないと考えられるような方法でデータを保存すること
  • トランザクションのコミットに成功したら、仮にハードウェアの障害やデータベースのクラッシュがあったとしても、そのトランザクションで書き込まれたすべてのデータは失われないことを約束すること

線形化可能性(linearizability)

  • レプリカ(データのコピー)が1つしかなく、そのレプリカのデータに対するすべての操作がアトミックであるかのようにシステムが振る舞うこと
    • 結果整合性を持つデータベースでは、同時に同じ質問を異なる2つのレプリカに投げると返される答えが異なっているかもしれず、混乱を招くことになる
  • 最新性の保証でもある
    • 読み取られる値が最新の値であること
    • 1つのクライアントの書き込みが成功すれば、即座にそのデータベースから読み取りを行うすべてのクライアントが書き込まれたばかりの値を見ることができなければならない

2相コミット(commit)

  • 複数のデータベースノードでトランザクションがすべてコミットするか、もしくはすべて中断となることを保証するアルゴリズム

アトミック(atomic)

  • 並行処理の文脈においては、ある時刻上の一点で有効になる操作で、他の並行プロセスからは「半分完了した」状態に見えることがない処理
  • トランザクションの文脈においては、仮に障害が起きたとしてもすべてがコミットもしくはロールバックされなければならない一群の書き込みをグループ化すること

ロック(lock)

  • 単一のスレッド、ノード、トランザクションのみが何かにアクセスできることを保証する仕組み
  • 同じものにアクセスしようとした他者は、ロックが解放されるまで待たなければならない

ツーフェーズロック(two-phase locking)

  • 直列化可能な分離を実現するためのアルゴリズム
  • トランザクションが読み書きするすべてのデータのロックを取り、そのロックをトランザクションの完了まで保持することによって動作する

8章から初めて登場する用語

有限(bound)

  • 上限や大きさが既知であること
    • ネットワークの遅延やデータセットなどの文脈で使われる

有限ではない(unbound)

  • 上限や大きさが既知でないこと

バックプレッシャー(backpressure)

  • 受信側が追従できないことから、データの送信元をスローダウンさせること
  • TCPのバックプレッシャー
    • ノードはネットワークリンクや受信側のノードを過負荷にいたらせることがないよう、自身の送信レートを制限する
  • フロー制御とも呼ばれる

ビザンチン障害(Byzantine fault)

  • 何らかの恣意的な形でノードが不正に振る舞うこと
    • 矛盾していたり、悪意があるメッセージを他のノードに送信するなど

9章から初めて登場する用語

CAP定理(CAP theorem)

  • 分散システムは一貫性(Consistancy)、可用性(Availability)、分断耐性(Partition tolerance)の3つのうち、2つまでしか原理的に満たせないとする定理
    • ネットワーク分断が生じたときは、一貫性か可用性のどちらかを選ぶのかという議論に転じる
  • 役に立たない理論的な成果として有名である
    • 理由
      • 定理としての形式化した「可用性」の定義と、通常の意味合いの「可用性」の定義が一致していない
      • 現実世界では多くの異なる障害のシナリオが存在し、CAP定理はそれらすべてに適応できない

因果関係(causality)

  • イベント間の依存関係で、システム中であるイベントが他のイベントよりも「前に生じた」際に生じるもの

全順序(total order)

  • 2つのもの(タイムスタンプなど)の大小を常に判定できる比較の方法
  • 比較できない(大小を判定できない)ものを含む順序づけは半順序と呼ばれる

第III部導入から初めて登場する用語

記録のシステム(Systems of Record)

  • 真実のソースとも呼ばれる
  • 正しいとなるバージョンのデータを保持する
    • 新しいデータがやってくると、まず初めに記録のシステムに書かれる
    • 主にデータは正規化(冗長でなくする)されて厳密に一度だけ表現される
    • 記録のシステムと他のシステムで不一致があった場合は正しいのは(定義により)「記録のシステム」であるとされる

10章から初めて登場する用語

なし

11章から初めて登場する用語

導出データ(derived data)

  • 再現可能な処理を通じて、他のデータから生成されるデータセット
    • 必要に応じて実行し直すことができる
    • 通常、導出データは特定の種類の読み取りアクセスを高速化するために必要である
  • インデックス、キャッシュ、マテリアライズドビューは導出データの例である

12章から初めて登場する用語

なし

各章ごとの参考になる資料

1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション


2章 データモデルとクエリ言語


3章 ストレージと抽出


4章 エンコーディングと進化


5章 レプリケーション


6章 パーティショニング


7章 トランザクション


8章 分散システムの問題


9章 一貫性と合意


10章 バッチ処理


11章 ストリーム処理


12章 データシステムの将来

comments powered by Disqus