决策记录:Kiwi 当前暂不支持 Multi-Key 命令(P2) #346
AlexStocks
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
结论
当前阶段,Kiwi 暂不支持涉及两个或以上逻辑 Redis Key 的 Multi-Key 命令。
该能力按 P2 跟踪:保留设计和后续演进方向,但不进入当前优先开发范围,也不在现阶段引入跨 RocksDB 事务、跨实例一致性读或通用 2PC。
这里的“不支持”是当前产品和架构决策,不代表现有代码已经完成统一禁用。仓库中已经存在的 Multi-Key 命令和分片执行路径仍需盘点,确保它们不会在不具备完整语义保证的情况下被误认为已经支持。
范围定义
Multi-Key 指一个 Redis 命令同时访问两个或以上的逻辑 Redis Key,例如:
MGET key1 key2MSET key1 value1 key2 value2MSETNXRENAME/RENAMENXCOPYSMOVERPOPLPUSH/BRPOPLPUSHLMOVE/BLMOVESDIFF/SINTER/SUNIONSDIFFSTORE/SINTERSTORE/SUNIONSTOREZINTER/ZUNION/ZDIFFZINTERSTORE/ZUNIONSTORE以下命令虽然参数很多,但只操作一个逻辑 Redis Key,因此不属于本决策限制范围:
HSET key field1 value1 field2 value2SADD key member1 member2ZADD key score1 member1 score2 member2LPUSH key value1 value2DEL key等单 Key 操作判断依据是“涉及多少个逻辑 Redis Key”,不是参数数量,也不是内部产生多少条 RocksDB KV。
为什么当前不支持
1. 多 RocksDB 实例没有统一原子提交点
Kiwi/Floyd 将数据分散到多个独立 RocksDB instance。单个 RocksDB 内的
WriteBatch可以提供原子提交,但多个 RocksDB 之间没有统一提交点。如果一个命令按 instance 分组后依次提交:
则命令会留下部分成功状态,无法满足
MSET、MSETNX、RENAME、SMOVE、*STORE等命令要求的原子语义。2. 当前路由与标准 Redis Cluster slot 尚未完全对齐
当前 Kiwi 路由仍需要完成标准 Redis Hashtag、CRC16-XMODEM、固定 16384 slot 和持久化 slot map 等工作。
在这些基础能力完成前,不能把“当前碰巧落在同一个 RocksDB instance”视为稳定的同 slot 语义。实例数或路由算法变化后,同一组 Key 可能被重新映射。
3. Multi-Key 只读同样需要定义一致性
MGET、SINTER、SUNION等只读命令虽然没有写原子性问题,但跨多个 RocksDB instance 时没有天然的统一 Snapshot。如果直接 fan-out,返回结果可能来自不同 RocksDB 的不同时间点。当前阶段不为这类命令承诺跨实例一致性读视图。
4. Cluster/Raft 路径还需要一致的前置验证
未来支持 Multi-Key 时,至少需要保证:
在这些条件未闭环前,继续扩展 Multi-Key 命令会扩大后续兼容和数据正确性风险。
当前阶段的行为原则
1. 不实现跨 RocksDB 通用事务
当前不引入:
未来只有在存在明确业务需求、故障恢复协议和可验证收益时,才重新评估这些方案。
2. 不以同 Hashtag 作为当前可用承诺
标准 Redis Hashtag 是未来 Multi-Key same-slot 支持的必要条件,但当前决策是“暂不支持 Multi-Key”,因此即使多个 Key 使用同一个 Hashtag,也不表示 Kiwi 当前已经承诺支持该命令。
例如:
该写法是未来 same-slot 路由的正确方向,但在 Multi-Key 能力正式完成并通过验收前,不能作为当前绕过方式对外承诺。
3. 不允许静默拆分后部分执行
现有或未来命令不得:
当前不支持的命令应在任何存储读取、写入或 Raft propose 前,以统一、明确、可测试的方式拒绝。
具体采用“不注册命令”还是返回统一
ERR ... not supported,由后续命令兼容性盘点决定;但不能继续保留看似成功、实际缺少原子性或一致性的行为。当前 P2 工作内容
P2 不等于立即实现全部 Multi-Key 命令,而是保留以下工作入口:
*STORE;建议矩阵格式:
MGETargv[1..]MSETMSETNXRENAMESMOVESINTERSTORE未来重新开启支持的前置门槛
只有以下基础条件完成后,才重新评估将 Multi-Key 从 P2 提升:
MSETNX等条件命令在同一临界区内完成检查和写入;满足前置门槛后,优先考虑“只支持同 slot Multi-Key”,不默认建设跨 slot 或跨 RocksDB 的分布式事务。
当前阶段的验收标准
本决策完成落地时,应满足:
与其他存储工作的关系
本 Discussion 只记录 Multi-Key 的当前优先级和支持边界。
以下两项仍按原 Issue 推进,不因 Multi-Key 被定为 P2 而降级:
StorageManifest 随 Checkpoint、Raft Snapshot、备份和恢复传播
Compaction Filter 使用生产编码器和真实 CompactRange 验证
关联项
All reactions