キャッシュサーバーの役割と特性
Redis / Memcached はインメモリデータストアであり、DB アクセスを削減してレスポンスタイムを短縮するために使われる。全データをメモリ上に保持する設計であるため、スケールアップの主目的はメモリ増強だ。Redis は単一スレッド(コマンド処理)のため、CPU コア数を増やしても直接的なスループット向上にはつながりにくい。
ボトルネックになるリソース
| リソース | 症状 | 確認コマンド |
|---|---|---|
| メモリ | eviction 発生・maxmemory-policy によるキー削除 | redis-cli INFO memory |
| CPU(単一スレッド) | 高コストコマンド(KEYS・SMEMBERS 大)で 100% 張り付き | redis-cli SLOWLOG GET |
| ネットワーク帯域 | 大きい value のバルク転送で帯域飽和 | INFO stats → instantaneous_output_kbps |
スケールアップの内容と効果
① メモリ増強(最優先)
■ 必要メモリの試算
必要メモリ = キー数 × (key + value + Redis オーバーヘッド 50〜100B) × 1.2
例:1,000万キー、key 20B + value 200B + overhead 75B = 295B/key
→ 1000万 × 295B × 1.2 ≈ 3.54GB → 4GB 以上を maxmemory に設定
→ 1000万 × 295B × 1.2 ≈ 3.54GB → 4GB 以上を maxmemory に設定
# redis.conf
maxmemory 8gb
maxmemory-policy allkeys-lru
# メモリ状況確認
redis-cli INFO memory | grep -E "used_memory_human|maxmemory_human|mem_fragmentation_ratio"
# eviction 確認(増えていれば maxmemory が不足)
redis-cli INFO stats | grep evicted_keys
⚠️ mem_fragmentation_ratio に注意
1.5 以上の場合はフラグメンテーションが発生中。MEMORY PURGE(Redis 4.0+)や再起動でフラグメントを解消してからスケールダウンを判断してください。
② CPU スパイクへの対処(コマンド最適化優先)
redis-cli SLOWLOG GET 10
# KEYS * → SCAN に置き換える
# SMEMBERS(大) → SSCAN に置き換える
# LRANGE 0 -1 → ページネーションに変更
redis-cli --latency-history -i 1
スケールダウンの考え方
| 条件 | スケールダウン可否 |
|---|---|
| evicted_keys が 30 日間ゼロ | maxmemory 削減を検討可 |
| used_memory が maxmemory の 50% 以下 | インスタンスサイズ縮小を検討可 |
スケールアップ vs スケールアウト
✅ Redis のスケール判断
単一ノードで 64GB 以下ならスケールアップが管理シンプル。64GB 超、または書き込みが 100,000 ops/s 超えで Redis Cluster(スケールアウト)を検討。読み取り多ければ Replica 追加。
判断指標(監視メトリクス)
| メトリクス | 確認コマンド | スケールアップの目安 |
|---|---|---|
| メモリ使用率 | INFO memory → used_memory/maxmemory | ≥ 75% が継続 |
| eviction 数 | INFO stats → evicted_keys | 1時間で 1,000 件超え |
| キャッシュヒット率 | INFO stats → keyspace_hits/misses | ≤ 85% に低下 |
まとめ
| 項目 | 要点 |
|---|---|
| スケールアップの主目的 | メモリ増強。eviction を防いでキャッシュヒット率を維持する。 |
| CPU 対処 | KEYS/SMEMBERS 等の O(N) コマンドを SCAN 系に置き換える。CPU コア増加は効果薄。 |
| maxmemory 設定 | 物理メモリの 80% を上限。OS・バッファに 20% を残す。 |
| スケールアウト移行 | データ量 64GB 超え、または書き込み 100K ops/s 超えで Redis Cluster を検討。 |