内容提要
本文介绍将Proxy模式多DB Redis集群迁移至Amazon ElastiCache Valkey 9.0的方案。Valkey 9.0原生支持集群多DB,通过cluster-databases参数配置。文章涵盖三条迁移路线选型、集群配置、数据同步、Redisson客户端升级适配及跨Slot兼容性验证,强调多key操作需遵循同Slot规则,并给出不同场景的迁移建议。
延伸解读
迁移前需明确容量与隔离需求
文章指出,Valkey 9.0 虽支持集群多 DB,但并非所有场景都需采用集群模式。若单分片容量足够,Node-based(CMD)改动最小;若需弹性,可选 Serverless;只有需要横向分片时才选集群模式。此外,多 DB 仅提供逻辑隔离,若各 DB 需物理隔离或分属不同团队,传统按 DB 拆分仍是更稳妥的选择。
cluster-databases 参数规划要点
启用集群多 DB 需自定义参数组并设置 cluster-databases,该参数仅在创建集群时生效,之后不可修改。因此,规划时应按源端最大 DB 编号加余量一次设定,避免后续扩容困难。同时,默认参数组未启用多 DB,需注意创建时指定自定义参数组。
客户端升级与跨 Slot 限制需同步评估
迁移至集群模式(CME)需将 Redisson 升级至 4.x 并改用 ClusterServers 模式,同时设置 database 参数。但集群模式仍受跨 Slot 限制,多 key 操作如 SINTER、EVAL 和事务可能失败。文章实测显示,ClusterServers 可处理跨 Slot MGET,但其他操作受限,需通过 hash tag 或拆分操作规避。
Q&A
Valkey 9.0 相比开源 Redis Cluster 在集群多 DB 支持上有何改进?
开源 Redis Cluster 自 3.0 版本起仅支持 SELECT DB0,而 Valkey 9.0 通过新增的 cluster-databases 配置参数,原生支持集群模式下的多 DB,允许使用 SELECT 切换数据库,且 Slot 计算仅基于 key 名,与 DB 编号正交。
从 Proxy 模式 Redis 集群迁移到 Amazon ElastiCache Valkey 9.0 有哪些可选路线?
有三条路线:① Node-based(CMD)集群模式禁用,单分片,原生支持多 DB,客户端改动小;② Serverless 缓存,托管拓扑,自动伸缩,支持 Valkey 9.0;③ Node-based(CME)集群模式启用,支持多分片,需使用 cluster-databases 参数并升级客户端(如 Redisson 4.x)。
如何在 Amazon ElastiCache 上配置 Valkey 9.0 集群以启用多 DB?
需要创建自定义参数组,设置 cluster-enabled=yes 和 cluster-databases=16(示例),然后使用该参数组创建复制组。注意 cluster-databases 仅在创建集群时生效,建成后不可修改,需提前规划。
迁移过程中如何实现数据同步并保持 DB 编号不变?
可使用开源工具 redis-shake v4.6,配置源端为 Proxy 端点(cluster=false),目标端为集群模式(cluster=true),并通过 filter 段的 allow_db 指定要同步的 DB 编号,实现全量 RDB 传输和增量同步,DB 编号保持不变。
Redisson 客户端从 3.x 升级到 4.x 需要做哪些适配?
需要将连接模式从 useSingleServer() 改为 useClusterServers(),并新增 database 配置(如 clusterServersConfig.database: 14),同时注意 TLS 前缀可使用 valkeys://,并确保 Redisson 版本为 4.0 以上。
在 Valkey 9.0 集群模式下,跨 Slot 的多 key 操作有哪些限制?如何处理?
集群模式下,涉及多个 key 的命令、Lua 脚本或事务要求 key 位于同一 Slot,否则返回 CROSSSLOT。处理方式包括:使用 hash tag 将相关 key 固定到同一 Slot;对于可拆分的批量操作使用 Pipeline/Batch;对于跨 Slot MGET,Redisson ClusterServers 模式可处理,但 SINTER、EVAL 多 key 和事务仍受限。
对于不同场景,应如何选择迁移路线?
若单分片容量可容纳,选择 Node-based(CMD),改动最小;若需要自动伸缩和免运维,选择 Serverless;若需要横向分片且容量可规划,选择 Node-based(CME);若各 DB 需要强隔离,则按 DB 拆分为独立实例。