饮墨

子安饮墨馀三斗,留与卿儿作赋来

从 Redis 迁移到 Valkey:3 步完成生产切换,零停机 + 完全兼容

痛点:Redis 许可证变了,你的基础设施还好吗?

2024 年 Redis 宣布从 BSD 切换到 RSALv2 + SSPLv1 双许可证。对运维团队的影响很直接:

  • 云厂商托管服务可能涨价或调整功能(AWS ElastiCache 已开始切换到 Valkey)
  • 自建 Redis 如果用在商业产品里,许可证合规性需要法务审查
  • 开源生态工具逐步从 Redis 切换到 Valkey 分支

Valkey 是 Linux Foundation 托管的 Redis 7.2 分支,由原 Redis 核心贡献者维护,API 100% 兼容。截至 2026 年,Valkey 8.x 已经是生产就绪状态,AWS ElastiCache、Google Cloud Memorystore 都已支持。

核心问题:怎么把现有 Redis 无缝切换到 Valkey,不影响业务?


方案:基于 RDB/AOF 复制 + 渐进式切流

迁移思路分三步:

  1. 部署 Valkey 实例,用 Redis 的 RDB 快照恢复数据
  2. 通过 replication 机制让 Valkey 作为 Redis 的 replica 实时同步
  3. 切换应用连接串,验证后下线旧 Redis

Valkey 8.x 完全兼容 Redis 7.2 协议和数据格式,客户端库(Jedis、redis-py、ioredis)无需改动。


实操步骤

第 1 步:部署 Valkey 8.x

Docker 方式最快:

# 拉取 Valkey 官方镜像
docker pull valkey/valkey:8

# 启动 Valkey,映射 6380 端口避免和现有 Redis 冲突
docker run -d \
  --name valkey-primary \
  -p 6380:6379 \
  -v /data/valkey:/data \
  valkey/valkey:8 \
  valkey-server --appendonly yes --maxmemory 4gb --maxmemory-policy allkeys-lru

验证启动:

# 用 redis-cli 或 valkey-cli 都能连
redis-cli -p 6380 ping
# 返回 PONG

redis-cli -p 6380 info server | grep valkey_version
# valkey_version:8.1.1

关键点:Valkey 的 CLI 工具叫 valkey-cli,但 redis-cli 一样能用,协议完全兼容。

第 2 步:数据同步——用 replication 实时追平

方式 A:在线复制(推荐,零停机)

让 Valkey 作为现有 Redis 的 replica:

# 在 Valkey 实例上执行
redis-cli -p 6380 REPLICAOF <redis-master-ip> 6379

# 如果 Redis 有密码
redis-cli -p 6380 CONFIG SET masterauth <redis-password>

检查复制状态:

redis-cli -p 6380 info replication
# role:slave
# master_link_status:up
# master_sync_in_progress:0  ← 全量同步完成

等待 master_repl_offset 追平后进入下一步。

方式 B:离线导入(数据量大、网络受限场景)

# 在 Redis 上生成 RDB 快照
redis-cli -h <redis-ip> BGSAVE

# 拷贝 RDB 文件到 Valkey 数据目录
scp /var/lib/redis/dump.rdb valkey-host:/data/valkey/dump.rdb

# 重启 Valkey 加载数据
docker restart valkey-primary

第 3 步:切流 + 验证

切流前的检查清单:

# 1. 确认数据一致性(对比 key 数量)
redis-cli -p 6379 DBSIZE
redis-cli -p 6380 DBSIZE

# 2. 抽样校验关键 key
redis-cli -p 6379 GET user:session:abc123
redis-cli -p 6380 GET user:session:abc123

# 3. 断开复制关系,Valkey 升级为主节点
redis-cli -p 6380 REPLICAOF NO ONE

切换应用连接:

# 应用侧改动极小,只改连接地址和端口
import redis

# 原来
# r = redis.Redis(host='redis-master', port=6379, password='xxx')

# 改为
r = redis.Redis(host='valkey-primary', port=6380, password='xxx')

# 所有操作完全一致,无需改业务代码
r.set('test_key', 'valkey_works')
print(r.get('test_key'))  # b'valkey_works'

渐进切流策略(大流量场景推荐):

# 用 Nginx stream 做 TCP 代理,按权重切流
stream {
    upstream redis_backend {
        server redis-master:6379 weight=0;    # 旧 Redis,权重降为 0
        server valkey-primary:6380 weight=10;  # Valkey,接管全部流量
    }

    server {
        listen 6379;
        proxy_pass redis_backend;
    }
}

避坑指南

坑 1:Redis Modules 不兼容

Valkey 不支持 Redis 商业模块(RedisJSON、RediSearch、RedisTimeSeries)。但社区已有替代方案:

Redis Module Valkey 替代方案
RedisJSON Valkey 原生 JSON 支持(8.x 已内置)
RediSearch 使用外部搜索引擎(MeiliSearch/Typesense)
RedisTimeSeries Valkey 8.x 原生 time series 或用 TimescaleDB

确认方法

# 检查当前 Redis 是否用了模块
redis-cli MODULE LIST
# 如果返回空列表,迁移无障碍

坑 2:Sentinel / Cluster 拓扑迁移

如果你用的是 Redis Sentinel 或 Cluster 模式:

# Valkey 完全兼容 Sentinel 协议
# 只需要把 sentinel.conf 里的 monitor 指向 Valkey 新实例
sentinel monitor mymaster <valkey-ip> 6380 2

# Cluster 模式:逐节点替换
# 先用 CLUSTER MEET 让 Valkey 节点加入,再 CLUSTER FORGET 旧节点
valkey-cli --cluster add-node <valkey-ip>:6380 <existing-cluster-node>:6379
valkey-cli --cluster reshard <existing-cluster-node>:6379
valkey-cli --cluster del-node <existing-cluster-node>:6379 <old-node-id>

坑 3:监控和告警适配

Prometheus redis_exporter 对 Valkey 完全兼容,但需要注意:

# prometheus.yml - 改 target 地址即可
- job_name: 'valkey'
  static_configs:
    - targets: ['valkey-primary:6380']
  metrics_path: /metrics
  # redis_exporter 无需改动,INFO 命令输出格式一致

Grafana Dashboard 中部分面板可能显示 redis_version 为空,需要改用 valkey_version 字段:

# 旧查询
redis_info{key="redis_version"}
# 改为
redis_info{key="valkey_version"}

Valkey 8.x 相比 Redis 7.2 的新特性

迁移不只是为了合规,Valkey 自身也在快速演进:

特性 说明
多线程 IO 默认启用 io-threads,高并发场景吞吐提升 30%+
RDMA 支持 数据中心内 Valkey 节点间通信延迟降至微秒级
Slot 级迁移优化 Cluster resharding 速度提升 5 倍
原生 JSON / Vector 内置 JSON 操作和向量搜索,不依赖外部模块
更低内存碎片 改进的 jemalloc 配置 + 主动碎片整理策略

总结

维度 结论
兼容性 Valkey 8.x 对 Redis 7.2 API 100% 兼容,客户端零改动
迁移方式 推荐在线 REPLICAOF 方式,实时同步 + 秒级切换
风险点 主要看 Redis Modules 依赖,无模块则无风险
收益 许可证合规 + 性能提升 + 云厂商原生支持 + 活跃社区

一句话:如果你现在用的是开源 Redis 7.x,迁移到 Valkey 的成本极低,收益明确。越早切越主动。

您还没有登录,请登录后发表评论。