☎️

RedisからValkeyに移行しよう

に公開

Valkey とは

Valkey は、オープンソースのインメモリ型キーバリューストアです。Redis OSS と互換性を保ちつつ、ライセンスや拡張性、性能面での特徴を持たせたプロジェクトです。

Valkey が登場した背景

Redis OSS ライセンス変更

Redis 社は、従来 BSD ライセンスを採用していた Redis コア部分について、より制限の強いライセンス(RSALv2、SSPL など)への移行を発表しました。これにより、商用利用者やクラウドベンダーが従来の通り自由に改変・再配布を行うことが難しくなる懸念が出てきました。

OSS コミュニティ/クラウドベンダーの反応

ライセンス変更に対して、Redis の主要なコントリビュータやクラウド事業者(AWS など)が、より自由なライセンスを維持しつつ Redis 相当の機能を持つ代替プロジェクトを望む声がありました。その結果として、Redis OSS 7.2 をベースにフォークを行い、BSD ライセンス下で維持される新しいプロジェクトとして Valkey が立ち上げられました。

バージョンごとの変更点

今回は Redis 7.1.* から Valkey 8.1.* に変更します。
バージョンごとの変更点を確認しましたが、破壊的変更は行われていないことが分かりました。

Valkey 7.2.*

https://github.com/valkey-io/valkey/blob/7.2/00-RELEASENOTES

Valkey 8.0.*

https://github.com/valkey-io/valkey/blob/8.0/00-RELEASENOTES

Valkey 8.1.*

https://github.com/valkey-io/valkey/blob/8.1/00-RELEASENOTES

移行作業

移行作業自体はとてもシンプルです。

AWSコンソールからエンジンバージョンを変更します。

Terraformの場合は以下のように変更します。
apply_immediately = trueとすることで変更を即時反映させます。

resource "aws_elasticache_replication_group" "valkey" {
  engine               = "valkey"
  engine_version       = "8.1"
  parameter_group_name = aws_elasticache_parameter_group.valkey.name
  apply_immediately    = true
  # 他オプションは省略
}

resource "aws_elasticache_parameter_group" "valkey" {
  name   = "valkey"
  family = "valkey8"
}

移行時の注意点

切り戻しを行う場合

Valkey 7.2.* から Redis 7.1.* に戻すことは可能ですが、Valkey 8.0.* に上げてしまうと Valkey 7.2.* に戻すこともできなくなるため、Redisに戻せなくなります。

Terraformで戻せるか試してみましたが、リソースの削除/再作成となってしまいます。

データ移行

AWSコンソールや、TerraformからValkeyに変更するとRedis稼働時に保存されていたデータは全て移行されます。数分のダウンタイムを許容できる場合はこの方法が手っ取り早いです。

メンテナンス時間を長めに確保できる場合は、起動しているRedisから新規起動したValkeyにデータ移行を行うことも良いかと思います。

この場合、Redis・Valkeyのログは有効にして、移行が成功したか確認できるようにしておくと良さそうです。

https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/dg/OnlineMigration.html

Redisにロールバック

Valkey移行直後に何か問題があった時のためにRedisをバックアップしておきましょう。

バックアップで作成したRedisはバックアップ時点までのデータを復元することができます。

https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/dg/backups.html

ローカル開発で使用するDockerイメージ

JSON型を使用している場合は、ローカル開発で使用するDockerイメージに注意が必要です。

Valkeyが提供している公式のイメージですが、
https://hub.docker.com/r/valkey/valkey/
こちらのイメージはJSON型をサポートしていません。

そのためvalkey/valkeyイメージを使用して、アプリケーションの動作確認を行うと、以下のようなエラーが出ます。

ERR unknown command 'JSON.GET', with args beginning with: 'xxx'

解決方法

valkey-json を設定する

https://valkey.io/topics/valkey-json/

Dockerfileを作成し、valkey-jsonを設定するようにします。

valkey-bundle イメージを使用する

https://hub.docker.com/r/valkey/valkey-bundle

valkey-jsonをバンドルしているイメージが公式で提供されているのでそれを使います。

SMARTCAMP Engineer Blog

Discussion