LinuCレベル4 システムアーキテクト 性能・拡張性の設計 問21
性能・拡張性の設計/性能の拡張アクセス頻度が高いマスターデータ(商品カテゴリ、設定値など)をキャッシュに保持して、データベースへの問い合わせ回数を減らしたい。このデータはキャッシュが失われてもデータベースから再ロードでき、更新頻度は低い。キャッシュ設計として最も適切なものはどれか。
当サイトのオリジナル問題(LinuCレベル4 システムアーキテクトの出題範囲「性能・拡張性の設計」に対応。実際の試験問題ではありません)
- ARedisを導入し、RDBスナップショットとAOFコマンドログの両方を有効にして、キャッシュデータをディスクに永続化することでデータの安全性を確保する
- B各アプリケーションサーバーのプロセスメモリ内に独立したキャッシュを保持し、それぞれがデータベースからロードして参照する
- Cmemcachedを導入し、揮発キャッシュとして使う。データが失われてもデータベースから再ロードできるため永続化は不要で、ノード追加だけで水平スケールできる
- Dリードレプリカをデータベースに追加し、マスターデータの参照クエリをレプリカへ分散させてプライマリへの負荷を下げる
正解:C
解説
更新頻度が低く揮発してよいマスターデータには、memcachedのようなシンプルな揮発キャッシュが適しています。memcachedは永続化機能を持たない代わりに、シンプルなキーバリューキャッシュとして高速に動作します。キャッシュミス時にデータベースからフォールバックできる設計であれば、永続化のオーバーヘッドは不要です。ノードを追加することで容量とスループットを水平にスケールアウトできます。
選択肢ごとの解説
- A誤り。キャッシュが揮発してもデータベースから再ロードできる要件では、Redisの永続化(RDB+AOF)は不要なオーバーヘッドです。永続化のディスクI/Oがキャッシュのレイテンシとスループットへのコストになります。永続化が必要な用途(セッション、ランキング等)にはRedisを使い分けます。
- B誤り。各サーバーが独立したキャッシュを持つと、サーバー間でキャッシュの一貫性が保てません。マスターデータが更新されたとき全サーバーへの通知が必要になり、サーバー増設時には全台でキャッシュの再ロードが発生します。
- C正しい。memcachedはシンプルな揮発キャッシュとして高効率に動作します。キャッシュミス時にデータベースからフォールバックできる本要件に適しており、クライアントライブラリによる一貫性ハッシュで複数ノードへ分散できます。
- D誤り。リードレプリカはデータベースへのクエリを分散しますが、データベースへのアクセス自体は発生し続けます。インメモリキャッシュに比べてレスポンスタイム短縮と負荷削減の効果は限定的です。