Kiwi Floyd Storage 生产化改进:Redis Hashtag、多实例原子性、Compaction、Block Cache 与安全重分片 #344
AlexStocks
started this conversation in
Ideas
Replies: 1 comment
|
Multi-Key 的当前优先级和支持边界已单独形成决策记录: 最新结论:
本总 Discussion 中 Compaction、Block Cache、StorageManifest 和实例拓扑等其他工作不因该 P2 决策降级。 |
0 replies
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 的 storage 层参考 Floyd,在一个逻辑 DB 下使用多个独立 RocksDB instance,并在每个 instance 内使用多个 Column Family 保存 String、复杂类型 Meta 和 Data。
该结构可以分散 RocksDB 压力并为 slot 迁移提供物理边界,但也引入了跨 RocksDB 原子性、路由稳定性、Compaction、缓存预算和存储格式升级等生产化问题。本 Discussion 作为总设计入口;达成共识后继续拆分或关联独立 Issue。
Floyd 设计参考:OpenAtomFoundation/pikiwidb#2052
已确认的工作流
1. 多 RocksDB 与 Multi-Key 语义
当前多实例
MSET/MSETNX按 instance 分组后逐个提交。单个 RocksDB 内的 WriteBatch 是原子的,但多个独立 RocksDB 之间没有统一提交点;后续 instance 写失败或进程崩溃时,已经提交的 instance 无法回滚。MGET与写命令需要分开定义:MSET/MSETNX:涉及写原子性;跨 instance 时必须在任何写入前拒绝,不能部分提交;MGET:可以跨 instance fan-out,但需要明确它是否只提供逐实例读取,还是要求同 slot/同 instance 获得更强的一致视图;RENAME/RPOPLPUSH/SMOVE/*STORE:需要按 standalone 与 cluster 模式分别定义行为。关联已有 Issue:#196
Redis Hashtag 前置条件
当前 Kiwi 实际使用:
它没有实现 Redis Hashtag,也不是 Redis Cluster 使用的 CRC16-XMODEM。代码中的“compatible with Redis Cluster hash slot”注释与实际算法不一致。
标准 Redis 路由应为:
其中第一个有效
{...}内的非空内容作为 hashtag。建议模式:
CROSSSLOT;算法切换会重新映射已有数据,必须受格式/路由版本门禁保护,不能直接替换。
2. Compaction 完整闭环
当前
Storage::do_compact_range()和do_compact_specific_key()只打印日志并返回成功,尚未调用已经存在的Redis::compact_range()。这会让管理命令和慢 key 后台任务看起来成功,实际没有执行压缩。需要完成:
详细设计放在 Issue #88。
3. Reserve 字段与 Block Cache
Floyd/Kiwi 的 persisted key/value 为未来扩展保留了较大的固定 reserve 字段。压缩后的 SST 可能降低部分磁盘成本,但 memtable、WAL、未压缩主 block cache 和编解码仍承担开销。
优化顺序建议:
block_cache_size与table_options;详细设计放在 Issue #143。
4. 实例元数据与安全启动
当前
instance = hash(key) % db_instance_num,但实例数和路由算法没有持久化。修改实例数会让已有 key 路由到新的目录,表现为数据丢失;reshard_slots()仍未实现。第一阶段先持久化拓扑并建立启动门禁:
db_instance_num;配置或算法与落盘值不一致时拒绝打开。长期使用显式
slot_to_instance[16384]和可恢复的 reshard 状态机。跟踪 Issue:#343
5. 存储格式版本化
Key/Value 编码、CF schema、Comparator 和路由算法均属于持久化契约。PR #262 已经发生过 MemberDataKey endian 变化,说明 reserve 字段不能替代版本机制。
需要统一
StorageManifest:跟踪 Issue:#342
推荐执行顺序
Phase 0:安全门禁
Phase 1:路由与命令语义
Phase 2:Compaction
Phase 3:缓存与格式效率
统一验收原则
已有关联项
Raft apply 与 multi-instance snapshot 已在 Discussion #330 及 #332~#340 跟进,本 Discussion 不重复定义其 crash-safe apply 协议。
All reactions