随着 Redis 宣布采用双协议以维护其商业利益,PikiwiDB(Pika) 社区非常荣幸地宣布之际,我们的最新 v3.5.3 正式生产可用版本现已发布。
v3.5.3 版本不仅修复了长期存在的 Bug,还引入了一系列新特性。这些新特性包括 Pika 对 ACL 的支持、移除了 Sharing 模式的残留 Slot 代码、命令执行的快慢分离、Redis Stream 支持、大 key 分析工具、以及 Pika 分布式集群的全自动化 failover 等。此外,我们在 3.5.3 版本中增加了更多的自动化测试用例,以提高 Pika 服务的稳定性和健壮性,确保用户能够享受到更高效、更稳定的使用体验。本文将详细介绍本次更新的主要功能、Bug 修复和性能提升。
在深入探讨 3.5.3 版本的更新内容之前,请注意以下几点声明:
- 由于商标问题,Pika 项目已更名为 PikiwiDB。在本文中,我们将使用 PikiwiDB(Pika) 来指代项目,项目地址为:https://github.com/OpenAtomFoundation/pika
- 我们创建了一个新项目 https://github.com/OpenAtomFoundation/pikiwidb,这是一个基于 Raft 协议实现的兼容 Redis 协议的大容量 KV 数据库,主要面向强一致性数据场景,例如存储约 10TiB 规模的元数据。PikiwiDB 将专门用于指代此项目。
- 我们为 PikiwiDB 设计了一个新的 logo,作为其商标,并已在相关政府机构注册。
1 主要更新
1.1 支持 ACL
PikiwiDB(Pika) 3.5.3 版本正式全面支持 Redis ACL,为未来在云原生 Pika 集群中支持多租户场景奠定了基础。在此之前,Pika 已经支持了 Redis 的用户认证方式,如 auth/userpass/requirepass,以及通过 pika.conf 中的 userblacklist 配置命令黑名单模式。本次更新保持了向后兼容,并支持这些已有的使用方式。
我们还确保 PikiwiDB(Pika) 的 ACL 实现与 Redis ACL 完全兼容,通过将 Redis 的所有 ACL TCL 测试集纳入 PikiwiDB(Pika) 的测试集中。
关键 PR 链接:
1.2 混合存储模型支持 bitmap
在单体环境下,同时优化 PikiwiDB(Pika) 的读/写/compaction 是一项挑战。在 v3.5.2 版本中,我们引入了由缓存 Redis 和 RocksDB 构成的混合存储模型,并支持了 string/list/set/zset/hashtable 五种数据结构。在 3.5.3 版本中,我们增加了对 bitmap 的支持。
此外,我们在 3.5.3 版本中支持对 Redis 缓存进行动态参数调整。
关键 PR 链接:
1.3 快慢命令分离
为了避免慢命令阻塞快命令的执行,我们在 Codis-Proxy 和 PikiwiDB(Pika) 两个层面实现了快慢命令分离。
关键 PR 链接:
1.4 Redis Stream 支持
虽然 PikiwiDB(Pika) 之前支持了 Redis pubsub,但它只能进行在线消息传递。在 3.5.3 版本中,我们增加了对 Redis Stream 的有限支持,类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,我们在底层引擎 BlackWidow 中特别添加了对 Stream 数据类型的支持。
关键 PR 链接:
请注意,Pika Stream 目前还不支持消费组消费,这将在后续版本中实现。
1.5 云原生集群
在 PikiwiDB(Pika) 3.5.0 版本中,我们开源了 Pika-Operator,它支持在 K8s 上部署 Pika 主从对。在 3.5.2 版本中,我们基于 Kubeblocks 的 Pika-Operator 支持了在 K8s 上部署类似 Codis 的 Pika Cluster,但当时还不支持动态扩缩容。
在 3.5.3 版本中,最新的 Pika-Operator 已经支持了 Codis Group 级别的节点扩缩容,并且支持数据的 Rebalance。
关键 PR 链接:
- Pika-Operator 支持 Pika 集群自动扩容
- 优化 codis slot 迁移速度,支持动态修改迁移线程和速度
- Pika-operator 支持 namespace,可在不同 namespace 下部署不同的集群
- Pika-operator 支持监控指标采集,自动拉起 pika-expoter
1.6 Compaction 优化
PikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。
关键 PR 链接:
- 添加 CompactRange 命令,支持对一定范围内的 key 进行 compact
- 提升 Compaction 速度,减少 Compaction 耗时
- 执行 shutdown 命令时调用 disable compaction,提升进程退出速度
1.7 自动 Failover
PikiwiDB(Pika) 集群目前是基于 Codis 实现的。为了提高基于 Codis 的 PikiwiDB(Pika) Cluster 的易用性,我们对 Codis 进行了许多扩展。
原始的 Codis 不支持 Group 内的 Failover,需要使用 Redis Sentinel,这会导致运维成本增加。我们在 Codis Dashboard 中加入了 sentinel 的功能,实现了对 Group 内主从的自动 failover。
关键 PR 链接:
1.8 可观测性提升
PikiwiDB(Pika) 的可观测性关键组件是 Pika-Exporter。在 3.5.2 版本中,我们虽然添加了 Redis Cache 缓存热数据,但缺少监控指标。在 3.5.3 版本中,我们增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标。
关键 PR 链接:
- Pika exporter 暴露 cache 相关的数据采集指标
- PikiwiDB(Pika) 分布式集群 Codis proxy 新增可观测指标
- 修复 dbsize 计算错误问题
- 修复网络监控指标统计不准确的问题
1.9 数据一致性
3.5.3 版本修复了许多 PikiwiDB(Pika) 主从同步问题,确保数据的一致性。
关键 PR 链接:
- 修复主从复制过程中,slave 节点收到 master 异常回包后的处理逻辑
- 修复 Pika cache 部分场景下 cache 和 DB 数据不一致的问题
- 修复全量复制失败后,未做处理导致数据丢失问题
- 修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求
- 全量复制过程中,添加数据同步状态,明确数据同步进度
- 修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题
- 修复迁移数据后数据不一致的问题
1.10 测试集增加
PikiwiDB(Pika) 的测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。在 3.5.3 版本中,我们增加了 Codis 集群 e2e 测试。
关键 PR 链接:
1.11 工具集更新
PikiwiDB(Pika) 一直重视工具集的建设,所有相关工具都可以在 https://github.com/OpenAtomFoundation/pika/tree/unstable/tools 中找到。在 3.5.3 版本中,我们新增了一个工具:
1.12 文档更新
PikiwiDB(Pika) 的文档主要是 wiki 文档。在 3.5.3 版本中,我们更新了 Pika 支持的 Redis 命令文档。
2 发版详情
在第一章节中,我们概述了 3.5.3 版本的主要功能升级和改进。下面详细列出了本次发版的相关 PR。
新特性
- Pika 支持 ACL
- 在全量复制过程中,pika 服务的从节点不接收读请求
- 删除 Sharing 模式残留的 Slot 代码,回归 3.0,以后一个 Pika 下有多个 DB,每个 DB 只有一个 Blackwidow
- 在 Codis dashboard 协程 panic 时自动恢复服务
- Pika cache 新增 bimap数据类型
- Pika 支持快慢命令分离
- Pika exporter 暴露 cache 相关的数据采集指标
- Pika 执行完成 Bgsave 后, 保留 unix timepoint
- Pika 支持动态配置 disable_auto_compations 参数
- Pika 支持 Redis Stream
- Pika 支持大 key 分析工具
- Pika 支持动态调整 Pika cache 参数
- 更新 Pika benchmark 工具支持更多的接口压测
- Pika Operator 支持 Pika 集群自动扩容
- 添加 CompactRange 命令支持对一定范围内的 key 进行 compact
- 提升 Compaction 速度减少 Compaction 耗时
- 升级 RocksDB 版本到 v8.7.3
- Pika 分布式集群 Codis proxy 新增可观测指标
- Pika 分布式集群支持自动 failover
- Pika 支持 redis rename-command 功能
- 优化 codis slot 迁移速度,支持动态修改迁移线程和速度
- Pika 支持动态调整 max-conn-rbuf-size 参数
- Pika-operator 支持 namespace,可以在不同的 namespace 下部署不同的集群
- Pika-operator 支持监控指标采集,自动拉起 pika-expoter
- ACL 向前兼容 userblacklist
- 丰富了 Pika TCL 测试集
- 丰富了 Pika Gotest 测试集
Bug 修复
- 修复 Pika 有从节点进行全量复制期间会误删除 dump 文件的问题
- 修复主从复制过程中, slave 节点收到 master 异常回包后的处理逻辑
- 在 Pika 执行 shutdown 命令时调用 disable compaction, 提升进程退出速度
- 修复 Codis-dashboard Redis Memory 值不准确的问题
- INFO 命令耗时优化,降低查磁盘使用量的频率
- 修复 Rsync 删除临时文件路径不对,删除失败,导致rocksdb打开失败的问题
- 修复 Compact, Bgsave, Info keyspace 命令未指定db名称,导致部分命令 coredump 的问题
- Codis dashboard 用 info replication 替代 info 命令查寻 master ip 降低对 Pika 的性能影响
- 修复 Pika cache 使用边缘case,解决部分场景下 cache 和 DB 数据不一致的问题
- 修复当 dump 文件夹为空时,会启动报错 Segmentation fault 的问题
- 修复因为 flag 计算错误,导致的部分命令缓存没有生效问题
- 修复主从复制模式下,主实例 flushdb 后,从实例因为死锁导致的不能访问的问题
- 修复部分命令未对 RocksDB 的返回值进行判断的问题
- 规范函数的返回值及初始值
- 修复网络监控指标统计不准确的问题
- 修复配置文件加载部分参数异常的问题
- 修复 Codis dashboard cpu 100% 的问题
- 修复 Codis fe pika 主从角色显示异常的问题
- 修复迁移数据后数据不一致的问题
- 修复 dbsize 计算错误问题
- 修复扩缩容或者 pod 起停后,Codis-dashboard 界面显示不准确的问题
- 修复 DB 层重复上锁的问题
- 修复全量复制失败后,未做处理导致数据丢失问题
- 修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求
- 全量复制过程中,添加数据同步状态,明确数据同步进度
- 修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题
- 修复 codis slot 迁移过程中 master 实例 coredump 的问题
- 修复在主从复制过程中,删除正在使用的 dump 文件的问题
- 修复主从复制过程中从实例 rsync 响应错误的问题
发版标签
https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3
社区
PikiwiDB(Pika) 开源社区感谢您的支持,如果您有任何疑问或建议,欢迎加入我们的社区交流群:
- 微信助手【请在微信中搜索 PikiwiDB】
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。