データ指向アプリケーションデザインとは
「データの量、複雑さ、変化の速度」を中心に考えるデザイン
データを作る
データ量が少ない場合
データの表現、生成しやすさが重視される
CSV、JSON、XML などのテキストデータフォーマット
MessagePack、Thrift、ProtocolBuffers、Apache Abro などのバイナリデータフォーマット
データ量が多い場合
データ基盤では、省メモリ、圧縮しやすさ、ストレージへの格納しやすさが重視される
テーブルフォーマット
行指向フォーマット(RDBMSで良く使われる)
レコード単位で更新しやすい
列指向フォーマット
分析クエリ向き
キャッシュに乗りやすく高速
SIMD演算も活用しやすい
単一レコードの更新は遅い
Apache Parquet がこれに該当する
データが変化する速度
不変データの場合
読み込み型特化
データへ高速なアクセス
データを分散する
パーティショニング(シャーディング)
データを時間やキーの範囲で分割する
必要なデータのみにアクセスしたり、別領域のデータへの並列アクセスを可能にする
レプリケーション
同じデータを複数箇所に配備する
並列アクセスしやすくし、耐障害性を持たせる
実体化ビュー
一度計算したクエリ結果を保存し、再利用できるようにする
データが頻繁に更新される
書き込み特化型
RDBMSが強い分野
レコード単位での処理
トランザクション処理
素早く更新対象を見つけるためにインデックスが使われる
インデックスは、ディスク上のデータを高速に見つけるためのデータ構造
B-Tree、Hash index、Sorted String Table
分散データ
一箇所にデータがある場合と比較して、考えるべき問題の複雑さが数段上がる
ノード間のデータを送受信するために、分散システムが必要
分散ステートマシンが同じ状態になる必要がある
サーバー・クライアント間でのデータ通信が必要
RESTやRPC
複数箇所で頻繁に更新される場合
同期が必須
どの状態が正解かを決めるための合意プロトコルが必要
障害対応
エラーハンドリング、リトライ、冪等性、リカバリ
ノードが間違ったエラーを返すケースをビザンチン障害と呼ぶ
24時間354日動き続けるサービスの設計
稼働率
アプリケーションデプロイ
サービスを止めない
複数バージョンのアプリケーションが同時稼働する
通信遮断させない
クライアント側でのリトライ処理
冪等性
リトライが起こる前提で設計する(データ重複させない)
リクエストにUUIDなどを付与して、重複チェックする
Compute - Storage の分離
クエリの実行とストレージを分離するのが標準
Snowflake や Amazon Redshift
トランザクション処理
ACID
Atomicity、Consistency、Isolation、Durability
Isolation の概念が最も重要
直列化可能性(Serializability)が基本
弱い分離性
Read-Commited、Snapshot Isolation、MVCC(Multi-version concurrency control)
妥協しないアプローチ
Serializable Snapshot Isolation
トランザクション異常
ファントム(存在しないレコードにどうロックをかけるか)
Write Skew(同じ Snapshot を読んで、違う場所に書き込む)
Repeatable Read の由来
分散トランザクション
複数ノード間、複数システム間でトランザクションを実装する
一貫性、合意性、耐障害性
要素技術
リーダ選出、サービスディスカバリ、メンバーシップ管理
例:Amazon Aurora
分散版 MySQL
MySQL のデータベース更新操作を「ログの書き込み」だけに簡略化
ストレージノードがログを分配、各インスタンスでログをリプレイして同じデータを持つ
トランザクション処理も同期をなるべく取らずに処理
データの複雑さ
テーブルの意味の変化
従来:RDBMSにある最新のデータ
現代:時間と共に変化するデータ、そこから派生するデータを表す
列指向クエリエンジンの発展により、分析クエリが容易になり導出データが大量
バッチ処理・ストリーム処理
近年は、両者の区別は少なくなってきている
導出データ
時間と共に変化&派生するデータ
分散バッチ処理
Spark
UNIXコマンドのような命令を並列・分散実行するイメージ
MapReduce
構成
Mapper:(key, value)ペアを出力する
Reducer:同じ key に属する value を集めて集計結果を出力
フレームワーク側で自動で分散実行
バッチ処理
保存されてるデータに対してクエリを実行する
ストリーム処理
クエリをあるデータの入力側に送り、常時クエリを実行し続ける
または、データの変更を捉え、処理する。
Dataflow Model
時系列データ処理方法の分類・パターンの定義
遅れてやってくるデータの処理を埋め合わせる必要性を提示
Apache Beam で利用できる
データモデルの多様性
データ形式
JSON、XML、テーブル、グラフなど
RDBMS
さまざまなデータ形式をサポート
DBMSの品質が重要なので、ユーザーが使うまでが長かった
インピーダンスミスマッチ
アプリケーションで使いたい表現と、データベースに格納される形態がマッチしない状況
NoSQL
SQL、リレーショナルモデルの不満から、ドキュメントモデルなどが生まれる
GraphQL
RDBMS、SQLは利用しつつも、アプリケーション側が欲しい形でデータを取得するのをサポート
SQL
RDBMS専用のインターフェースだったが、次第にさまざまなエンジンで採用される
参考