Designing Data-Intensive Applications / データ指向アプリケーションデザイン
https://gyazo.com/f63695ea773fbc2e8d56101e2ad6edde
articles
メモ
データの量や複雑さ、変化の速度が主な課題のアプリケーション。多くのアプリケーションはこっち
DB, キュー, キャッシュはデータを保存しておくものだが、それらの境界は曖昧になってきている
Redisはキャッシュストア、メッセージキューどちらにでも使われるとか これらをどう配置するか設計する人でもある
重要な課題
信頼性,スケーラビリティ,メンテナンス性
なにか問題が生じたとしても正しく動作し続けること
意識的にフォールトを作り出して耐障害性のしくみを継続的に動作させる
ハードウェアの冗長化
AWSとかでは単一のマシンの信頼性より柔軟性やエラスティック性が重視して設計されているので警告なしにインスタンスが止まることもある ソフトウェアのエラーは手っ取り早い解決策はないので、徹底したテスト、計測、モニタリングなどを積み重ねる事が大事
ヒューマンエラー
適切なAPIの設計などエラーが少なくなるようなシステム設計
サンドボックス環境の用意
テスト
ロールバック、ロールアウト
パフォーマンスやエラーのモニタリング = テレメトリ 各ユーザーのタイムラインをキャッシュする場合、ツイート1つに対してフォロワー分のタイムラインキャッシュを更新しているらしい
フォロワーが多いユーザーのツイートは個別に取得してマージしているらしい
キューイングの遅延。低速なリクエストがあるとそれ以降のリクエストの処理が待たされる
Elasticなシステム = 負荷の増大を検知して自動的にリソースを追加できる レガシーソフトウェアを生み出すのを避けるため、3つの設計原理に特に注意を払う
運用性
自動化、依存性の排除、ドキュメントなど
単純性
big ball of mud にならないように
抽象化によって複雑さを隠蔽する
進化性
システムの修正が容易であること
RDBの起源はビジネスデータ(銀行や航空機、倉庫などのトランザクション)の処理。 NoSQLは元々非RDBのミートアップのためにTwitterハッシュタグに使われただけのものが、目を引いて広まった 多対多の関係や結合の対応が厳しい
非正規化によって、アプリケーション側で非正規化されたデータの整合性を保つための処理が必要になる
構造は暗黙のものであり、読み取り時にのみ解釈される
MySQLはALTER TABLE文実行時にテーブル全体をコピーするためダウンタイムが発生することがある。避けるツールもある データのローカリティ (局所性)によるパフォーマンス向上
あらゆる者同士に関係が存在するようなユースケース
DBを構成するデータ構造
ハッシュマップのデータ構造は、キーのバイトオフセットを基に配列に保存する KVSだと各キーに対する最新の値だけ保存するため、複数ファイルに記録したログをまとめる追記 クラッシュのリカバリ、並行性の制御が課題
SSTable Sorted String Tableで読み取りを早く キーと値のペアをキーでソートされた状態で保持し、固定サイズのブロックに分割して保存する
ツリーのバランスが保たれることが保証されるので、深さはO(log(n))になる
OLAP (online analytic processing) <> OLTP データフロー
整数値と浮動小数点の区別がなかったり、精度を指定することができないという問題がある
失敗したときのタイムアウト、リトライ処理が必要
ローカル関数呼び出しとは違い、冪等性のチェックが必要(リクエストは届いたがレスポンスは失われたときとか
異なる言語間のデータ型の違い
通信が単方向になり、システムの信頼性を向上できる
多少の注意を払っておけば互換性を保ったローリングアップデートは十分に可能である
レプリケーションが非同期の場合、書き込みが一部失われている可能性がある
auto increment のカウンタがずれていたことで間違ったデータが公開される
スパイクによってフェイルオーバーした場合、リカバリ中にパケットの遅延が悪化する
シングルリーダー: すべての書き込みを1つのノードに送り、他のレプリカに送られる
マルチリーダー: 複数ノードに書き込みを送り、お互いとフォロワーノードに送られる
リーダーレス: 複数ノードに送信し、修正のため他のノードから読み取る
ebiken.iconレプリケーションで一貫性を保つ仕組み、よく理解できなかったので後で読む
書き込みが並列に行われたとき
複数ノードで行われたとき
キーの範囲やハッシュを使って行われることが多い
トランザクション
Atomicity: 1つのトランザクションが完了しなかったら書き込みを全て破棄/取り消しすること
Consistency: データの一貫性が保たれていること
Isolation: 平行に実行されたトランザクションがお互いから分離されており、逐次実行と結果が一緒になること
Durability: コミットが成功したら書き込まれたデータは失われない
並行性制御
Read Commited (分離性において最も基本的なレベル)
スナップショット分離
直列化可能
順次実行
部分障害
信頼性の低いネットワーク
クロックのズレ
プログラムが止まる
ebiken.icon長すぎるのでまとめるのは断念。輪読会を開いて読むことにした