What's new in PikiwiDB(Pika) v4.0.0
尊敬的社区成员及技术爱好者们:
PikiwiDB 社区荣耀地宣告 —— 经过 9 个月打磨并在生产环境稳定运行 5 个月的 PikiwiDB (Pika) v4.0.0 【下文简称 Pika】今天正式发布。希望基于第三代存储引擎 Floyd 的这个新版本能为社区用户们带来更卓越的体验。
1 重大改进
1.1 第三代存储引擎 Floyd
Floyd 如同其前代 Blackwidow,基于 RocksDB,不仅支持基础的 String 结构,也原生支持了 Hash、List、Set、Stream 及 ZSet 等 KKV 形式的复合数据结构。
- RocksDB 实例数可配置
摒弃了 Blackwidow 按数据类型采用 RocksDB 实例的物理隔离模式,Floyd 采用了 RocksDB 的 Column-Family 虚拟隔离机制,在单个 RocksDB 实例下可存储所有类型的数据。
用户可自由设定 Pika 实例中每个 DB【等同于 Redis DB】中 RocksDB 实例的数量 ,而数据的存储则依据 key 的 hash 值分配至相应的 RocksDB 实例,减小了数据的空间放大和读放大效应,实现了机器资源的高效利用。
- 强类型 key
基于 RocksDB 的 Column-Family 虚拟隔离机制,Floyd 把所有类型的 key 和 string 一起存储在 Column-Family 0。
在此存储基础之上,不同于 Blackwidow,可明确禁止不同类型的 key 重复【强类型】,这一设计旨在杜绝潜在的数据冗余与不一致性,与 Redis 服务特性保持一致,进一步提升了系统的整体效率与数据质量。
Pika v2.x 系列版本基于存储引擎 Nemo,v3.x 系列版本基于 Blackwidow,它们因为采用了物理隔离机制,无法低成本实现强类型 key,所有在 Redis TYPE 命令的结果中可能返回多种类型,而 Floyd 则完全兼容 Redis 只返回一种类型。
- Floyd 详细说明
如果对 Floyd 存储引擎感兴趣,请详阅《Floyd 存储引擎》
【链接:https://github.com/OpenAtomFoundation/pika/discussions/2052】
由于 Floyd 前后进行了多个版本的迭代,所以阅读该 github discussion 文档时请注意前后时间,如有相关冲突性说法,以最新日期的文字为准。
关键 PR: PikiwiDB(Pika) 支持 Floyd 存储引擎
https://github.com/OpenAtomFoundation/pika/pull/2413
添加 Floyd 的 compaction-filter 的 Gtest
https://github.com/OpenAtomFoundation/pika/pull/2669
Pika 不支持不同类型的重复 key, 写入重复 key 返回非法类型
https://github.com/OpenAtomFoundation/pika/pull/2609
对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操 作与 String 操作明确区分开
https://github.com/OpenAtomFoundation/pika/pull/2720
添加支持分区索引过滤的功能
https://github.com/OpenAtomFoundation/pika/pull/2601
1.2 Mget 批量查询缓存
Pika v3.5.2 的热数据缓存只实现了对热点 Key 的点查 (如 get/hget),在后续的 v3.5.3 和 v3.5.4 修复若干 bug 后,对热数据的点查目前已经非常稳定。然而并未支持批量查询 (如 mget etc)。
内部业务侧反馈批量查询速度比较慢,在 40C/256GiB/2TiB SATA SSD 规格机器上数据量超过 100GiB 时,Pika v3.3.6 30% 批量查询延迟超过 35ms。但由于 Pika 热数据缓存尚未支持批量查询,性能并未改善。
为了满足业务需求,Pika 团队开发了批量查询热数据缓存功能,显著提升了批量查询性能,降低了查询延迟和失败率。相关技术细节请阅读《PikiwiDB (Pika) 混合存储之批量查询》
【链接:https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ 】。
关键 PR :
Mget 支持多 key 查询缓存,记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能
https://github.com/OpenAtomFoundation/pika/pull/2675
修复 Mget 没有使用解析 ttl 的函数导致出现部分 key 的 ttl 未被更新,数 据不一致的问题
https://github.com/OpenAtomFoundation/pika/pull/2730
1.3 主从复制
Pika v3.3.6 有很多主从复制的缺陷。v4.0.0 版本对 Pika 全量复制及增量复制进行了大量优化和 bug 修复,取得了非常好的效果。
并在 info 命令中输出了 "repl_connect_status" 指标 (PR 2638),以方便用户更加明确清晰的确定当前的主从复制状态。
关键 PR :
修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题
https://github.com/OpenAtomFoundation/pika/pull/2746
修复 Spop 在写 binlog 时可能会出现竞态问题
https://github.com/OpenAtomFoundation/pika/pull/2647
修复多 DB 下全量同步超时后不重试的问题
https://github.com/OpenAtomFoundation/pika/pull/2667
修复多 DB 主从超时场景下,可能会出现窗口崩溃的问题
https://github.com/OpenAtomFoundation/pika/pull/2666
修复主从同步限速逻辑中重复解锁的问题