先日、RedisからValkey移行をしたSREエンジニアの @kio-ku です
切り替え自体はコンソールのボタンをポチッと押すだけで、クラスタの変更なしで簡単にできました
Valkeyに移行するまでの流れを共有します!
Valkeyについて
Redisとの互換性
Redis 7.2.4 をforkしたOSSのため、基本的に互換性があります。
アプリケーションを調査して影響を受けるような処理をしていないと判断したのでValkeyへの移行を決めました
性能・価格
価格は、ElastiCache の料金ページによると node-based は一律 20% 安く、Serverless は 33% 安いです。
性能面についても約12%ほど向上するとのことです。
移行の制約
| 制約 | 内容 |
|---|---|
| ロールバック | クラスタを維持したまま、新しいバージョンへのアップグレードはできるが、古いバージョンへのダウングレードはできない。例外は Valkey 7.2 → Redis OSS 7.1 のロールバックで、アップグレードと同じ手順で in-place ロールバックできます。 |
| 既存のクライアント接続は切られる | エンジンアップグレード中に既存のクライアント接続が終了する |
| ノードの IP は変わる | エンドポイントの DNS 名は変わらないが、ノードの IP アドレスはアップグレード中に変わる |
| 移行元バージョンの下限 | Redis 5.0.6 以上が必要。Redis 4 以下から直接 Valkey に上げる場合は DNS 伝播で 30〜60秒のフェイルオーバーが発生しうる |
| 単一ノードのままではクロスエンジンアップグレードできない | レプリケーショングループ化されている必要がある |
| パラメータグループの切り替えが必須 | メジャーバージョンアップでは、エンジンと互換性のある新しいパラメータグループへの切り替えが必要 |
ロールバックできない以上、Valkey 7.2 を経由する選択肢もありました。
ただ 検証環境で先に Valkey 8.2 に上げて試してみて、特に問題がなかったのと、
そんなに凝った使い方を Redis でしていなかったこともあって、Valkey 8.2 を直接選びました。
今回の構成
今回移行したElastiCacheクラスタは
プライマリ + レプリカの2ノード構成・Multi-AZ・自動フェイルオーバー有効になります
事前準備
1. Valkey 8 用のパラメータグループを先に作っておく
パラメータグループにもエンジンごとのファミリー互換性があって、
family 名は 8.0 / 8.1 / 8.2 共通で valkey8、9系は valkey9 になります。
2. 移行直前の手動スナップショット作成
自動バックアップとは別に手動バックアップを残しておくと、retention の都合で自動バックアップが消えても復元点が残ります。
ロールバックができないValkeyのバージョンへの移行なので、
万が一の切り戻しの際にはこのスナップショットから別クラスタとして復元する形になります
移行してみる
- 対象のキャッシュを選んで 「Valkeyにアップグレード」 をクリック
- キャッシュ設定 → エンジンバージョン で Valkey のバージョンを選びます。
- パラメータグループ で、事前に作っておいた valkey8 のパラメータグループを選びます(スクショはデフォルトのパラメータグループになってます)
- すぐに適用 にチェックを入れて、今回はすぐにアップグレードが始まるようにしました
- 内容を確認して問題なければ アップグレード をクリック
- ステータスが
modifyingになるので、availableに戻るまで待ちます。クラスタ自体は作り替わらず、ノードだけが置き換わります
アップグレードが完了するまでおおよそ15分程度でした
ダウンタイム
実測したダウンタイムはだいたい 12秒ほどでした。
ElastiCache 側のメトリクスには特に変化がなかったので、リソース不足やフェイルオーバーの遅延ではなく、
Redis のコネクションエラーがアップグレードによって起きたものという判断をしています。
最後に
ElastiCache の Redis を Valkey に切り替える作業自体は、AWSコンソールで簡単にできました。
クラスタの変更がないのも嬉しいですね!
Redis から Valkeyへの移行を検討されている方の参考になりましたら嬉しいです!!
参考