Upgrade to Pro — share decks privately, control downloads, hide ads and more …

奥深きキャッシュの世界 / The world of profound cache

ykoma
November 29, 2018

奥深きキャッシュの世界 / The world of profound cache

2018年11月29日の社内勉強会発表資料

アジェンダ
- キャッシュのおさらい
- キャッシュの実装パターン
- 起こりがちな問題とその対策
- Thundering Herd問題の解決アプローチ
- まとめ

ykoma

November 29, 2018
Tweet

More Decks by ykoma

Other Decks in Technology

Transcript

  1. よくある構成 10 Web App Server Web App Server Web App

    Server RDB Load Balancer Internet Traffic
  2. キャッシュを配置 14 Web App Server Web App Server Web App

    Server RDB Load Balancer Internet Traffic
  3. Primed Cache 21 Data Source Client ◉ パフォーマンスのばらつきが少なく、常に高速なレスポン スが可能 ◉

    適用できるユースケースが限られる ◦ 使用されるデータセットが予測可能であること ◦ 予測から漏れたデータはたとえデータソースにあって もクライアントは取得できない Cache
  4. Demand Cache (1) 23 Data Source Client ②Respond data in

    cache キャッシュからの取得を試み、 キャッシュにあればそれを使用 Cache ①Try to read from cache
  5. Demand Cache (2) 24 Data Source Client ①Try to read

    from cache ②Read from data source if cache missed キャッシュになかった場合、 データソースに問合せる Cache
  6. ③Store requested data to cache Demand Cache (2) 25 Data

    Source Client ①Try to read from cache ④Respond data from data source データソースからのデータを返す とともに、キャッシュにデータを保 存し、次回以降の問合せに備え る Cache ②Read from data source if cache missed
  7. ③Store requested data to cache Demand Cache (2) 26 Data

    Source Client ①Try to read from cache ④Respond data from data source ◉ 使用されるデータの予測ができないユースケースでも適用可能 ◉ ヒット率等の要因でパフォーマンスにばらつきが出る事がある Cache ②Read from data source if cache missed
  8. 30 Client Cache Local Caching ◉ 主なユースケース ◦ 外部キャッシュの負荷が大きく、すべての問合せをさばき きれない

    ◦ 外部キャッシュとの通信のレイテンシが許容できない ◦ 何らかの理由でデータソースの前段にキャッシュレイヤー を置くことができない
  9. 31 Client Outside Cache Local Caching ①Try to read from

    on-memory cache ②Try to read from outside cache if on-memory cache missed Demand Cacheにおけるキャッシュとデータ ソース間と同じ処理を、クライアント上のメモリ とキャッシュ間でも行う On-memory Cache
  10. ④Store requested data to cache Demand Cache with Local Caching

    32 Data Source Client ②Try to read from outside cache ③Read from data source ⑤Respond data from data source ◉ このように組み合わせて使うことも多い ◦ データソースとキャッシュ間に差異が生まれやすいため、キャッ シュデータのライフサイクル管理が重要!! Outside Cache ①Try to read from on-memory cache ⑥Store requested data to on-memory cache On-memory Cache
  11. 何が起きた? ◉ 想定と実際のユースケースとの乖離 ◦ 想定よりも実際のデータ量が多かった ◦ 想定よりも実際のデータサイズが大きかった ◉ 想定以上にキャッシュの消費量が多かった ◦

    エンコーディング(どういう形式で格納されるか) ◦ ブロックサイズ(どういう単位で格納されるか) ◉ モニタリングができていない ◦ 容量が溢れそうなことを事前に検知すべき 36
  12. 対策 ◉ 対策1: ローカルキャッシュのウォームアップ ◦ 起動後、待受ポートを開く前に頻出データを先読み ◦ ただし、頻出データが分かっている前提 ◉ 対策2:

    ローカルキャッシュを一部Primed Cache方式 に ◦ 件数が少なくて参照頻度の高いマスタデータなどは、常 に全件をローカルキャッシュに持っておくのも一つの手 43
  13. 対策 ◉ 対策1: キーに一定の範囲内の乱数を組み合わせ、同 一キーを複数ノードに保持する ◦ 参照時も乱数を生成してそのどれかを抽選することで 参照ノードがバラける ◦ どの程度の数を生成するかが重要な課題に

    ▪ 生成数が多いほどヒット率が下がる ▪ 生成数が不十分だと格納先が重複して偏りが解消 されない ▪ 件数の多いデータだとキャッシュ容量圧迫も ◉ 対策2: Local Cachingを導入する 46
  14. 図解(Demand Cacheの流れ) 52 get(A) return valueOf(A) get(A) return valueOf(A) get(A)

    return valueOf(A) set(A) get(A) return valueOf(A) キャッシュの生 存期間 Data Source (key=A) Cache (key=A) Client
  15. 図解(Demand Cacheの流れ) 53 get(A) return valueOf(A) get(A) return valueOf(A) get(A)

    return valueOf(A) set(A) get(A) return valueOf(A) Data Source (key=A) Cache (key=A) Client このスキマ時間に 悲劇は起こる
  16. 図解(高トラフィックな状態) 54 キャッシュに乗るまで全 部のget(A)がデータソー スまで・・・ Data Source (key=A) Cache (key=A)

    Client get(A) return valueOf(A) get(A) return valueOf(A) get(A) return valueOf(A) set(A) get(A) return valueOf(A)
  17. 図解(Local Cachingでも同様) 55 Outside Cache (key=A) Local Cache (key=A) Client

    get(A) return valueOf(A) get(A) return valueOf(A) get(A) return valueOf(A) set(A) get(A) return valueOf(A)
  18. Data Source (key=A) Cache (key=A) Client セマフォ(同時利用可能数2) を使った場合 60 get(A)

    set(A) セマフォが0になっ たので以降の問合 せは空きが出るま で待つ 最大でも同時 利用可能数の 問合せ get(A) セマフォに空きが出 たので待っていた問 合せをする
  19. Data Source (key=A) Cache (key=A) Client singleflight (for golang) 64

    get(A) 最初の1本以外は最 初の1本の結果を待 つ データソースに 到達するのは 最初の1本だ け 待っていた他の問 合せに対しても、1 本目と同じ結果を返 す set(A)
  20. Data Source (key=A) Cache (key=A) Client Asynchronously refresh 67 get(A)

    set(A) get(A) キャッシュがない状 態からは同期的に 取得してキャッシュ へ キャッシュが 載ってからは 非同期に更新 問合せがある間は キャッシュが切れな い
  21. 最後に ◉ キャッシュ構築の「基本形」にはお決まりのパターン がある ◦ 一方、思わぬところで足をすくわれるのが「キャッシュ」 という領域 ◦ いざ障害になると長期化することも多く、決して甘く見 てはいけない

    ◦ 特にWeb系の人は割と軽いノリで「キャッシュ入れよ う」となりがち?(先入観) ◉ 考慮すべき点はきちんと考慮して、頑強なキャッシュ を構築しましょう 70