- System Design Interviewの例題を学習する
- システム構成を,単一サーバからスケールアップしていく
- Web Serverはどこからアクセスされるか?
- WEB APP
- サーバサイド(ビジネスロジックやストレージをhandleしているJavaなど) or クライアントサイド(JavaScriptなど)からアクセスされる
- Mobile APP
- JSON formatが多い
GET/users/12-Retrieve user object { "id":12, "firstName":"John", "lastName":"Smith" }
- WEB APP
- RDB
- MySQLなど
- table/rows管理
- No-RDB(NoSQL)
- DynamoDBなど
- ★4カテゴリに分かれる
- key-value stores
- graph stores
- column stores
- document stores
- 基本的には枯れた技術であるRDBが良いが,以下の場合はNoSQLが良い
- 遅延を抑えたい
- 構造的なデータではない
- シリアライズ/デシリアライズ程度でしかデータを扱わない
- 多量のデータを保存する
- 垂直スケーリング
- Scale up
- CPUを良いものにする
- Scale up
- 水平スケーリング
- Scale out
- サーバの数を増やす
- Scale out
- トラフィックが遅いとき
- 垂直スケーリングが単純で良い
- ただし,強化は有限
- ★冗長性がない
- 強化作業時にAPPを落としてしまう
- 垂直スケーリングが単純で良い
- ただし,強化は有限
- ★冗長性がない
- 昔の設計では,WEBサーバは直接つないでいた
- Webサーバがオフラインの時、ユーザはアクセス不可
- ユーザが増加したとき、通信が遅くなる or サーバが落ちる可能性がある
- ロードバランサの導入
- 上記の仕様ではDBが1つしかないため,FailOverに未対応
- DBをmaster/slaveに分割することで,これに対応
- WEBサーバはDB更新をMasterDBへ行う
- DBレプリケーション
- master:書き込みのみ許可
- データ更新はこちら
- slave: masterからコピーされたデータ
- 読み込みのみ許可
- master:書き込みのみ許可
- メリット
- パフォーマンスが良い
- Queryを並列で処理しやすい
- Reliablity
- 一部分が壊れてもなんとかなる
- 高可用性
- 一部オフラインでもOK
- 他からコピーしてくる
- Reliablity
- Replication処理は複雑
- 仕様
- LBのIPアドレスはDNSから取得する
- ユーザはこのIPアドレスでLBに接続する
- HTTPリクエストはサーバ1or2に向かう
- WEBはユーザのデータをSlaveDBから読み込む
- 残項目
-
Cacheは既に参照したものをメモリに蓄積する
-
Cache使用の検討にあたって
-
CDN
-
CDNの動作フロー
-
1: ユーザがimage.pngをimageURLから取得する
- URLのdomainはCDN providerから供給されている
-
2: CDNサーバのキャッシュにimage.pngがないとき、ストレージからoriginを要求する
-
3: Time-to-live(TTL)付きのHTTPヘッダ付きのimage.pngを返す
- TODO:どのくらいキャッシュに残すか
-
4: CDNキャッシュがユーザAに画像を返す
-
5,6:ユーザBも同様
-
CDN使用に関する検討
- コスト: 外部サービスを使うので、重大なメリットがないなら使わなくてもよい
- 適切なキャッシュ消費期限を設定するべき
- CDN fallbackの考慮:システムはCDNの一時的な障害があった場合に対処できるべきだ
- Invalidating files:CDNキャッシュが切れる前に、CDNから独自にファイル削除ができること
- APIにて提供されている
- Object versioningの使用
- objectの異なるバージョンを提供するため
- URLに付与 v=2 など
- 水平スケーリングを検討する
- ユーザセッションデータなどをWEBから移動させる必要がある
- 良い方法:RDB or NoSQLなどの持続可能Storeに移すこと
- Stateless web tier
- クラスタ内のどのWEBサーバもDBから静的データにアクセスできること
- Statefull architecture
- トラフィックの方向再設定
- 正しいデータセンタに繋ぐための効果的なツールが必要
- GeoDNS
- 正しいデータセンタに繋ぐための効果的なツールが必要
- データSync
- 異なる地域にいるユーザは異なるDB,cacheを使えるべき
- そうでない場合,failoverするとダメになってしまう
- 複数方向でデータレプリカをするのが定石
- Netflixがやり方を研究していた
- 異なる地域にいるユーザは異なるDB,cacheを使えるべき
- テスト&デプロイ
- 複数データセンタを立ち上げる場合,異なる地域からAppテストをするべき
- システムのスケールアップのためにはコンポーネントを分離することが大切
- ★Message Queueがキーストラテジ
- (分散システム)
- サーバーレスおよびマイクロサービスアーキテクチャで使われる非同期サービス対サービスの通信形態
- スモールシステムの場合,logging, metrics, automationは不必要
- 大きいシステムの場合は投資すべき!
- Metrics:システムの健康状態を確認できる
- Host Level Metrics:CPU, Memory, disk I/O
- Aggregated level metrics:DB層,Cache層の全体的なパフォーマンス
- Key business metrics:DAU,retention, revenue
- Automation:CIシステムなど
- システムが大きく複雑になるにつれ,自動ビルドなどは効果を発揮する
- デプロイなども
- 以下の観点が大切
- WEB Tierを静的に保つ
- 全Tierで冗長性を構築する
- できる限りCasheを用いる
- 複数データセンタをサポートする
- CDNにて静的アセットをHostする
- ShardingによってData TierをScaleさせる
- システムを監視し,自動化ツールを導入する