ElastiCache パッチ適用時のダウンタイム回避戦略
概要
ElastiCache(Redis)のパッチ適用時にフェイルオーバーが発生し、数秒〜数十秒の接続断が起きる。Cluster Mode Enabled にすれば解決するのでは?と考えがちだが、実際には効果がない。正しい対策はアプリケーション側での吸収。
Cluster Mode vs Multi-AZ の違い
| 項目 | Cluster Mode | Multi-AZ |
|---|---|---|
| 目的 | 水平スケーリング(シャーディング) | 高可用性(障害耐性) |
| データ分散 | 複数シャードにデータ分割 | データ分散とは無関係 |
| 書き込みスケール | シャード数分スケール | スケールしない |
| フェイルオーバー | Multi-AZ 有効時のみ自動 | Primary 障害時にレプリカへ自動昇格 |
Cluster Mode は「データをどう分割するか」、Multi-AZ は「障害時にどう復旧するか」。直交する設定。
パッチ適用時に起きること
Multi-AZ 環境でのパッチ適用フロー:
1. Replica にパッチ適用(Replica 一時停止)
2. Replica 復帰
3. Replica を Primary に昇格(フェイルオーバー)← ここで数秒の接続断
4. 旧 Primary にパッチ適用
5. 旧 Primary が Replica として復帰
ステップ3のフェイルオーバー時に数秒〜数十秒の接続断が発生する。
Cluster Mode Enabled にしても解決しない
| 構成 | パッチ時の挙動 |
|---|---|
| Disabled + Multi-AZ | シャード内でフェイルオーバー → 数秒の断 |
| Enabled + Multi-AZ | 各シャードで同じフェイルオーバーが起きる → 同じ |
Cluster Mode はシャーディングの仕組みであって、パッチ時のダウンタイム回避には効果がない。
正しい対策: アプリケーション側で吸収する
Redis クライアントの設定
# Rails + redis-rb の例
redis = Redis.new(
url: ENV['REDIS_URL'],
reconnect_attempts: 3, # フェイルオーバー時に自動再接続
reconnect_delay: 0.5, # リトライ間隔(秒)
reconnect_delay_max: 2.0, # 最大リトライ間隔
connect_timeout: 3, # 接続タイムアウト(短めに)
read_timeout: 1,
write_timeout: 1
)
フォールバック設計
Redis 参照
├── 成功 → キャッシュから返す
└── 失敗(接続断)
├── リトライで復帰 → キャッシュから返す
└── リトライ上限超過 → DB にフォールバック
Redis がダウンしてもアプリが 500 にならない設計が重要。
AWS 側の設定
- メンテナンスウィンドウ: 低トラフィック時間帯に設定
- SNS 通知: パッチ適用タイミングを事前把握
auto-minor-version-upgrade: パッチ適用タイミングをコントロール
小規模環境の推奨構成
Cluster Mode: Disabled
Multi-AZ: Enabled
構成: Primary 1台 + Replica 1台(別AZ)
小規模でデータが1ノードに収まるなら、Cluster Mode Enabled にする必要はない。複雑さ(クライアントの Cluster プロトコル対応、マルチキー操作の制約、スロット管理)が増すだけで、パッチ時のダウンタイム回避にも効果がない。
まとめ
- パッチ時のフェイルオーバー(数秒の接続断)は Cluster Mode では解決しない
- アプリ側の reconnect/retry 設定とフォールバック設計で吸収するのが正解
- 小規模なら Cluster Mode Disabled + Multi-AZ が最もシンプルで十分