diff --git a/.docusaurus/docusaurus-plugin-content-blog/default/blog-post-list-prop-default.json b/.docusaurus/docusaurus-plugin-content-blog/default/blog-post-list-prop-default.json index 2e36420..c4d3bae 100644 --- a/.docusaurus/docusaurus-plugin-content-blog/default/blog-post-list-prop-default.json +++ b/.docusaurus/docusaurus-plugin-content-blog/default/blog-post-list-prop-default.json @@ -7,18 +7,23 @@ "unlisted": false }, { - "title": "What's new in Pika v3.5.4", + "title": "What's new in PikiwiDB(Pika) v3.5.4", "permalink": "/blog/Pika-3.5.4", "unlisted": false }, + { + "title": "What's new in Pika v3.5.3 (英文版本)", + "permalink": "/blog/Pika-3.5.3-en", + "unlisted": false + }, { "title": "What's new in Pika v3.5.3 ", "permalink": "/blog/Pika-3.5.3", "unlisted": false }, { - "title": "What's new in Pika v3.5.0", - "permalink": "/blog/Pika-3.5.0", + "title": "What's new in Pika v3.5.2", + "permalink": "/blog/Pika-3.5.2", "unlisted": false }, { diff --git a/.docusaurus/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json b/.docusaurus/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json index 7e18eda..d13c622 100644 --- a/.docusaurus/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json +++ b/.docusaurus/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json @@ -1 +1 @@ -{"archive":{"blogPosts":[{"id":"PikiwiDB-Pika--4.0.0","metadata":{"permalink":"/blog/PikiwiDB-Pika--4.0.0","source":"@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md","title":"What's new in PikiwiDB(Pika) v4.0.0","description":"尊敬的社区成员及技术爱好者们:","date":"2024-07-08T00:00:00.000Z","tags":[],"readingTime":17.085,"hasTruncateMarker":false,"authors":[{"name":"360 车金鸽","title":"Pika 开源社区"}],"frontMatter":{"title":"What's new in PikiwiDB(Pika) v4.0.0","slug":"PikiwiDB-Pika--4.0.0","authors":[{"name":"360 车金鸽","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"What's new in Pika v3.5.4","permalink":"/blog/Pika-3.5.4"}},"content":"尊敬的社区成员及技术爱好者们:\nPikiwiDB 社区荣耀地宣告——经过 9 个月打磨并在生产环境稳定运行 5 个月的 PikiwiDB(Pika) v4.0.0 【下文简称 Pika】今天正式发布。希望基于第三代存储引擎 Floyd 的这个新版本能为社区用户们带来更卓越的体验。\n\n## 1 重大改进\n1.1 第三代存储引擎 Floyd\nFloyd 如同其前代 Blackwidow,基于 RocksDB,不仅支持基础的 String 结构,也原生支持了 Hash、List、Set、Stream及 ZSet 等 KKV 形式的复合数据结构。\n\n+ RocksDB 实例数可配置\n\n摒弃了 Blackwidow 按数据类型采用 RocksDB 实例的物理隔离模式,Floyd 采用了 RocksDB 的 Column-Family 虚拟隔离机制,在单个 RocksDB 实例下可存储所有类型的数据。用户可自由设定 Pika 实例中每个 DB【等同于Redis DB】中 RocksDB 实例的数量,而数据的存储则依据 key 的 hash 值分配至相应的 RocksDB 实例,减小了数据的空间放大和读放大效应,实现了机器资源的高效利用。\n\n+ 禁止重复 key\n\n![2024-05-16-PikiwiDB(Pika)-4.0.0-key](2024-07-08-PikiwiDB(Pika)-4.0.0-key.png)\n基于 RocksDB 的 Column-Family 虚拟隔离机制,Floyd 把所有类型的 key 和 string 一起存储在 Column-Family 0。在此存储基础之上,可明确禁止不同类型的 key 重复,这一设计旨在杜绝潜在的数据冗余与不一致性,与 Redis 服务特性保持一致,进一步提升了系统的整体效率与数据质量。\n\n+ Floyd 详细说明\n\n如果对 Floyd 存储引擎感兴趣,请详阅《Floyd 存储引擎》【链接:https://github.com/OpenAtomFoundation/pika/discussions/2052】。由于 Floyd 前后进行了多个版本的迭代,所以阅读该 github discussion 文档时请注意前后时间,如有相关冲突性说法,以最新日期的文字为准。\n\n关键 PR:\n+ PikiwiDB(Pika) 支持 Floyd 存储引擎 \nhttps://github.com/OpenAtomFoundation/pika/pull/2413\n+ 添加 Floyd 的 compaction-filter 的 Gtest \nhttps://github.com/OpenAtomFoundation/pika/pull/2669\n+ Pika 不支持不同类型的重复 key, 写入重复 key 返回非法类型 \nhttps://github.com/OpenAtomFoundation/pika/pull/2609\n+ 对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操作与 String 操作明确区分开 \nhttps://github.com/OpenAtomFoundation/pika/pull/2720\n+ 添加支持分区索引过滤的功能 \nhttps://github.com/OpenAtomFoundation/pika/pull/2601\n\n1.2 Mget 批量查询缓存\n\nPika v3.5.2 的热数据缓存只实现了对热点 Key 的点查(如get/hget),在后续的 v3.5.3 和 v3.5.4 修复若干 bug 后,对热数据的点查目前已经非常稳定。然而并未支持批量查询(如 mget etc)。\n内部业务侧反馈批量查询速度比较慢,在 40C/256GiB/2TiB SATA SSD 规格机器上数据量超过 100GiB 时,Pika v3.3.6 30% 批量查询延迟超过 35ms。但由于 Pika 热数据缓存尚未支持批量查询,性能并未改善。\n\n为了满足业务需求,Pika 团队开发了批量查询热数据缓存功能,显著提升了批量查询性能,降低了查询延迟和失败率。相关技术细节请阅读《PikiwiDB (Pika) 混合存储之批量查询》 【链接:https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ 】。\n\n关键 PR :\n\n+ Mget 支持多 key 查询缓存, 记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能 \nhttps://github.com/OpenAtomFoundation/pika/pull/2675\n+ 修复 Mget 没有使用解析 ttl 的函数导致出现部分key的ttl未被更新,数据不一致的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2730\n\n1.3 主从复制\n\nPika v3.3.6 有很多主从复制的缺陷。v4.0.0 版本对 Pika 全量复制及增量复制进行了大量优化和 bug 修复,取得了非常好的效果。 \n并在 info 命令中输出了 \"repl_connect_status\" 指标(PR 2638),以方便用户更加明确清晰的确定当前的主从复制状态。\n\n关键 PR :\n\n+ 修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2746\n+ 修复 Spop 在写 binlog 时可能会出现竞态问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2647\n+ 修复多 DB 下全量同步超时后不重试的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2667\n+ 修复多 DB 主从超时场景下,可能会出现窗口崩溃的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2666\n+ 修复主从同步限速逻辑中重复解锁的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2657\n+ 重构主从复制模式 slave 节点的主从同步线程模型,尽可能减少 binlog 消费阻塞问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2638\n\n1.4 Redis Stream\n\nRedis Stream 类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,底层引擎 BlackWidow 和 Floyd 中特别添加了对 Stream 数据类型的支持。\n关键 PR: \n+ 修复 pkpatternmatchdel 命令使用错误导致的 stream 类型数据删除异常的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2726\n+ 修复 Keyspace 命令未计算 Stream 类型数据的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2705\n\n1.5 Compaction\n\nPikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。\n\nFloyd 使用了 v8.7.3 版本的 RocksDB,开放了更多 RocksDB 参数,以方便用户优化 RocksDB 性能:\n\n+ enable-partitioned-index-filters: 支持加载分区索引过滤器,加快 RocksDB 查找速度。\n+ min-write-buffer-number-to-merge: 默认值为 1,如果将此值设置得更大,意味着需要更多的写缓冲区被填满后才进行 flush。这样可以减少 flush 的频率,增加数据在内存中的累积量,从而可能提高写入吞吐量。\n+ level0-stop-writes-trigger: 默认值为 36,定义了 L0 层中 sst 文件的最大数量,一旦达到这个数量,RocksDB 将会采取 暂停写入、强制 compaction 等措施来防止写入操作继续累积,以避免 L0 层变得过于庞大,进而可能导致写入放大、查询性能下降等问题。\n+ level0-slowdown-writes-trigger:默认值为 20,用于控制当 Level 0 的 SST 文件数量达到这个阈值时,触发写减速(write slowdown),防止 Level 0 的文件数量过多,导致后续 compaction 操作的压力过大。\n+ level0-file-num-compaction-trigger:默认值为 4,当 Level 0 的 SST 文件数量达到这个参数设定的阈值时,RocksDB 会开始执行 compaction 操作,将 Level 0 的文件合并到 Level 1,以减少 Level 0 的文件数量,降低读取延迟,并优化存储空间的利用率。\n+ max-subcompactions:默认值为 1,用于控制RocksDB 中并发执行的 sub-compaction 任务数量,其值为 1 表示关闭 sub-compaction。如果系统资源充足,建议提升该参数以优化 compaction 效率。\n+ max-bytes-for-level-base:指定了 L1 SST 文件总的大小。这个大小是 RocksDB 进行数据分层管理和 compaction 决策的重要依据:如果 L1 层的大小设置得太小,可能会导致 L0 层的 compaction 过于频繁,进而影响写性能。反之,如果设置得太大,可能会占用较多的磁盘空间,并且影响读取性能,因为读取操作可能需要跨越更多的层级。Pika 没有在 pika.conf 中开放此参数给用户配置,而是使用其他参数(level0-file-num-compaction-trigger 和 write-buffer-size)计算后的结果。\n\n\nstorage_options_.options.max_bytes_for_level_base = g_pika_conf->level0_file_num_compaction_trigger() * g_pika_conf->write_buffer_size()\n\n\n关键 PR:\n添加 Floyd 的 compaction-filter 的 Gtest\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\n添加支持分区索引过滤的功能\nhttps://github.com/OpenAtomFoundation/pika/pull/2601\n新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗\nhttps://github.com/OpenAtomFoundation/pika/pull/2538\n1.6 可观测性\nv3.5 版本增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标,但是在集群方面的可观测性是缺失的。v4.0.0 对 Codis-Proxy 的 P99、P999、延迟等监控指标进行采集和展示,可以直观地反映线上 Codis-proxy 的运行情况。\n\nv4.0.0 开始还提供新的工具:根据 pika benchmark 工具压测结果自动生成可视化的统计图表。\n\n关键 PR:\nCodis 支持 info 命令, 可以通过该命令查询 Codis-proxy 的 info 信息\nhttps://github.com/OpenAtomFoundation/pika/pull/2688\nCodis-proxy 新增 P99 P95 等监控耗时指标\nhttps://github.com/OpenAtomFoundation/pika/pull/2668\n添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表\nhttps://github.com/OpenAtomFoundation/pika/pull/2663\n\n1.7 测试集\nPikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。v4.0.0 中丰富了诸多特性的 go test 功能,并进一步完善了基本数据类型的 TCL 测试。\n关键 PR:\n添加 Floyd 的 compaction-filter 的 Gtest\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\nPika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷\nhttps://github.com/OpenAtomFoundation/pika/pull/2753\n1.8 跨平台\nPikiwiDB(Pika) 以往仅支持 centos 和 ubuntu 等 linux 平台,v3.5 开始支持 Mac 等平台。v4.0.0 将对 Mac 平台的支持扩展至 FreeBSD 平台。\n关键 PR:\nPika 支持在 FreeBSD14 平台上进行编译\nhttps://github.com/OpenAtomFoundation/pika/pull/2711\n2 改进列表\n下面详细列出了本次发版的主要功能升级和改进。\n2.1 新特性\n\n+ Pika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷\n https://github.com/OpenAtomFoundation/pika/pull/2753\n+ Pika 支持在 FreeBSD14 平台上进行编译打包\n https://github.com/OpenAtomFoundation/pika/pull/2711\n+ Pika 线程整理,避免启动过多无用线程,对不同的线程进行命名,方便问题定位\n https://github.com/OpenAtomFoundation/pika/pull/2697\n+ Mget 支持多 key 查询缓存, 记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能\n https://github.com/OpenAtomFoundation/pika/pull/2675\n+ Codis 支持 info 命令, 可以通过该命令查询 Codis-proxy 的 info 信息\n https://github.com/OpenAtomFoundation/pika/pull/2688\n+ 添加 Floyd 的 compaction-filter 的 Gtest\n https://github.com/OpenAtomFoundation/pika/pull/2669\n+ Codis-proxy 新增 P99 P95 等监控耗时指标\n https://github.com/OpenAtomFoundation/pika/pull/2668\n+ 添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表\n https://github.com/OpenAtomFoundation/pika/pull/2663\n+ Pika 主从复制新增监控指标 repl_connect_status, 可以更加明确清晰的确定当前的主从复制的状态\n https://github.com/OpenAtomFoundation/pika/pull/2638\n+ Pika 不支持不同类型的重复 key, 写入重复 key 返回非法类型\n https://github.com/OpenAtomFoundation/pika/pull/2609\n+ 添加支持分区索引过滤的功能\n https://github.com/OpenAtomFoundation/pika/pull/2601\n+ Pika 支持第三代存储引擎 Floyd, 通过支持多 rocksdb 实例、对 Blob 的使用进行优化、对过期数据的清理进行优化,提升了 Pika 实例的读写性能\n https://github.com/OpenAtomFoundation/pika/pull/2413\n\n2.2 bug 修复\n\n+ 修复 iter 未被析构,导致 pkpatternmatchdel 在返回之前不会删除 iter,这可能会导致 rocksdb 永远引用一个版本,导致数据不符合预期的问题\n https://github.com/OpenAtomFoundation/pika/pull/2785\n+ 修复 config 参数 min-blob-size 带单位时解析错误的问题\n https://github.com/OpenAtomFoundation/pika/pull/2767\n+ 修复 zverank 返回值异常的问题\n https://github.com/OpenAtomFoundation/pika/pull/2673\n+ 修复 Pika-port 传输数据过程中报错的问题\n https://github.com/OpenAtomFoundation/pika/pull/2758\n+ 修复因为堆上分配的缓冲区越界导致 Dbsize 命令运行时崩溃的问题\n https://github.com/OpenAtomFoundation/pika/pull/2749\n+ 修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题\n https://github.com/OpenAtomFoundation/pika/pull/2746\n+ 修复参数未初始化导致 slotsscan 等命令不能和 bgsave 命令相互制衡的问题\n https://github.com/OpenAtomFoundation/pika/pull/2745\n+ 修复 Slotmigrate 迁移数据的过程中,返回值设置错误,异常场景下会终止数据迁移的问题\n https://github.com/OpenAtomFoundation/pika/pull/2741\n+ 修复 Mget 没有使用解析 ttl 的函数导致出现部分key的ttl未被更新,数据不一致的问题\n https://github.com/OpenAtomFoundation/pika/pull/2730\n+ 修复 pkpatternmatchdel 命令使用错误导致的 stream 类型数据删除异常的问题\n https://github.com/OpenAtomFoundation/pika/pull/2726\n+ 修复 pkpatternmatchdel 不能正确删除掉对应的 keys 的问题\n https://github.com/OpenAtomFoundation/pika/pull/2717\n+ 修复 ACL 密码验证错误问题\n https://github.com/OpenAtomFoundation/pika/pull/2714\n+ 修复 Keyspace 命令未计算 Stream 类型数据的问题\n https://github.com/OpenAtomFoundation/pika/pull/2705\n+ 对部分命令定制化处理逻辑,避免写 binlog 导致从节点的 binlog 解析失败的问题\n https://github.com/OpenAtomFoundation/pika/pull/2793\n+ 修复 Pika cmdID 赋值在 Cmd 初始函数中,可能会导致并发构造的时候出现内存泄漏的问题\n https://github.com/OpenAtomFoundation/pika/pull/2692\n+ 修复 ExpectedStale 未考虑 String 类型, 如果存在已经过期的 String 类型的 key, ExpectedStale 会返回错误的问题\n https://github.com/OpenAtomFoundation/pika/pull/2682\n+ 修复 Spop 在写 binlog 时可能会出现竞态问题\n https://github.com/OpenAtomFoundation/pika/pull/2674\n+ db instance 设置不合理时,给用户错误提示\n https://github.com/OpenAtomFoundation/pika/pull/2672\n+ 修复 server_stat 中的数据竞态问题\n https://github.com/OpenAtomFoundation/pika/pull/2671\n+ 修复多 DB 下全量同步超时后不重试的问题\n https://github.com/OpenAtomFoundation/pika/pull/2667\n+ 修复多 DB 下全量同步超时后不重试的问题\n https://github.com/OpenAtomFoundation/pika/pull/2666\n+ 修复主从同步限速逻辑中重复解锁的问题\n https://github.com/OpenAtomFoundation/pika/pull/2657\n+ 发版支持自动打包 centos7 和 centos8 平台的二进制编译包\n https://github.com/OpenAtomFoundation/pika/pull/2535\n+ 修复 Codis 侧的 getrange 命令没有返回预期结果的问题\n https://github.com/OpenAtomFoundation/pika/pull/2510\n\n2.3 提升改进项\n\n+ 更新 Pika Docker Readme, 可以按照 Readme 在 Docker 中部署 Pika 服务\n https://github.com/OpenAtomFoundation/pika/pull/2743\n+ 优化重复查询 meta value 导致影响 Pika 服务读写性能的问题\n https://github.com/OpenAtomFoundation/pika/pull/2735\n+ 支持对更多的 RocksDB 参数进行动态调整,用户根据不同的业务使用场景调整参数提升 Pika 的读写性能\n https://github.com/OpenAtomFoundation/pika/pull/2728\n+ 对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操作与 String 操作明确区分开\n https://github.com/OpenAtomFoundation/pika/pull/2720\n+ 更新了 PR 标题验证,不允许在标题末尾出现中文字符\n https://github.com/OpenAtomFoundation/pika/pull/2718\n+ 重构主从复制模式 slave 节点的主从同步线程模型,尽可能减少 binlog 消费阻塞问题\n https://github.com/OpenAtomFoundation/pika/pull/2638\n+ 新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗\n https://github.com/OpenAtomFoundation/pika/pull/2538\n\n2.4 发版 tag\n\n https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0\n3 社区\n感谢所有为 v4.0.0 做出贡献的社区成员,包括 issue/PR 提交者、代码 reviewer 【排名不分先后,依据字母序列】:\n\n AlexStocks\n\n baerwang\n\n chejinge\n\n cheniujh\n\n chienguo\n\n guangkun123\n\n gukj-spel\n\n longfar-ncy\n\n lqxhub\n\n luky116\n\n Mixficsol\n\n saz97\n \n wangshao1\n\nPikiwiDB (Pika) 开源社区热烈欢迎您的参与和支持。如果您有任何问题、意见或建议,请扫码添加 PikiwiDB 小助手【微信号: PikiwiDB】为好友,它会拉您加入官方微信群。\n\n![2024-07-08-PikiwiDB(Pika)-4.0.0-connect](2024-07-08-PikiwiDB(Pika)-4.0.0-connect.png)"},{"id":"Pika-3.5.4","metadata":{"permalink":"/blog/Pika-3.5.4","source":"@site/blog/2024-05-16-Pika-3.5.4.md","title":"What's new in Pika v3.5.4","description":"PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。","date":"2024-05-16T00:00:00.000Z","tags":[],"readingTime":5.935,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbogo示土区"}],"frontMatter":{"title":"What's new in Pika v3.5.4","slug":"Pika-3.5.4","authors":[{"name":"于雨","title":"dubbogo示土区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in PikiwiDB(Pika) v4.0.0","permalink":"/blog/PikiwiDB-Pika--4.0.0"},"nextItem":{"title":"What's new in Pika v3.5.3 ","permalink":"/blog/Pika-3.5.3"}},"content":"PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。\nv3.5.4 解决了历史遗留的 bug,对 PikiwiDB(Pika) 的一些遗留 bug 进行修复和优化,旨在打造出一个高稳定性的版本。本次的重点优化主要包括,PikiwiDB(Pika)支持动态调整限速参数、增强 PikiwiDB(Pika) 的客观测性指标、 磁盘 IO 限速支持读限速及写限速等。\n1 新特性\n\n1. Pika 支持动态调整全量同步限速参数 rsync-timeout-ms 和 throttle-bytes-per-second。\n\n自 v3.5.0 版本开始,PikiwiDB(Pika) 服务摒弃了通过子进程内使用原来 rsync 工具进行主从全量同步的逻辑,在 PikiwiDB(Pika) 内部以线程方式【称作 rsync 线程】自行实现了新的全量同步逻辑,避免因为外部进程不可控引起的主从同步问题,根据 360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 主从进行全量同步的过程中,如果遇到某些不利的外部因素,如网络波动,硬件故障(如网卡降速导致的主从网卡速率不匹配)等,可能引起 rsync 线程请求持续超时(PikiwiDB(Pika) 内置 rsync 模块用于全量同步阶段的文件传输),且超时重试所发出的包可能引发更大的网络信道负担。此时对于运维人员来说,如果能动态调整 rsync 请求的超时时间和 rsync 传输的速率上限,不仅意味着对全量同步阶段控制粒度的进一步细化,更大大降低了在该场景下的运维处置难度。\n\n关键PR:\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2633\n\n2. 将 info key space 1 的结果输出至 info all 并展示到监控界面中。\n\nPikiwiDB(Pika) 是通过 Info 命令采集数据至 Pika-Exporter,展示到 Grafana 界面上的,目前界面上部分数据是没有展示的,如 keys 的数量,本次将执行 info keyspace 的结果展示到监控界面,用户可以通过这个指标来查看存储的量级等。\n\n关键PR:\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2603\n\n3.Pika 磁盘IO 限速参数支持 OnlyRead、OnlyWrite、ReadAndWrite,默认支持OnlyWrite。\n\n自3.5.0版本开始,PikiwiDB(Pika) 服务可以通过调整 rate-limit 参数实现写限速,防止在网卡质量不高的情况下磁盘 IO 过重导致服务不可用,或者 binlog 阻塞的情况发生。360内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 实例的网卡较差情况下,也需要对读实例进行限速,本次修改支持读、写限速,默认是写限速,调整 config 配置中的 rate-limiter-mode 可以设置为读限速,或者同时读写限速。\n\n关键PR:\n\n https://github.com/OpenAtomFoundation/pika/pull/2599\n\n2 改进列表\n\n slotmigrate 添加 go test。\n\n https://github.com/OpenAtomFoundation/pika/pull/2576\n\n INFO 命令耗时优化,降低查磁盘频率,避免因为数据采集调用 info 命令时查磁盘太过频繁导致服务性能下降。\n\n https://github.com/OpenAtomFoundation/pika/pull/2554\n\n 对五种基本数据类型命令增加 Redis tcl 测试。\n\n https://github.com/OpenAtomFoundation/pika/pull/2527\n\n3 Bug 修复\n\n 修复使用 Pika Exporter 时可能会出现 slots 分配不均衡的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2651\n\n 修复 Codis dashboard 不能正确更新 master 实例状态的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2650\n\n 修复 Redis 事务 binlog 解析失败导致的主从同步异常问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2642\n\n 修复 Pika Expoter 启动时不带参数导致启动失败问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2640\n\n 修复使用 Pika Operater 拉起集群 Codis-proxy panic 的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2633\n\n 修复 CI 编译出的二进制进行自动化测试时 cp 命令失败问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2614\n\n 修复变量未初始化导致 cache 启动失败的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2613\n\n 修复 userpass 和 userblacklist 动态修改参数功能异常问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2600\n\n 修复 scard sscan 结果不一致的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2596\n\n 修复当 max-rsync-parallel-num 大于4,slave 会在主从复制时 coredump 的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2595\n\n 调整不常用的线程池线程数,避免因为空跑导致性能损耗。\n\n https://github.com/OpenAtomFoundation/pika/pull/2590\n\n 修复 Pika 事务边缘测试 case 不通过的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2586\n\n 将 cache-model 修改成 cache-mode。\n\n https://github.com/OpenAtomFoundation/pika/pull/2585\n\n 修复使用 info keyspace 后,info all 死锁的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2584\n\n 修复因修改 zsetscorekey comparator impl 字典序比较熟顺序,导致 353 352极端场景不兼容的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2583\n\n 修复 compact 死锁的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2581\n\n Slotmigrate 添加 go test。\n\n https://github.com/OpenAtomFoundation/pika/pull/2576\n\n 更新 Pika Operater 使用的 pika 版本。\n\n https://github.com/OpenAtomFoundation/pika/pull/2572\n\n 修复 config rewrite 后 blockcache 数值异常的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2561\n\n 修复 slotmigrate 动态修复后值错误的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2548\n\n 修复 spop 可能会出现主从数据不一致的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2541\n\n 修复 CloseFd(it->second[i]) 出现越界的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2539\n\n 修复 Flushall 和 FlushDB 死锁的隐患,并删除 FlushSubDB 接口。\n\n https://github.com/OpenAtomFoundation/pika/pull/2533\n\n 增加参数控制是否清理 tcl 测试后产生的数据文件,防止废弃数据占据磁盘。\n\n https://github.com/OpenAtomFoundation/pika/pull/2507\n\n![2024-05-16-Pika-3.5.4-connect.png](2024-05-16-Pika-3.5.4-connect.png)"},{"id":"Pika-3.5.3","metadata":{"permalink":"/blog/Pika-3.5.3","source":"@site/blog/2024-03-27-Pika-3.5.3.md","title":"What's new in Pika v3.5.3 ","description":"随着 Redis 宣布采用双协议以维护其商业利益之际,PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.3 正式生产可用版本现已发布。","date":"2024-03-27T00:00:00.000Z","tags":[],"readingTime":14.535,"hasTruncateMarker":false,"authors":[{"name":"360 中间件团队","title":"Pika 开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.3 ","slug":"Pika-3.5.3","authors":[{"name":"360 中间件团队","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.4","permalink":"/blog/Pika-3.5.4"},"nextItem":{"title":"What's new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"}},"content":"随着 Redis 宣布采用双协议以维护其商业利益之际,PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.3 正式生产可用版本现已发布。\n\nv3.5.3 解决了历史遗留的 Bug,引入了多项新特性。这些特性主要包括 Pika 支持 ACL、删除 Sharing 模式残留的 Slot 代码、快慢命令分离、 Redis Stream、大 key 分析工具、Pika 分布式集群支持全自动化 failover 等功能,同时,我们在 3.5.3 版本丰富了更多的自动化测试 case,提升 Pika 服务的稳定性和健壮性,会让用户感受到更为高效和稳定的使用体验,本文主要阐述本次改动的相关重大 feature、bugfix 性能提升项。\n\n在深入探讨 3.5.3 版本的更新内容之前,请注意以下几点声明:\n\n1. 由于商标问题,Pika 项目已更名为 PikiwiDB。文中以 PikiwiDB(Pika) 指代项目 \n https://github.com/OpenAtomFoundation/pika\n2. 我们新创建了一个项目 \n https://github.com/OpenAtomFoundation/pikiwidb\n 这是一个基于 Raft 协议实现的兼容 Redis 协议的大容量 KV 数据库,主要面向强一致性数据场景,例如存储约 10TiB 规模的元数据。PikiwiDB 将专门用于指代此项目。\n3. 我们为 PikiwiDB 设计了一个新的 logo,作为其商标,并已在相关政府机构注册。\n\n![2024-03-27-Pika-3.5.3-logo](2024-03-27-Pika-3.5.3-logo.png)\n\n1 重大改进\n\n1.1 PikiwiDB(Pika) 支持 ACL\n\nPikiwiDB(Pika) 3.5.3 版本正式全面支持 Redis ACL,为未来在云原生 Pika 集群中支持多租户场景奠定了基础。在此之前,Pika 已经支持了 Redis 的用户认证方式,如 auth/userpass/requirepass,以及通过 pika.conf 中的 userblacklist 配置命令黑名单模式。本次更新保持了向后兼容,并支持这些已有的使用方式。\n\n我们还确保 PikiwiDB(Pika) 的 ACL 实现与 Redis ACL 完全兼容,通过将 Redis 的所有 ACL TCL 测试集纳入 PikiwiDB(Pika) 的测试集中。\n\n关键 PR:\n+ PikiwiDB(Pika) 支持 ACL\n https://github.com/OpenAtomFoundation/pika/pull/2013\n+ 修正 ACL 用户认证错误问题\n https://github.com/OpenAtomFoundation/pika/pull/2449\n+ ACL 向前兼容 userblacklist\n https://github.com/OpenAtomFoundation/pika/pull/2459\n+ 添加 Redis ACL 测试集\n https://github.com/OpenAtomFoundation/pika/pull/2495\n\n1.2 混合存储模型支持 bitmap \n\n在单体环境下,同时优化 PikiwiDB(Pika) 的读/写/compaction 是一项挑战。在 v3.5.2 版本中,我们引入了由缓存 Redis 和 RocksDB 构成的混合存储模型,并支持了 string/list/set/zset/hashtable 五种数据结构。在 3.5.3 版本中,我们增加了对 bitmap 的支持。\n\n此外,我们在 3.5.3 版本中支持对 Redis 缓存进行动态参数调整。\n\n关键 PR 链接:\n\n\n+ 支持 bitmap 的支持:\n https://github.com/OpenAtomFoundation/pika/pull/2253\n\n+ 另外,我们在 3.5.3 版本中支持对 Redis 缓存进行动态调参:\n https://github.com/OpenAtomFoundation/pika/pull/2197\n\n1.3 快慢命令分离\n\n+ 为了防止慢命令把快命令执行卡死,我们在 Codis-Proxy 和 PikiwiDB(Pika) 两个层面都实现了快慢命令分离。 \n https://github.com/OpenAtomFoundation/pika/pull/2162\n\n1.4 Redis Stream\n\n虽然 PikiwiDB(Pika) 之前支持了 Redis pubsub,但它只能进行在线消息传递。在 3.5.3 版本中,我们增加了对 Redis Stream 的有限支持,类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,我们在底层引擎 BlackWidow 中特别添加了对 Stream 数据类型的支持。\n关键 PR: \n+ Pika 支持 Redis Stream\n https://github.com/OpenAtomFoundation/pika/pull/1955\n请注意,Pika Stream 目前还不支持消费组消费,这将在后续版本中实现。\n\n1.5 云原生集群\n\n在 PikiwiDB(Pika) 3.5.0 版本中,我们开源了 Pika-Operator,它支持在 K8s 上部署 Pika 主从对。在 3.5.2 版本中,我们基于 Kubeblocks 的 Pika-Operator 支持了在 K8s 上部署类似 Codis 的 Pika Cluster,但当时还不支持动态扩缩容。\n\n在 3.5.3 版本中,最新的 Pika-Operator 已经支持了 Codis Group 级别的节点扩缩容,并且支持数据的 Rebalance。\n关键 PR:\n\n+ PikiwiDB(Pika) Operator 支持 pika 集群自动扩容\n https://github.com/OpenAtomFoundation/pika/pull/2121\n\n+ 优化 codis slot 迁移速度,支持动态修改迁移线程和速度\n https://github.com/OpenAtomFoundation/pika/pull/2486\n\n+ Pika-operator 支持 namespace,在不同的 namespace 下部署不同的集群\n https://github.com/OpenAtomFoundation/pika/pull/2480\n\n+ Pika-operator 支持监控指标采集,自动拉起 pika-expoter\n\n https://github.com/OpenAtomFoundation/pika/pull/2451\n1.6 Compaction 改进\n\nPikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。\n有关 compaction 的关键优化 PR 如下:\n\n+ 添加 CompactRange 命令支持对一定范围内的 key 进行 compact\n https://github.com/OpenAtomFoundation/pika/pull/2163\n+ 提升 Compaction 速度减少 Compaction 耗时 \n https://github.com/OpenAtomFoundation/pika/pull/2172\n+ 执行 shutdown 命令时调用 disable compaction, 提升进程退出速度\n https://github.com/OpenAtomFoundation/pika/pull/2345\n\n1.7 自动 Failover\n\nPikiwiDB(Pika) 集群目前是基于 Codis 实现的。为了提高基于 Codis 的 PikiwiDB(Pika) Cluster 的易用性,我们对 Codis 进行了许多扩展。\n\n原始的 Codis 不支持 Group 内的 Failover,需要使用 Redis Sentinel,这会导致运维成本增加。我们在 Codis Dashboard 中加入了 sentinel 的功能,实现了对 Group 内主从的自动 failover。\n\n关键 PR:\n\n+ PikiwiDB(Pika) 分布式集群支持自动 failover\n https://github.com/OpenAtomFoundation/pika/pull/2386\n\n1.8 可观测性提升\n\nPikiwiDB(Pika) 的可观测性关键组件是 Pika-Exporter。在 3.5.2 版本中,我们虽然添加了 Redis Cache 缓存热数据,但缺少监控指标。在 3.5.3 版本中,我们增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标。\n\n关键 PR:\n\n+ PikiwiDB(Pika) exporter 暴露 cache 相关的数据采集指标 \n https://github.com/OpenAtomFoundation/pika/pull/2318\n+ PikiwiDB(Pika) 分布式集群 Codis proxy 新增可观测指标 \n https://github.com/OpenAtomFoundation/pika/pull/2199\n+ 修复dbsize 计算错误问题 \n https://github.com/OpenAtomFoundation/pika/pull/2494\n+ 修复网络监控指标统计不准确的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2234\n1.9 数据一致性\n3.5.3 版本修复了许多 PikiwiDB(Pika) 主从同步问题,确保数据的一致性。\n\n关键 PR:\n\n+ 修复主从复制过程中, slave 节点收到 master 异常回包后的处理逻辑 \n https://github.com/OpenAtomFoundation/pika/pull/2319\n+ 修复 Pika cache 部分场景下 cache 和 DB 数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2225\n+ 修复全量复制失败后,未做处理导致数据丢失问题 \n https://github.com/OpenAtomFoundation/pika/pull/2439\n+ 修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求 \n https://github.com/OpenAtomFoundation/pika/pull/2437\n+ 全量复制过程中,添加数据同步状态,明确数据同步进度 \n https://github.com/OpenAtomFoundation/pika/pull/2430\n+ 修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2409\n+ 修复迁移数据后数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2485\n\n\n1.10 添加测试集\n\nPikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成:\n\n+ gtest 单测主要测试 Pika C++ 代码\n+ Redis TCL 测试集来自 Redis,用于测试 PikiwiDB(Pika) 对 Redis 标准命令兼容度\n+ Go 测试集可对 Pika 进行 Redis 命令测试、主从和 Codis 集群 e2e 测试 \n\n3.5.3 中添加了 Codis 集群 e2e 测试,关键 PR 如下:\n\n\n+ 丰富了 Pika TCL 测试集 \n https://github.com/OpenAtomFoundation/pika/pull/2497\n+ 丰富了 Pika Gotest 测试集 \n https://github.com/OpenAtomFoundation/pika/pull/2502\n\n1.11 工具集 \nPikiwiDB(Pika) 一直重视工具集的建设,所有相关工具都可以在 https://github.com/OpenAtomFoundation/pika/tree/unstable/tools 中找到。在 3.5.3 版本中,我们新增了一个工具:\n\nPikiwiDB(Pika) 支持大 key 分析工具\n https://github.com/OpenAtomFoundation/pika/pull/2195\n\n1.12 文档更新\n\nPikiwiDB(Pika) 的文档主要是 wiki 文档。在 3.5.3 版本中,我们更新了 Pika 支持的 Redis 命令文档。\n\n文档链接: https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5\n2 改进列表\n\n在第一章节中,我们概述了 3.5.3 版本的主要功能升级和改进。下面详细列出了本次发版的相关 PR。\n\n2.1 新特性\n\n+ Pika 支持 ACL \n\n https://github.com/OpenAtomFoundation/pika/pull/2013\n\n+ 在全量复制的过程中,pika 服务的从节点不接收读请求 \n\n https://github.com/OpenAtomFoundation/pika/pull/2197\n+ 删除 Sharing 模式残留的 Slot 代码,回归 3.0,以后一个 Pika 下有多个 DB,每个 DB 只有一个 Blackwidow \n https://github.com/OpenAtomFoundation/pika/pull/2251\n+ 在 Codis dashboard 协程 panic 时自动恢复服务 \n https://github.com/OpenAtomFoundation/pika/pull/2349\n+ Pika cache 新增 bimap数据类型 \n https://github.com/OpenAtomFoundation/pika/pull/2253\n+ Pika 支持快慢命令分离 \n https://github.com/OpenAtomFoundation/pika/pull/2162\n+ Pika exporter 暴露 cache 相关的数据采集指标 \n https://github.com/OpenAtomFoundation/pika/pull/2318\n+ Pika 执行完成 Bgsave 后, 保留 unix timepoint \n https://github.com/OpenAtomFoundation/pika/pull/2167\n+ Pika 支持动态配置 disable_auto_compations 参数 \n https://github.com/OpenAtomFoundation/pika/pull/2257\n+ Pika 支持 Redis Stream \n https://github.com/OpenAtomFoundation/pika/pull/1955\n+ Pika 支持大 key 分析工具 \n https://github.com/OpenAtomFoundation/pika/pull/2195\n+ Pika 支持动态调整 Pika cache 参数 \n https://github.com/OpenAtomFoundation/pika/pull/2197\n+ 更新 Pika benchmark 工具支持更多的接口压测 \n https://github.com/OpenAtomFoundation/pika/pull/2222\n+ Pika Operator 支持 pika 集群自动扩容 \n https://github.com/OpenAtomFoundation/pika/pull/2121\n+ 添加 CompactRange 命令支持对一定范围内的 key 进行 compact \n https://github.com/OpenAtomFoundation/pika/pull/2163\n+ 提升 Compaction 速度减少 Compaction 耗时 \n https://github.com/OpenAtomFoundation/pika/pull/2172\n+ 升级 RocksDB 版本到 v8.7.3 \n https://github.com/OpenAtomFoundation/pika/pull/2157\n+ Pika 分布式集群 Codis proxy 新增可观测指标 \n https://github.com/OpenAtomFoundation/pika/pull/2199\n+ Pika 分布式集群支持自动 failover \n https://github.com/OpenAtomFoundation/pika/pull/2386\n+ Pika 支持 redis rename-command 功能 \n https://github.com/OpenAtomFoundation/pika/pull/2455\n+ 优化 codis slot 迁移速度,支持动态修改迁移线程和速度 \n https://github.com/OpenAtomFoundation/pika/pull/2486\n+ Pika 支持动态调整 max-conn-rbuf-size 参数 \n https://github.com/OpenAtomFoundation/pika/pull/2434\n+ Pika-operator 支持 namespace,可以在不同的 namespace 下部署不同的集群 \n https://github.com/OpenAtomFoundation/pika/pull/2480\n+ Pika-operator 支持监控指标采集,自动拉起 pika-expoter \n https://github.com/OpenAtomFoundation/pika/pull/2451\n+ ACL 向前兼容 userblacklist \n https://github.com/OpenAtomFoundation/pika/pull/2459\n+ 丰富了 Pika TCL 测试集 \n https://github.com/OpenAtomFoundation/pika/pull/2497\n+ 丰富了 Pika Gotest 测试集 \n https://github.com/OpenAtomFoundation/pika/pull/2502\n\n2.2 bug 修复\n\n+ 修复 Pika 有从节点进行全量复制期间会误删除 dump 文件的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2377\n+ 修复主从复制过程中, slave 节点收到 master 异常回包后的处理逻辑 \n https://github.com/OpenAtomFoundation/pika/pull/2319\n+ 在 Pika 执行 shutdown 命令时调用 disable compaction, 提升进程退出速度 \n https://github.com/OpenAtomFoundation/pika/pull/2345\n+ 修复 Codis-dashboard Redis Memory 值不准确的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2337\n+ INFO 命令耗时优化,降低查磁盘使用量的频率 \n https://github.com/OpenAtomFoundation/pika/pull/2197\n+ 修复 Rsync 删除临时文件路径不对,删除失败,导致rocksdb打开失败的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2186\n+ 修复 Compact ,Bgsave ,Info keyspace 命令未指定db名称,导致部分命令 coredump 的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2194\n+ Codis dashboard 用 info replication 替代 info 命令查寻 master ip 降低对 Pika 的性能影响 \n https://github.com/OpenAtomFoundation/pika/pull/2198\n+ 修复 Pika cache 使用边缘case,解决部分场景下 cache 和 DB 数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2225\n+ 修复当 dump 文件夹为空时,会启动报错 Segmentation fault 的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2265\n+ 修复因为 flag 计算错误,导致的部分命令缓存没有生效问题 \n https://github.com/OpenAtomFoundation/pika/pull/2217\n+ 修复主从复制模式下,主实例 flushdb 后,从实例因为死锁导致的不能访问的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2249\n+ 修复部分命令未对 RocksDB 的返回值进行判断的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2187\n+ 规范函数的返回值及初始值 \n https://github.com/OpenAtomFoundation/pika/pull/2176\n+ 修复网络监控指标统计不准确的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2234\n+ 修复配置文件加载部分参数异常的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2218\n+ 修复 Codis dashboard cpu 100% 的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2393\n+ 修复 Codis fe pika 主从角色显示异常的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2387\n+ 修复迁移数据后数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2485 \n+ 修复dbsize 计算错误问题 \n https://github.com/OpenAtomFoundation/pika/pull/2494\n+ 修复扩缩容或者 pod 起停后,Codis-dashboard 界面显示不准确的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2475\n+ 修复 DB 层重复上锁的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2372 \n+ 修复全量复制失败后,未做处理导致数据丢失问题 \n https://github.com/OpenAtomFoundation/pika/pull/2439\n+ 修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求 \n https://github.com/OpenAtomFoundation/pika/pull/2437\n+ 全量复制过程中,添加数据同步状态,明确数据同步进度 \n https://github.com/OpenAtomFoundation/pika/pull/2430\n+ 修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2409\n+ 修复 codis slot 迁移过程中 master 实例 coredump 的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2415\n+ 修复在主从复制过程中,删除正在使用的 dump 文件的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2377\n+ 修复主从复制过程中从实例 rsync 响应错误的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2319\n\n2.3 发版 tag\n https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3\n3 社区\n\n如果你有任何疑问,欢迎加入交流群,PikiwiDB(Pika) 开源社区感谢大家的支持和帮助。\n\n![2024-03-27-Pika-3.5.3-connect](2024-03-27-Pika-3.5.3-connect.png)"},{"id":"Pika-3.5.0","metadata":{"permalink":"/blog/Pika-3.5.0","source":"@site/blog/2023-12-03-Pika-3.5.2.md","title":"What's new in Pika v3.5.0","description":"Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。","date":"2023-12-03T00:00:00.000Z","tags":[],"readingTime":2.575,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.0","slug":"Pika-3.5.0","authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.3 ","permalink":"/blog/Pika-3.5.3"},"nextItem":{"title":"What's new in Pika v3.5.1","permalink":"/blog/Pika-3.5.1"}},"content":"Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。\n\n## 新特性\n\n+ Pika 支持 Redis 事务,使得 Pika 的数据够在一系列命令的执行中保持数据的一致性和可靠性。 https://github.com/OpenAtomFoundation/pika/pull/2124\n+ Pika 上层增加缓存层实现冷热数据分离,提升读性能。 https://github.com/OpenAtomFoundation/pika/pull/2171\n+ Codis-Proxy 支持动态修改配置参数,方便我们做参数调整。 https://github.com/OpenAtomFoundation/pika/pull/2110\n+ 补全 Go Test 测试用例。 https://github.com/OpenAtomFoundation/pika/pull/2082\n+ CI 增加 cache 提升编译速度。 https://github.com/OpenAtomFoundation/pika/pull/2093\n+ 增加 redis-copy 流量复制工具。 https://github.com/OpenAtomFoundation/pika/pull/2060\n\nbugfix\n\n+ 修复 pika 在使用 SETRANGE 命令出现 coredump 的问题。 https://github.com/OpenAtomFoundation/pika/pull/2141\n+ 修复因删除 Clearreplicationid 写进 binlog 导致的全量复制问题。 https://github.com/OpenAtomFoundation/pika/pull/2135\n+ 修改锁粒度,提升 pika 写 binlog 的性能。 https://github.com/OpenAtomFoundation/pika/pull/2129\n+ 修复复杂数据类型成员变量可能出现数据溢出。 https://github.com/OpenAtomFoundation/pika/pull/2106\n+ 修复 decr 命令返回值错误问题。 https://github.com/OpenAtomFoundation/pika/pull/2092\n+ 修复 setrange 和 setbit 命令没有保留原 key 的过期时间的问题。 https://github.com/OpenAtomFoundation/pika/pull/2095\n\n下期版本规划\n\n预计再过两个月左右,我们会在农历新年前发布 3.5.3 版本,相关关键特性有:\n\n+ Pika 通过快慢命令分离提升读写性能。 https://github.com/OpenAtomFoundation/pika/pull/2162\n+ 支持 Redis ACL,在 Pika 中引入用户概念,进行权限控制。 https://github.com/OpenAtomFoundation/pika/pull/2013\n+ 支持 Redis Stream,实现消息队列。 https://github.com/OpenAtomFoundation/pika/pull/1955\n+ 添加 Pika 特有命令 compactrange,对指定范围内的 key 进行 compact 以解决大 key 删除时读放大的问题。 https://github.com/OpenAtomFoundation/pika/pull/2163\n+ 支持 lastsave 指令。 https://github.com/OpenAtomFoundation/pika/pull/2167\n\n感谢大家对 Pika 开源公众号的关注 ,Pika 3.5 版本重大特性及使用规范我们会在稍后的文章中进行介绍,我们下期再见~\n\n![2023-09-28-Pika-3.5.2-connect](2023-12-03-Pika-3.5.2-connect.png)"},{"id":"Pika-3.5.1","metadata":{"permalink":"/blog/Pika-3.5.1","source":"@site/blog/2023-09-28-Pika-3.5.1.md","title":"What's new in Pika v3.5.1","description":"Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 。","date":"2023-09-28T00:00:00.000Z","tags":[],"readingTime":4.385,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.1","slug":"Pika-3.5.1","authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"},"nextItem":{"title":"What's new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"}},"content":"Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 。\n\n该版本不仅做了很多优化工作,还引入了多项新功能。这些新功能包括 动态关闭 WAL、ReplicationID 检测是否增量复制、在 K8s 环境上 Pika 服务的自动注册从而实现集群的自组织、以及 exporter 检测集群指标等等,无疑将会让用户享受到更为稳定和高效的 NoSQL 使用体验。\n\n## 新特性\n\n+ 1 Slow log 增加队列等待时间统计,在队列阻塞的时候方便我们进行问题定位。PR 1997, 作者 wangshao1。\n+ 2 主从复制使用 ReplicationID 判断是否进行增量同步,解决原主从同步方式切主后整个数据集会进行全量复制的问题,可以提升 Pika 性能。PR 1951, 作者 Mixficsol。\n+ 3 WAL 以 'disablewal' 命令方式支持动态关闭,在写性能遇到瓶颈的时候,可以通过命令关闭 WAL 缓解写性能下降的问题,关闭 WAL 有机器宕机后丢失数据的风险,用户需要根据自己的使用习惯权衡。PR 2015,作者 Mixficsol。\n+ 4 flush 线程数和 compaction 线程数合二为一,在 Compaction 性能瓶颈时,可以动态调整线程数,缓解 Comapction 损耗 Pika 性能的问题。PR 2014, 作者 Tianpingan。\n+ 5 升级了 RocksDB 版本到 v8.3.3。PR 2000, 作者 dingxiaoshuai123。\n+ 6 新增周期性打印工作队列的长度功能,在队列阻塞的时候可以快速定位问题。PR 1978, 作者 Tianpingan。\n+ 7 新增利用一个 pika_exporter 监测整个集群的指标,实现一个 Pika Exporter 实例监控整个集群,解决了 3.5.0 版本一个 Pika Exporter 监测一个 Pika 实例消耗资源的问题。PR 1953, 作者 chenbt-hz。\n+ 8 实现在 K8s 环境上 Pika 服务的自动注册,在启动时自动注册,从而实现集群的自组织 ,实现了通过命令拉起整个 Pika Cluster 集群。PR 1931, 作者 machinly。\n\n## 2 bug 修复\n\n+ 1 调整了 Rate_limit 参数,修复了压测时出现 RPS 为 0 的情况 。PR 2009, 作者 Mixficsol。\n+ 2 修复了 INFODATA 命令中对于遍历数据文件时出现空路径的逻辑判断。PR 1996, 作者 Mixficsol。\n+ 3 修复了 Codis 在线上出现大毛刺的问题。PR 2016, 作者 chejinge。\n+ 4 修复了 macOS 环境下编译使用 tools 导致编译不过的问题 。PR 2011, 作者 A2ureStone。\n+ 5 减少了 exporter 非必要日志的打印,降低 了资源利用率。PR 1945, 作者 Mixficsol。\n\n## 3 使用建议\n\n本次新增了几个配置参数,大家在使用过程中,需要根据使用情况按需调整:\n\n+ 1 max-rsync-parallel-num:主从全量复制线程数,需要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 2。\n+ 2 rate-limiter-bandwidth: 限制 RocksDB 数据库读写速度,限制数据库在一定时间内可以读写的数据量,默认 2000MiB/s,需要根据自己的机器性能和部署实例做调整。\n+ max-background-jobs: compaction 和 flushdb 线程数,要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 4。\n+ 3 throttle-bytes-per-second: 主从复制传输限速参数,默认为 200MiB/s,该参数可以根据机器网卡的配置及部署 pika 实例的个数进行调整。\n\n![2023-09-28-Pika-3.5.1-connect.png](2023-09-28-Pika-3.5.1-connect.png)"},{"id":"Pika-3.5.0","metadata":{"permalink":"/blog/Pika-3.5.0","source":"@site/blog/2023-08-25-Pika-3.5.0.md","title":"What's new in Pika v3.5.0","description":"时隔两年,Pika 社区正式发布经由社区 50 多人参与开发并在 360 生产环境验证可用的 v3.5.0 版本,新版本在提升性能的同时,也支持了 Codis 集群部署,BlobDB KV 分离,增加 Exporter 等新特性。","date":"2023-08-25T00:00:00.000Z","tags":[],"readingTime":9.825,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbogo示土区"}],"frontMatter":{"title":"What's new in Pika v3.5.0","slug":"Pika-3.5.0","authors":[{"name":"于雨","title":"dubbogo示土区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.1","permalink":"/blog/Pika-3.5.1"},"nextItem":{"title":"Pika Blackwidow 引擎数据存储格式","permalink":"/blog/pika-blackwidow"}},"content":"时隔两年,Pika 社区正式发布经由社区 50 多人参与开发并在 360 生产环境验证可用的 v3.5.0 版本,新版本在提升性能的同时,也支持了 Codis 集群部署,BlobDB KV 分离,增加 Exporter 等新特性。\n\n我们将详细介绍该版本引入的重要新特性。\n\n## 1 去除 Rsync\n\n在 v3.5.0 版本之前,Pika 使用 Rsync 工具进行引擎中存量数据的同步,Pika 进程启动时创建 Rsync 子进程。这种同步方式在实际使用中出现了一些问题,包括Pika 进程 crash 后重新拉起无法正常同步以及同步过程中 Rsync 进程无故退出等。在今年发布的 v3.5.0 版本中,我们在全量同步方案方面进行了重要的改进,摒弃了以往使用的 Rsync,实现了全新的数据同步方案,支持了断点续传,动态调节传输限速等特性,以确保同步过程更加稳定、可控。这些改进不仅增强了同步的可靠性,还为用户提供了更好的使用体验。\n\n+ 去除 Rsync 进程,使用自研全量同步方式\n https://github.com/OpenAtomFoundation/pika/pull/1805\n\n+ 实现断点续传,传输限速功能\n https://github.com/OpenAtomFoundation/pika/pull/1926\n\n+ Pika 主从同步时,进行 master run_id 的检验\n https://github.com/OpenAtomFoundation/pika/pull/1805\n\n## 2 兼容更多 Redis 命令\n\n在 v3.5.0 版本中,我们迈出了更大的一步,提升了对 Redis 命令的兼容性,对 Redis 命令提供了更广泛的支持。这个版本的改进使得 Pika 在与 Redis 生态系统的集成中表现更加出色,为用户提供了更丰富的功能和更广阔的可能性。我们对命令支持的扩展,为用户提供了更多的灵活性,以满足不同场景下的需求。\n\n+ 支持 UNLINK 命令\n https://github.com/OpenAtomFoundation/pika/pull/1273\n+ 支持 INFO COMMANDSTATS 命令\n https://github.com/OpenAtomFoundation/pika/pull/1660\n+ 支持 HELLO、SETNAME 命令\n https://github.com/OpenAtomFoundation/pika/pull/1245\n+ 支持 BLPOP、BRPOP 命令\n https://github.com/OpenAtomFoundation/pika/pull/1548\n+ 新增 Pika 原创 DISKRECOVERY 命令\n https://github.com/OpenAtomFoundation/pika/pull/1843\n\n## 3 RocksDB 版本升级和分级压缩\n\n在 v3.5.0 版本中,我们进行了一项重要的升级,将 RocksDB 引擎升级至 v8.1.1 版本,并实现了分级压缩功能的整合。这一升级不仅是技术的飞跃,也是我们对系统性能和优化的持续关注的体现。通过这项升级,我们为 Pika 增加了更高级别的数据管理能力,同时也让系统更好地适应不同的压缩需求,为用户的数据存储和检索提供了更大的灵活性和效率。\n\n+ 升级 RocksDB 版本到 v8.1.1\n https://github.com/OpenAtomFoundation/pika/pull/1396\n+ 实现 RocksDB 分级压缩\n https://github.com/OpenAtomFoundation/pika/pull/1365\n+ 新增 RocksDB 缓存配置项 num-shard-bits 能够从配置文件中读取\n https://github.com/OpenAtomFoundation/pika/pull/1189\n\n## 4 支持 BlobDB\n\n在 v3.5.0 版本中,我们引入了引人瞩目的创新--对 BlobDB 和 KV 存储层进行了分离,为我们的系统注入了新的活力。这个版本的升级使得 Pika 在数据存储方面更加灵活和高效。我们通过支持 BlobDB KV 分离,提供了更优化的数据存储结构,为用户的数据管理和查询操作带来了更深层次的优势。这一重要改进将在更多应用场景下展现出其强大的潜力。\n\n+ 支持 BlobDB KV 分离\n https://github.com/OpenAtomFoundation/pika/pull/1456\n\n## 5 基于 Codis 的集群模式\n\n在 v3.5.0 版本中,我们积极引入了 Codis 集群模式,此外,我们不仅仅将 Codis 集群模式融入了系统中,还为其提供了迁移 slot 的命令支持,从而实现了更加智能化的集群管理。这一重大变革不仅扩展了 Pika 在大规模数据存储场景中的应用范围,还进一步提升了系统的可扩展性和高可用性。通过引入 Codis 集群模式,我们对用户的数据处理和管理提供了更优化的解决方案。\n\n+ 引入 Codis 到 Pika\n\n https://github.com/OpenAtomFoundation/pika/pull/1279\n\n+ 引入 Codis 的 CI\n\n https://github.com/OpenAtomFoundation/pika/pull/1311\n\n+ 支持 Codis 迁移 slot 命令\n\n https://github.com/OpenAtomFoundation/pika/pull/1632\n\n+ 新增是否在 reload 的 slotmigrate 状态\n\n https://github.com/OpenAtomFoundation/pika/pull/1700\n\n## 6 可观测性\n\n在 v3.5.0 版本中,我们引入了一个创新性的工具--pika_exporter,以提升对 Pika 数据库的可观测性。这一工具的加入不仅是对我们对系统监测能力的持续增强的反映。而在版本的后续更新中,我们进一步充实了指标,不断丰富了 Pika 的可观测性。为用户提供了更为全面和精准的数据洞察力。\n\n+ 新增 Pika 可观测系统 pika_exporter\n\n https://github.com/OpenAtomFoundation/pika/pull/1388\n\n+ 新增网络 I/O 流量监控指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1733\n\n+ 新增命令统计耗时指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1751\n\n+ 新增 estimate_pending_compaction_bytes 度量来分析碎片率指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1736\n\n+ 新增 RocksDB 指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1560\n\n## 7 容器化部署\n\n在 v3.5.0 版本中,我们引入了一个具有创新意义的里程碑--pika-operator mvp 版本,这一版本在技术上实现了一个重要目标:将 Pika 单实例服务迁移到 Kubernetes(K8s)平台上的快速部署。这不仅是对我们持续关注行业发展的体现,也是我们不断提升用户体验的追求。通过 pika-operator,我们为用户提供了更便捷的部署方案,将 Pika 的高性能数据库引擎与 Kubernetes 的灵活性相融合,从而为用户的应用环境带来更高效、更弹性的支持。\n\n+ 实现 Pika 单例服务在 K8s 上快速部署\n https://github.com/OpenAtomFoundation/pika/pull/1243\n+ 实现了在 MiniKube 环境中部署 Pika\n https://github.com/OpenAtomFoundation/pika/pull/1330\n+ 给 pika-operator 添加 E2E 测试\n https://github.com/OpenAtomFoundation/pika/pull/1347\n\n## 8 跨平台编译\n\n在 v3.5.0 版本中,Pika 呈现出一种全面性的蓬勃发展态势,得以在不同操作系统平台上展现其优越性。此版本的突破性之处在于,Pika 实现了对 MacOS、CentOS 和 Ubuntu 这些主要平台的完整编译和使用支持。这个举措不仅仅体现了我们对多样化技术环境的关注,也是为了最大程度地拓展用户基础,为广泛的用户群体提供灵活、高效的数据库解决方案。这种跨平台兼容性的加强将 Pika 推向更广阔的技术生态。\n\n+ 支持 MacOS 平台\n https://github.com/OpenAtomFoundation/pika/pull/1372\n\n## 9 多平台集成测试及单元测试\n\n在 v3.5.0 版本中,我们迈出了一个令人瞩目的步伐,不仅在多个主要操作系统平台上实现了支持,还在测试领域实施了全面升级。我们为 Ubuntu、CentOS 和 MacOS 这三大平台搭建了持续集成(CI)环境,以确保系统的完整性和稳定性。在测试方面,我们引入了更为广泛的覆盖,包括 Go 语言的集成测试、TCL 的单元测试以及 Python 的端到端(E2E)测试。通过这些测试策略的升级,我们在确保系统性能和可靠性方面迈出了更大的一步。\n\n+ 新增 CentOS 环境下的 CI\n https://github.com/OpenAtomFoundation/pika/pull/1534\n+ 新增 MacOS 环境下的 CI\n https://github.com/OpenAtomFoundation/pika/pull/1769\n+ 新增 E2E 测试框架\n https://github.com/OpenAtomFoundation/pika/pull/1347\n+ 新增在 Github CI Workflow 中添加 CMake 编译环境\n https://github.com/OpenAtomFoundation/pika/pull/1268\n+ 新增在 TCL 脚本中 populate 方法模拟 Redis debug populate 方法,用以填充测试数据\n https://github.com/OpenAtomFoundation/pika/pull/1693\n+ 新增在 blackwidow 中添加 CMake 文件,添加对 blackwidow 的单元测试\n https://github.com/OpenAtomFoundation/pika/pull/1246\n+ 移植 Redis 测试脚本\n https://github.com/OpenAtomFoundation/pika/pull/1357\n\n## 10 Others\n\n若您有任何疑问,诚挚欢迎您扫描微信二维码,加入我们的交流群,与一众志同道合的成员展开深入的讨论,我们热切期待与您分享见解、交流心得,为共同的技术探索和创新之旅添砖加瓦。在这个群体中,我们将以卓越的智慧和互动的合作精神,构建出一个相互学习、不断进步的技术共同体。\n\n![2023-08-25-Pika-3.5.0](2023-08-25-Pika-3.5.0-connect.png)"},{"id":"pika-blackwidow","metadata":{"permalink":"/blog/pika-blackwidow","source":"@site/blog/2020-7-16-pika-blackwidow.md","title":"Pika Blackwidow 引擎数据存储格式","description":"\bBlackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。","date":"2020-07-16T00:00:00.000Z","tags":[],"readingTime":12.29,"hasTruncateMarker":false,"authors":[{"name":"Axlgrep","title":"Pika 开源社区"}],"frontMatter":{"title":"Pika Blackwidow 引擎数据存储格式","slug":"pika-blackwidow","authors":[{"name":"Axlgrep","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"},"nextItem":{"title":"pika_port 迁移工具","permalink":"/blog/Pika-Tools-Port-Bin"}},"content":"\bBlackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。\n\n![pika-blackwidow-1](pika-blackwidow-1.png)\n\n## 1. String结构的存储\nString本质上就是Key, Value, 我们知道Rocksdb本身就是支持kv存储的, 我们为了实现Redis中的expire功能,所以在value后面添加了4 Bytes用于存储timestamp, 作为最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n\n![pika-blackwidow-2](pika-blackwidow-2.png)\n\n如果我们没有对该String对象设置超时时间,则timestamp存储的值就是默认值0, 否则就是该对象过期时间的时间戳, 每次我们获取一个String对象的时候, 首先会解析Value部分的后四字节, 获取到timestamp做出判断之后再返回结果。\n\n## 2. Hash结构的存储\nblackwidow中的hash表由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是hash表的一些信息, 比如说当前hash表的域的数量以及当前hash表的版本号和过期时间(用做秒删功能), 而普通数据主要就是指的同一个hash表中一一对应的field和value,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n1. 每个hash表的meta_key和meta_value的落盘方式:\n![pika-blackwidow-3](pika-blackwidow-3.png)\n\nmeta_key实际上就是hash表的key, 而meta_value由三个部分构成: 4Bytes的Hash size(用于存储当前hash表的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Hash表设置的超时时间的时间戳, 默认为0)\n\n2. hash表中data_key和data_value的落盘方式:\n![pika-blackwidow-4](pika-blackwidow-4.png)\n\ndata_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + Field的内容, 而data_value就是hash表某个field对应的value。\n\n3. 如果我们需要查找一个hash表中的某一个field对应的value, 我们首先会获取到meta_value解析出其中的timestamp判断这个hash表是否过期, 如果没有过期, 我们可以拿到其中的version, 然后我们使用key, version,和field拼出data_key, 进而找到对应的data_value(如果存在的话)\n\n## 3. List结构的存储\nblackwidow中的list由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是list链表的一些信息, 比如说当前list链表结点的的数量以及当前list链表的版本号和过期时间(用做秒删功能), 还有当前list链表的左右边界(由于nemo实现的链表结构被吐槽lrange效率低下,所以这次blackwidow我们底层用数组来模拟链表,这样lrange速度会大大提升,因为结点存储都是有序的), 普通数据实际上就是指的list中每一个结点中的数据,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式\n1. 每个list链表的meta_key和meta_value的落盘方式:\n![pika-blackwidow-5](pika-blackwidow-5.png)\n\nmeta_key实际上就是list链表的key, 而meta_value由五个部分构成: 8Bytes的List size(用于存储当前链表中总共有多少个结点) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个List链表设置的超时时间的时间戳, 默认为0) + 8Bytes的Left Index(数组的左边界) + 8Bytes的Right Index(数组的右边界)\n\n2. list链表中data_key和data_value的落盘方式:\n![pika-blackwidow-6](pika-blackwidow-6.png)\n\ndata_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Index(这个记录的就是当前结点的在这个list链表中的索引), 而data_value就是list链表该node中存储的值\n\n## 4. Set结构的存储\nblackwidow中的set由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是set集合的一些信息, 比如说当前set集合member的数量以及当前set集合的版本号和过期时间(用做秒删功能), 普通数据实际上就是指的set集合中的member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n1. 每个set集合的meta_key和meta_value的落盘方式:\n![pika-blackwidow-7](pika-blackwidow-7.png)\n\nmeta_key实际上就是set集合的key, 而meta_value由三个部分构成: 4Bytes的Set size(用于存储当前Set集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个set集合设置的超时时间的时间戳, 默认为0)\n\n2. set集合中data_key和data_value的落盘方式:\n![pika-blackwidow-8](pika-blackwidow-8.png)\n\ndata_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, 由于set集合只需要存储member, 所以data_value实际上就是空串\n\n## 5. ZSet结构的存储\nblackwidow中的zset由两部部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是zset集合的一些信息, 比如说当前zset集合member的数量以及当前zset集合的版本号和过期时间(用做秒删功能), 而普通数据就是指的zset中每个member以及对应的score, 由于zset这种数据结构比较特殊,需要按照memer进行排序,也需要按照score进行排序, 所以我们对于每一个zset我们会按照不同的格式存储两份普通数据, 在这里我们称为member to score和score to member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n1. 每个zset集合的meta_key和meta_value的落盘方式:\n![](https://i.imgur.com/RhZ8KMw.png)\n\nmeta_key实际上就是zset集合的key, 而meta_value由三个部分构成: 4Bytes的ZSet size(用于存储当前zSet集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Zset集合设置的超时时间的时间戳, 默认为0)\n\n2. 每个zset集合的data_key和data_value的落盘方式(member to score):\n![](https://i.imgur.com/C85Ba5Z.png)\n\nmember to socre的data_key由四个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, data_value中存储的其member对应的score的值,大小为8个字节,由于rocksdb默认是按照字典序进行排列的,所以同一个zset中不同的member就是按照member的字典序来排列的(同一个zset的key size, key, 以及version,也就是前缀都是一致的,不同的只有末端的member).\n\n3. 每个zset集合的data_key和data_value的落盘方式(score to member):\n![](https://i.imgur.com/QV9XHEk.png)\n\nscore to member的data_key由五个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Score + member的内容, 由于score和member都已经放在data_key中进行存储了所以data_value就是一个空串,无需存储其他内容了,对于score to member中的data_key我们自己实现了rocksdb的comparator,同一个zset中score to member的data_key会首先按照score来排序, 在score相同的情况下再按照member来排序\n\n\n## Blackwidow相对于Nemo有哪些优势\n\n1. Blackwidow采用了rocksdb的column families的新特性,将元数据和实际数据分开存放(对应于上面的meta数据和data数据), 这种存储方式相对于Nemo将meta, data混在一起存放更加合理, 并且可以提升查找效率(比如info keyspace的效率会大大提升)\n2. Blackwidow中参数传递大量采用Slice而Nemo中采用的是std::string, 所以Nemo会有很多没有必要的string对象的构造函数以及析构函数的调用,造成额外的资源消耗,而Blackwidow则不会有这个问题\n3. Blackwidow对kv模拟多数据结构的存储格式上做了重新设计(具体可以参考Nemo引擎数据存储格式和本篇文章),使之前在Nemo上出现的一些无法解决的性能问题得以解决,所以Blackwidow的多数据结构在某些场景下性能远远优于Nemo\n4. 原来Nemo对多数据结构的Key的长度最大只能支持到256 Bytes,而Blackwidow经过重新设计,放开了多数据结构Key长度的这个限制\n5. Blackwidow相对于Nemo更加节省空间,Nemo由于需要nemo-rocksdb的支持,所以不管在meta还是data数据部分都追加了version和timestamp这些信息,并且为了区分meta_key和data_key, 在最前面加入s和S(拿Set数据结构打比方),Blackwidow在这方面做了优化,使同样的数据量下Blackwidow所占用的空间比Nemo要小(举个例子,Blackwidow中List结构中的一个Node就比Nemo中的一个Node节省了16 Bytes的空间)\n6. Blackwidow在锁的实现上参照了RocksDB事务里锁的实现方法,而弃用了之前Nemo的行锁,所以在多线程对同一把锁有抢占的情况下性能会有所提升"},{"id":"Pika-Tools-Port-Bin","metadata":{"permalink":"/blog/Pika-Tools-Port-Bin","source":"@site/blog/2020-04-26-Pika-Tools-Port-Bin.md","title":"pika_port 迁移工具","description":"项目作者:","date":"2020-04-26T00:00:00.000Z","tags":[],"readingTime":2.56,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"Pika 开源社区"}],"frontMatter":{"title":"pika_port 迁移工具","slug":"Pika-Tools-Port-Bin","authors":[{"name":"于雨","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Pika Blackwidow 引擎数据存储格式","permalink":"/blog/pika-blackwidow"}},"content":"## 项目作者:\n[AlexStocks](https://github.com/alexstocks)\n\n## 适用版本:\n3.1 和 2.x\n\n## 项目地址:\n[https://github.com/ipixiu/pika-tools](https://github.com/ipixiu/pika-tools)\n\n[https://github.com/Axlgrep/pika-tools 长期维护地址需自行编译](https://github.com/Axlgrep/pika-tools)\n\n## 二进制包:\n[https://github.com/ipixiu/pika-port-bin](https://github.com/ipixiu/pika-port-bin)\n\n## 功能:\n将Pika中的数据在线迁移到Pika、Redis(支持全量、增量同步)\n\n## 开发背景:\n之前Pika项目官方提供的pika_to_redis工具仅支持离线将Pika的DB中的数据迁移到Pika、Redis, 且无法增量同步,该工具可以直接伪装为一个Pika的从库,将主库数据通过同步获取并转发给Pika、Redis,同时并支持增量同步\n\n\n## 实现:\n### trysync线程\n1. 尝试与主库建立同步关系 \n2. 如果需要全同步,则在接收到master的db之后,启动migrator和sender线程将db里面的数据发送给Pika、Redis \n3. 启动Slaveping线程定期给主库发送心跳,完成建立主从关系\n\n### binlog_receiver线程\n1. 接收主库发送过来的binlog并且将其解析成redis命令\n2. 将redis命令转发给Pika、Redis\n\n### migrator线程\n1. 扫描不同数据类型的分库\n2. 将key进行解析成响应数据Pika、redis指令\n3. 将解析好的redis指令加载到sender的发送buf中\n\n### sender线程\n1. 从发送buf中读取数据,以非阻塞方式向Pika、redis发送数据\n2. 接收Pika、redis返回的结果并解析,如果出现错误则显示错误结果\n\n## 使用帮助:\n```\nUsage: \n pika_port [-h] [-t local_ip -p local_port -i master_ip -o master_port\n -m forward_ip -n forward_port -x forward_thread_num -y forward_passwd]\n -f filenum -s offset -w password -r rsync_dump_path -l log_path\n -h -- show this help\n -t -- local host ip(OPTIONAL default: 127.0.0.1)\n -p -- local port(OPTIONAL)\n -i -- master ip(OPTIONAL default: 127.0.0.1)\n -o -- master port(REQUIRED)\n -m -- forward ip(OPTIONAL default: 127.0.0.1)\n -n -- forward port(REQUIRED)\n -x -- forward thread num(OPTIONAL default: 1)\n -y -- forward password(OPTIONAL)\n -f -- binlog filenum(OPTIONAL default: local offset)\n -s -- binlog offset(OPTIONAL default: local offset)\n -w -- password for master(OPTIONAL)\n -r -- rsync dump data path(OPTIONAL default: ./rsync_dump)\n -l -- local log path(OPTIONAL default: ./log)\n -b -- max batch number when port rsync dump data (OPTIONAL default: 512)\n -d -- daemonize(OPTIONAL)\n example: ./pika_port -t 127.0.0.1 -p 12345 -i 127.0.0.1 -o 9221 -m 127.0.0.1 -n 6379 -x 7 -f 0 -s 0 -w abc -l ./log -r ./rsync_dump -b 512 -d\n```"}]}} \ No newline at end of file +{"archive":{"blogPosts":[{"id":"PikiwiDB-Pika--4.0.0","metadata":{"permalink":"/blog/PikiwiDB-Pika--4.0.0","source":"@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md","title":"What's new in PikiwiDB(Pika) v4.0.0","description":"尊敬的社区成员及技术爱好者们:","date":"2024-07-08T00:00:00.000Z","tags":[],"readingTime":17.605,"hasTruncateMarker":false,"authors":[{"name":"360 车金鸽","title":"Pika 开源社区"}],"frontMatter":{"title":"What's new in PikiwiDB(Pika) v4.0.0","slug":"PikiwiDB-Pika--4.0.0","authors":[{"name":"360 车金鸽","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"What's new in PikiwiDB(Pika) v3.5.4","permalink":"/blog/Pika-3.5.4"}},"content":"尊敬的社区成员及技术爱好者们:\n\nPikiwiDB 社区荣耀地宣告 —— 经过 9 个月打磨并在生产环境稳定运行 5 个月的 PikiwiDB (Pika) v4.0.0 【下文简称 Pika】今天正式发布。希望基于第三代存储引擎 Floyd 的这个新版本能为社区用户们带来更卓越的体验。\n\n# **1 重大改进**\n\n## **1.1 第三代存储引擎 Floyd**\n\nFloyd 如同其前代 Blackwidow,基于 RocksDB,不仅支持基础的 String 结构,也原生支持了 Hash、List、Set、Stream 及 ZSet 等 KKV 形式的复合数据结构。\n\n- **RocksDB 实例数可配置**\n\n摒弃了 Blackwidow 按数据类型采用 RocksDB 实例的物理隔离模式,Floyd 采用了 RocksDB 的 Column-Family 虚拟隔离机制,在单个 RocksDB 实例下可存储所有类型的数据。\n\n用户可自由设定 Pika 实例中每个 DB【等同于 Redis DB】中 RocksDB 实例的数量,而数据的存储则依据 key 的 hash 值分配至相应的 RocksDB 实例,减小了数据的空间放大和读放大效应,实现了机器资源的高效利用。\n\n- **强类型 key**\n\n![](https://private-user-images.githubusercontent.com/73943232/333059521-afa8a2bf-cebf-481f-a370-deaf4386b46b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1MjU4NzYsIm5iZiI6MTcyMDUyNTU3NiwicGF0aCI6Ii83Mzk0MzIzMi8zMzMwNTk1MjEtYWZhOGEyYmYtY2ViZi00ODFmLWEzNzAtZGVhZjQzODZiNDZiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzA5VDExNDYxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTlkMzcyYWU4NzI4ZDkyYjliZTg3NjM1YTI4ZjhlMzUwMDlmYWJmYzMzZTJkMzY4ZTYwMzk2NGJiNDhkNDc0ZWImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.FHMEJbqfdxgE3asbq8neuN4SMyDpyZHlpRSNy7JH1Zo)\n\n基于 RocksDB 的 Column-Family 虚拟隔离机制,Floyd 把所有类型的 key 和 string 一起存储在 Column-Family 0。\n\n在此存储基础之上,不同于 Blackwidow,可明确禁止不同类型的 key 重复【强类型】,这一设计旨在杜绝潜在的数据冗余与不一致性,与 Redis 服务特性保持一致,进一步提升了系统的整体效率与数据质量。\n\nPika v2.x 系列版本基于存储引擎 Nemo,v3.x 系列版本基于 Blackwidow,它们因为采用了物理隔离机制,无法低成本实现强类型 key,所有在 Redis TYPE 命令的结果中可能返回多种类型,而 Floyd 则完全兼容 Redis 只返回一种类型。\n\n- **Floyd 详细说明**\n\n如果对 Floyd 存储引擎感兴趣,请详阅《Floyd 存储引擎》\n\n【链接:https://github.com/OpenAtomFoundation/pika/discussions/2052】\n\n由于 Floyd 前后进行了多个版本的迭代,所以阅读该 github discussion 文档时请注意前后时间,如有相关冲突性说法,以最新日期的文字为准。\n\n关键 PR:\nPikiwiDB(Pika) 支持 Floyd 存储引擎\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2413\n\n添加 Floyd 的 compaction-filter 的 Gtest\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\n\nPika 不支持不同类型的重复 key, 写入重复 key 返回非法类型\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2609\n\n对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操作与 String 操作明确区分开\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2720\n\n添加支持分区索引过滤的功能\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2601\n\n## **1.2 Mget 批量查询缓存**\n\nPika v3.5.2 的热数据缓存只实现了对热点 Key 的点查 (如 get/hget),在后续的 v3.5.3 和 v3.5.4 修复若干 bug 后,对热数据的点查目前已经非常稳定。然而并未支持批量查询 (如 mget etc)。\n\n内部业务侧反馈批量查询速度比较慢,在 40C/256GiB/2TiB SATA SSD 规格机器上数据量超过 100GiB 时,Pika v3.3.6 30% 批量查询延迟超过 35ms。但由于 Pika 热数据缓存尚未支持批量查询,性能并未改善。\n\n为了满足业务需求,Pika 团队开发了批量查询热数据缓存功能,显著提升了批量查询性能,降低了查询延迟和失败率。相关技术细节请阅读《PikiwiDB (Pika) 混合存储之批量查询》 \n\n【链接:https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ 】。\n\n\n\n关键 PR :\n\nMget 支持多 key 查询缓存,记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2675\n\n修复 Mget 没有使用解析 ttl 的函数导致出现部分 key 的 ttl 未被更新,数据不一致的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2730\n\n\n## **1.3 主从复制**\n\nPika v3.3.6 有很多主从复制的缺陷。v4.0.0 版本对 Pika 全量复制及增量复制进行了大量优化和 bug 修复,取得了非常好的效果。 \n\n并在 info 命令中输出了 \"repl_connect_status\" 指标 (PR 2638),以方便用户更加明确清晰的确定当前的主从复制状态。\n\n关键 PR :\n\n修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2746\n\n修复 Spop 在写 binlog 时可能会出现竞态问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2647\n\n修复多 DB 下全量同步超时后不重试的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2667\n\n修复多 DB 主从超时场景下,可能会出现窗口崩溃的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2666\n\n修复主从同步限速逻辑中重复解锁的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2657\n\n重构主从复制模式 slave 节点的主从同步线程模型,尽可能减少 binlog 消费阻塞问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2638\n\n## **1.4 Redis Stream**\n\nRedis Stream 类似于消息队列(MQ),以便更安全地传递消息。\n\n为了确保数据的安全性,底层引擎 BlackWidow 和 Floyd 中特别添加了对 Stream 数据类型的支持。\n\n关键 PR: \n\n修复 pkpatternmatchdel 命令使用错误导致的 stream 类型数据删除异常的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2726\n\n修复 Keyspace 命令未计算 Stream 类型数据的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2705\n\n## **1.5 Compaction**\n\nPikiwiDB (Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB (Pika) 的读写性能。\n\n因此,控制好 compaction 是优化 Pika 读写性能的关键。\n\nFloyd 使用了 v8.7.3 版本的 RocksDB,开放了更多 RocksDB 参数,以方便用户优化 RocksDB 性能:\n\n1. enable-partitioned-index-filters: 支持加载分区索引过滤器,加快 RocksDB 查找速度。\n2. min-write-buffer-number-to-merge: 默认值为 1,如果将此值设置得更大,意味着需要更多的写缓冲区被填满后才进行 flush。这样可以减少 flush 的频率,增加数据在内存中的累积量,从而可能提高写入吞吐量。\n3. level0-stop-writes-trigger: 默认值为 36,定义了 L0 层中 sst 文件的最大数量,一旦达到这个数量,RocksDB 将会采取 **暂停写入、强制 compaction** 等措施来防止写入操作继续累积,以避免 L0 层变得过于庞大,进而可能导致写入放大、查询性能下降等问题。\n4. level0-slowdown-writes-trigger:默认值为 20,用于控制当 Level 0 的 SST 文件数量达到这个阈值时,触发写减速(write slowdown),防止 Level 0 的文件数量过多,导致后续 compaction 操作的压力过大。\n5. level0-file-num-compaction-trigger:默认值为 4,当 Level 0 的 SST 文件数量达到这个参数设定的阈值时,RocksDB 会开始执行 compaction 操作,将 Level 0 的文件合并到 Level 1,以减少 Level 0 的文件数量,降低读取延迟,并优化存储空间的利用率。\n6. max-subcompactions:默认值为 1,用于控制 RocksDB 中并发执行的 sub-compaction 任务数量,其值为 1 表示关闭 sub-compaction。如果系统资源充足,建议提升该参数以优化 compaction 效率。\n7. max-bytes-for-level-base:指定了 L1 SST 文件总的大小。这个大小是 RocksDB 进行数据分层管理和 compaction 决策的重要依据:如果 L1 层的大小设置得太小,可能会导致 L0 层的 compaction 过于频繁,进而影响写性能。反之,如果设置得太大,可能会占用较多的磁盘空间,并且影响读取性能,因为读取操作可能需要跨越更多的层级。Pika 没有在 pika.conf 中开放此参数给用户配置,而是使用其他参数(**level0-file-num-compaction-trigger** 和 **write-buffer-size**)计算后的结果。\n\n```\nstorage_options_.options.max_bytes_for_level_base = g_pika_conf->level0_file_num_compaction_trigger() * g_pika_conf->write_buffer_size()\n```\n\n关键 PR:\n添加 Floyd 的 compaction-filter 的 Gtest\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\n添加支持分区索引过滤的功能\nhttps://github.com/OpenAtomFoundation/pika/pull/2601\n新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗\nhttps://github.com/OpenAtomFoundation/pika/pull/2538\n\n## **1.6 可观测性**\n\nv3.5 版本增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标,但是在集群方面的可观测性是缺失的。v4.0.0 对 Codis-Proxy 的 P99、P999、延迟等监控指标进行采集和展示,可以直观地反映线上 Codis-proxy 的运行情况。\n\nv4.0.0 开始还提供新的工具:根据 pika benchmark 工具压测结果自动生成可视化的统计图表。\n\n关键 PR:\n\nCodis 支持 info 命令,可以通过该命令查询 Codis-proxy 的 info 信息\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2688\n\nCodis-proxy 新增 P99 P95 等监控耗时指标\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2668\n\n添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2663\n\n## **1.7 测试集**\n\nPikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。v4.0.0 中丰富了诸多特性的 go test 功能,并进一步完善了基本数据类型的 TCL 测试。\n\n关键 PR:\n\n添加 Floyd 的 compaction-filter 的 Gtest\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\n\nPika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2753\n\n## **1.8 跨平台** \n\nPikiwiDB(Pika) 以往仅支持 centos 和 ubuntu 等 linux 平台,v3.5 开始支持 Mac 等平台。v4.0.0 将对 Mac 平台的支持扩展至 FreeBSD 平台。\n\n关键 PR:\n\nPika 支持在 FreeBSD14 平台上进行编译\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2711\n\n# **2 改进列表**\n\n下面详细列出了本次发版的主要功能升级和改进。\n\n## **2.1 新特性**\n\n- Pika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷 \n https://github.com/OpenAtomFoundation/pika/pull/2753\n\n- Pika 支持在 FreeBSD14 平台上进行编译打包 \n https://github.com/OpenAtomFoundation/pika/pull/2711\n\n- Pika 线程整理,避免启动过多无用线程,对不同的线程进行命名,方便问题定位 \n https://github.com/OpenAtomFoundation/pika/pull/2697\n\n- Mget 支持多 key 查询缓存,记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能 \n https://github.com/OpenAtomFoundation/pika/pull/2675\n\n- Codis 支持 info 命令,可以通过该命令查询 Codis-proxy 的 info 信息 \n https://github.com/OpenAtomFoundation/pika/pull/2688\n\n- 添加 Floyd 的 compaction-filter 的 Gtest \n https://github.com/OpenAtomFoundation/pika/pull/2669\n\n- Codis-proxy 新增 P99 P95 等监控耗时指标 \n https://github.com/OpenAtomFoundation/pika/pull/2668\n\n- 添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表 \n https://github.com/OpenAtomFoundation/pika/pull/2663\n\n- Pika 主从复制新增监控指标 repl_connect_status, 可以更加明确清晰的确定当前的主从复制的状态 \n https://github.com/OpenAtomFoundation/pika/pull/2638\n\n- Pika 不支持不同类型的重复 key, 写入重复 key 返回非法类型 \n https://github.com/OpenAtomFoundation/pika/pull/2609\n\n- 添加支持分区索引过滤的功能 \n https://github.com/OpenAtomFoundation/pika/pull/2601\n\n- Pika 支持第三代存储引擎 Floyd, 通过支持多 rocksdb 实例、对 Blob 的使用进行优化、对过期数据的清理进行优化,提升了 Pika 实例的读写性能 \n https://github.com/OpenAtomFoundation/pika/pull/2413\n\n\n## **2.2 bug 修复**\n\n- 修复 iter 未被析构,导致 pkpatternmatchdel 在返回之前不会删除 iter,这可能会导致 rocksdb 永远引用一个版本,导致数据不符合预期的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2785\n\n- 修复 config 参数 min-blob-size 带单位时解析错误的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2767\n\n- 修复 zverank 返回值异常的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2673\n\n- 修复 Pika-port 传输数据过程中报错的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2758\n\n- 修复因为堆上分配的缓冲区越界导致 Dbsize 命令运行时崩溃的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2749\n\n- 修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2746\n\n- 修复参数未初始化导致 slotsscan 等命令不能和 bgsave 命令相互制衡的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2745\n\n- 修复 Slotmigrate 迁移数据的过程中,返回值设置错误,异常场景下会终止数据迁移的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2741\n\n- 修复 Mget 没有使用解析 ttl 的函数导致出现部分 key 的 ttl 未被更新,数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2730\n\n- 修复 pkpatternmatchdel 命令使用错误导致的 stream 类型数据删除异常的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2726\n\n- 修复 pkpatternmatchdel 不能正确删除掉对应的 keys 的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2717\n\n- 修复 ACL 密码验证错误问题 \n https://github.com/OpenAtomFoundation/pika/pull/2714\n\n- 修复 Keyspace 命令未计算 Stream 类型数据的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2705\n\n- 对部分命令定制化处理逻辑,避免写 binlog 导致从节点的 binlog 解析失败的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2793\n\n- 修复 Pika cmdID 赋值在 Cmd 初始函数中,可能会导致并发构造的时候出现内存泄漏的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2692\n\n- 修复 ExpectedStale 未考虑 String 类型,如果存在已经过期的 String 类型的 key, ExpectedStale 会返回错误的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2682\n\n- 修复 Spop 在写 binlog 时可能会出现竞态问题 \n https://github.com/OpenAtomFoundation/pika/pull/2674\n\n- db instance 设置不合理时,给用户错误提示 \n https://github.com/OpenAtomFoundation/pika/pull/2672\n\n- 修复 server_stat 中的数据竞态问题 \n https://github.com/OpenAtomFoundation/pika/pull/2671\n\n- 修复多 DB 下全量同步超时后不重试的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2667\n\n- 修复多 DB 下全量同步超时后不重试的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2666\n\n- 修复主从同步限速逻辑中重复解锁的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2657\n\n- 发版支持自动打包 centos7 和 centos8 平台的二进制编译包 \n https://github.com/OpenAtomFoundation/pika/pull/2535\n\n- 修复 Codis 侧的 getrange 命令没有返回预期结果的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2510\n\n## **2.3 提升改进项**\n\n- 更新 Pika Docker Readme, 可以按照 Readme 在 Docker 中部署 Pika 服务 \n https://github.com/OpenAtomFoundation/pika/pull/2743\n\n- 优化重复查询 meta value 导致影响 Pika 服务读写性能的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2735\n\n- 支持对更多的 RocksDB 参数进行动态调整,用户根据不同的业务使用场景调整参数提升 Pika 的读写性能 \n https://github.com/OpenAtomFoundation/pika/pull/2728\n\n- 对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操作与 String 操作明确区分开 \n https://github.com/OpenAtomFoundation/pika/pull/2720\n\n- 更新了 PR 标题验证,不允许在标题末尾出现中文字符 \n https://github.com/OpenAtomFoundation/pika/pull/2718\n\n- 重构主从复制模式 slave 节点的主从同步线程模型,尽可能减少 binlog 消费阻塞问题 \n https://github.com/OpenAtomFoundation/pika/pull/2638\n\n- 新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗 \n https://github.com/OpenAtomFoundation/pika/pull/2538\n\n## 2.4 发版 tag\n\n​ https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0\n\n# **3 社区**\n\n感谢所有为 v4.0.0 做出贡献的社区成员,包括 issue/PR 提交者、代码 reviewer 【排名不分先后,依据字母序列】:\n\n- AlexStocks\n- baerwang\n- chejinge\n- cheniujh\n- chienguo\n- guangkun123\n- gukj-spel\n- longfar-ncy\n- lqxhub\n- luky116\n- Mixficsol\n- saz97\n- wangshao1\n\nPikiwiDB (Pika) 开源社区热烈欢迎您的参与和支持。如果您有任何问题、意见或建议,请扫码添加 PikiwiDB 小助手【微信号: PikiwiDB】为好友,它会拉您加入官方微信群。"},{"id":"Pika-3.5.4","metadata":{"permalink":"/blog/Pika-3.5.4","source":"@site/blog/2024-05-16-Pika-3.5.4.md","title":"What's new in PikiwiDB(Pika) v3.5.4","description":"PikiwiDB (Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。","date":"2024-05-16T00:00:00.000Z","tags":[],"readingTime":6.53,"hasTruncateMarker":false,"authors":[{"name":"陈俊华","title":"360"}],"frontMatter":{"title":"What's new in PikiwiDB(Pika) v3.5.4","slug":"Pika-3.5.4","authors":[{"name":"陈俊华","title":"360"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in PikiwiDB(Pika) v4.0.0","permalink":"/blog/PikiwiDB-Pika--4.0.0"},"nextItem":{"title":"What's new in Pika v3.5.3 (英文版本)","permalink":"/blog/Pika-3.5.3-en"}},"content":"PikiwiDB (Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。\n\nv3.5.4 解决了历史遗留的 bug,对 PikiwiDB (Pika) 的一些遗留 bug 进行修复和优化,旨在打造出一个高稳定性的版本。本次的重点优化主要包括,PikiwiDB (Pika) 支持动态调整限速参数、增强 PikiwiDB (Pika) 的客观测性指标、 磁盘 IO 限速支持读限速及写限速等。\n\n## 1 新特性\n\n1. Pika 支持动态调整全量同步限速参数 rsync-timeout-ms 和 throttle-bytes-per-second。\n\n自 v3.5.0 版本开始,PikiwiDB (Pika) 服务摒弃了通过子进程内使用原来 rsync 工具进行主从全量同步的逻辑,在 PikiwiDB (Pika) 内部以线程方式【称作 rsync 线程】自行实现了新的全量同步逻辑,避免因为外部进程不可控引起的主从同步问题,根据 360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB (Pika) 主从进行全量同步的过程中,如果遇到某些不利的外部因素,如网络波动,硬件故障(如网卡降速导致的主从网卡速率不匹配)等,可能引起 rsync 线程请求持续超时(PikiwiDB (Pika) 内置 rsync 模块用于全量同步阶段的文件传输),且超时重试所发出的包可能引发更大的网络信道负担。此时对于运维人员来说,如果能动态调整 rsync 请求的超时时间和 rsync 传输的速率上限,不仅意味着对全量同步阶段控制粒度的进一步细化,更大大降低了在该场景下的运维处置难度。\n\n关键 PR:\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2633\n\n2. 将 info key space 1 的结果输出至 info all 并展示到监控界面中。\n\nPikiwiDB (Pika) 是通过 Info 命令采集数据至 Pika-Exporter,展示到 Grafana 界面上的,目前界面上部分数据是没有展示的,如 keys 的数量,本次将执行 info keyspace 的结果展示到监控界面,用户可以通过这个指标来查看存储的量级等。\n\n关键 PR:\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2603\n\n3.Pika 磁盘 IO 限速参数支持 OnlyRead、OnlyWrite、ReadAndWrite,默认支持 OnlyWrite。\n\n自 3.5.0 版本开始,PikiwiDB(Pika) 服务可以通过调整 rate-limit 参数实现写限速,防止在网卡质量不高的情况下磁盘 IO 过重导致服务不可用,或者 binlog 阻塞的情况发生。360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB (Pika) 实例的网卡较差情况下,也需要对读实例进行限速,本次修改支持读、写限速,默认是写限速,调整 config 配置中的 rate-limiter-mode 可以设置为读限速,或者同时读写限速。\n\n关键 PR:\n\n- https://github.com/OpenAtomFoundation/pika/pull/2599\n\n2 改进列表\n\n- slotmigrate 添加 go test。\n\n https://github.com/OpenAtomFoundation/pika/pull/2576\n\n- INFO 命令耗时优化,降低查磁盘频率,避免因为数据采集调用 info 命令时查磁盘太过频繁导致服务性能下降。\n\n https://github.com/OpenAtomFoundation/pika/pull/2554\n\n- 对五种基本数据类型命令增加 Redis tcl 测试。\n\n https://github.com/OpenAtomFoundation/pika/pull/2527\n\n3 Bug 修复\n\n- 修复使用 Pika Exporter 时可能会出现 slots 分配不均衡的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2651\n\n- 修复 Codis dashboard 不能正确更新 master 实例状态的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2650\n\n- 修复 Redis 事务 binlog 解析失败导致的主从同步异常问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2642\n\n- 修复 Pika Expoter 启动时不带参数导致启动失败问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2640\n\n- 修复使用 Pika Operater 拉起集群 Codis-proxy panic 的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2633\n\n- 修复 CI 编译出的二进制进行自动化测试时 cp 命令失败问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2614\n\n- 修复变量未初始化导致 cache 启动失败的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2613\n\n- 修复 userpass 和 userblacklist 动态修改参数功能异常问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2600\n\n- 修复 scard sscan 结果不一致的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2596\n\n- 修复当 max-rsync-parallel-num 大于 4,slave 会在主从复制时 coredump 的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2595\n\n- 调整不常用的线程池线程数,避免因为空跑导致性能损耗。\n\n https://github.com/OpenAtomFoundation/pika/pull/2590\n\n- 修复 Pika 事务边缘测试 case 不通过的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2586\n\n- 将 cache-model 修改成 cache-mode。\n\n https://github.com/OpenAtomFoundation/pika/pull/2585\n\n- 修复使用 info keyspace 后,info all 死锁的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2584\n\n- 修复因修改 zsetscorekey comparator impl 字典序比较熟顺序,导致 353 352 极端场景不兼容的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2583\n\n- 修复 compact 死锁的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2581\n\n- Slotmigrate 添加 go test。\n\n https://github.com/OpenAtomFoundation/pika/pull/2576\n\n- 更新 Pika Operater 使用的 pika 版本。\n\n https://github.com/OpenAtomFoundation/pika/pull/2572\n\n- 修复 config rewrite 后 blockcache 数值异常的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2561\n\n- 修复 slotmigrate 动态修复后值错误的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2548\n\n- 修复 spop 可能会出现主从数据不一致的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2541\n\n- 修复 CloseFd (it->second [i]) 出现越界的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2539\n\n- 修复 Flushall 和 FlushDB 死锁的隐患,并删除 FlushSubDB 接口。\n\n https://github.com/OpenAtomFoundation/pika/pull/2533\n\n- 增加参数控制是否清理 tcl 测试后产生的数据文件,防止废弃数据占据磁盘。\n\n https://github.com/OpenAtomFoundation/pika/pull/2507\n\n4 社区\n\nPikiwiDB (Pika) 开源社区热烈欢迎您的参与和支持。如果您有任何问题、意见或建议,可通过以下渠道联系我们:\n\n![图片](data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='1px' height='1px' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' fill-opacity='0'%3E%3Cg transform='translate(-249.000000, -126.000000)' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)\n\n\n![img](https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=Mzg4MTY2ODA1MQ==&mid=2247483978&idx=1&sn=b56b42fb857f2ef6cc4c57b18f205e92&send_time=)\n\n微信扫一扫\n关注该公众号"},{"id":"Pika-3.5.3-en","metadata":{"permalink":"/blog/Pika-3.5.3-en","source":"@site/blog/2024-03-27-Pika-3.5.3-en.md","title":"What's new in Pika v3.5.3 (英文版本)","description":"As Redis announces the adoption of dual protocols to maintain its commercial interests, the PikiwiDB (Pika) community is pleased to announce the release of the v3.5.3 stable version for production use today.","date":"2024-03-27T00:00:00.000Z","tags":[],"readingTime":8.965,"hasTruncateMarker":false,"authors":[{"name":"360 中间件团队","title":"Pika 开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.3 (英文版本)","slug":"Pika-3.5.3-en","authors":[{"name":"360 中间件团队","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in PikiwiDB(Pika) v3.5.4","permalink":"/blog/Pika-3.5.4"},"nextItem":{"title":"What's new in Pika v3.5.3 ","permalink":"/blog/Pika-3.5.3"}},"content":"As Redis announces the adoption of dual protocols to maintain its commercial interests, the PikiwiDB (Pika) community is pleased to announce the release of the v3.5.3 stable version for production use today.\n\nThe v3.5.3 version addresses historical bugs and introduces a multitude of new features. These features primarily include Pika's support for ACL, the removal of residual Slot code from the Sharing mode, separation of fast and slow commands, Redis Stream support, large key analysis tools, and Pika's distributed cluster support for fully automated failover, among others. Additionally, we have enriched the automation test cases in version 3.5.3 to enhance the stability and robustness of the Pika service, providing users with a more efficient and stable experience. This article will mainly elaborate on the significant features, bug fixes, and performance improvements in this update.\n\nBefore diving into the main release content of version 3.5.3, please note the following statements:\n\n1. Due to trademark issues, the Pika project has been renamed to PikiwiDB. In this article, we will use PikiwiDB (Pika) to refer to the project at https://github.com/OpenAtomFoundation/pika.\n2. We have created a new project https://github.com/OpenAtomFoundation/pikiwidb, which is a large-capacity KV database compatible with the Redis protocol and based on the Raft protocol. It is mainly designed for scenarios requiring strong consistency, such as storing metadata at a scale of about 10TiB. PikiwiDB will be used to refer to this project specifically.\n\n## 1 Major Improvements\n\n### 1.1 PikiwiDB (Pika) Supports ACL\n\nPikiwiDB (Pika) 3.5.3 now fully supports Redis ACL, laying a solid foundation for future multi-tenant support in cloud-native Pika clusters. Before 3.5.3, Pika already supported Redis user authentication methods such as auth/userpass/requirepass, as well as its own command blacklist mode configured through userblacklist in pika.conf. This update maintains backward compatibility and supports these existing methods.\n\nMoreover, we have integrated all Redis ACL TCL test suites into PikiwiDB (Pika)'s test suite to ensure that PikiwiDB (Pika)'s ACL implementation is fully compatible with Redis ACL.\n\nKey PRs:\n\n- [PikiwiDB (Pika) Supports ACL](https://github.com/OpenAtomFoundation/pika/pull/2013)\n- [Fixes ACL User Authentication Issues](https://github.com/OpenAtomFoundation/pika/pull/2449)\n- [ACL Backward Compatibility with Userblacklist](https://github.com/OpenAtomFoundation/pika/pull/2459)\n- [Adds Redis ACL Test Suites](https://github.com/OpenAtomFoundation/pika/pull/2495)\n\n### 1.2 Hybrid Storage Model Supports Bitmap\n\nIn a single-node environment, it is impossible to simultaneously optimize PikiwiDB (Pika)'s read/write/compaction, which is known as the \"impossible triangle.\" In version v3.5.2, we supported hybrid storage consisting of cached Redis and RocksDB, which supported five data structures: string/list/set/zset/hashtable. In this release, we have added support for bitmap: https://github.com/OpenAtomFoundation/pika/pull/2253\n\nAdditionally, we now support dynamic tuning of Redis cache parameters in version 3.5.3: https://github.com/OpenAtomFoundation/pika/pull/2197\n\n### 1.3 Separation of Fast and Slow Commands\n\nTo prevent slow commands from blocking the execution of fast commands, we have implemented the separation of fast and slow commands at both the Codis-Proxy and PikiwiDB (Pika) levels.\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2162\n\n### 1.4 Redis Stream\n\nWhile PikiwiDB (Pika) previously supported Redis pubsub, which only allowed for online message passing, in version 3.5.3, we have added limited support for Redis Stream, similar to a message queue (MQ), to facilitate safer message transmission. To ensure data safety, we have specifically added support for the Stream data type in our underlying engine, BlackWidow.\n\nKey PR:\n\n- [Pika Supports Redis Stream](https://github.com/OpenAtomFoundation/pika/pull/1955)\n\nPlease note that Pika Stream currently does not support consumer group consumption and will be available in future updates.\n\n### 1.5 Cloud-Native Cluster\n\nIn PikiwiDB (Pika) 3.5.0, we open-sourced a Pika-Operator that supports deploying a pair of Pika master and slave on K8s. In version 3.5.2, based on Kubeblocks, our Pika-Operator supported deploying a Pika Cluster in the form of Codis on K8s, but it did not support dynamic scaling at the time.\n\nIn version 3.5.3, the latest Pika-Operator now supports node scaling at the Codis Group level and data rebalance.\n\nKey PRs:\n\n- [PikiwiDB (Pika) Operator Supports Pika Cluster Auto-Scaling](https://github.com/OpenAtomFoundation/pika/pull/2121)\n- [Optimizes Codis Slot Migration Speed, Supports Dynamic Adjustment of Migration Threads and Speed](https://github.com/OpenAtomFoundation/pika/pull/2486)\n- [Pika-Operator Supports Namespaces, Allows Deploying Different Clusters in Different Namespaces](https://github.com/OpenAtomFoundation/pika/pull/2480)\n- [Pika-Operator Supports Monitoring Metric Collection, Automatically Launches Pika-Exporter](https://github.com/OpenAtomFoundation/pika/pull/2451)\n\n### 1.6 Compaction Improvements\n\nPikiwiDB (Pika)'s underlying disk storage engine, RocksDB, significantly impacts PikiwiDB (Pika)'s read and write performance during compaction, which appears as \"spikes\" in monitoring systems. Controlling compaction is key to optimizing Pika's read and write performance.\n\nKey PRs for compaction improvements:\n\n- [Adds CompactRange Command to Support Compaction of a Specific Range of Keys](https://github.com/OpenAtomFoundation/pika/pull/2163)\n- [Improves Compaction Speed and Reduces Compaction Time](https://github.com/OpenAtomFoundation/pika/pull/2172)\n- [Invokes Disable Compaction When Executing Shutdown Command, Enhances Exit Speed](https://github.com/OpenAtomFoundation/pika/pull/2345)\n\n### 1.7 Automatic Failover\n\nPikiwiDB (Pika) clusters are currently based on Codis. To enhance the usability of PikiwiDB (Pika) Clusters based on Codis, we have made many extensions to Codis.\n\nThe original Codis did not support failover within Groups, requiring the use of Redis Sentinel, which increases operational costs. We have implemented auto failover for Groups within Codis Dashboard by drawing on the functionality of sentinel.\n\nKey PR:\n\n- [PikiwiDB (Pika) Distributed Cluster Supports Automatic Failover](https://github.com/OpenAtomFoundation/pika/pull/2386)\n\n### 1.8 Observability Enhancements\n\nThe key component for PikiwiDB (Pika) observability is Pika-Exporter. Although Redis Cache was added to the 3.5.2 version, it lacked monitoring metrics. In version 3.5.3, we have added metrics such as hit rate, hits per second, Redis Cache memory usage, number of Redis Caches, and number of Redis Cache DBs.\n\nKey PRs:\n\n- [Pika Exporter Exposes Cache-Related Data Collection Metrics](https://github.com/OpenAtomFoundation/pika/pull/2318)\n- [PikiwiDB (Pika) Distributed Cluster Codis Proxy Adds Observable Metrics](https://github.com/OpenAtomFoundation/pika/pull/2199)\n- [Fixes dbsize Calculation Error](https://github.com/OpenAtomFoundation/pika/pull/2494)\n- [Fixes Inaccurate Network Monitoring Metric Statistics](https://github.com/OpenAtomFoundation/pika/pull/2234)\n\n### 1.9 Data Consistency\n\nVersion 3.5.3 fixes numerous PikiwiDB (Pika) master-slave synchronization issues, ensuring data consistency.\n\nKey PRs:\n\n- [Fixes the Logic for Slave Nodes Receiving Exceptional Reply Packets from Masters During Full-Quantity Replication](https://github.com/OpenAtomFoundation/pika/pull/2319)\n- [Fixes Inconsistency Issues Between Cache and DB Data in Certain Scenarios](https://github.com/OpenAtomFoundation/pika/pull/2225)\n- [Fixes Data Loss Issues After Full-Quantity Replication Failure](https://github.com/OpenAtomFoundation/pika/pull/2439)\n- [Adds Data Synchronization Status During Full-Quantity Replication, Clarifying Data Synchronization Progress](https://github.com/OpenAtomFoundation/pika/pull/2430)\n- [Fixes the Issue of No Proper Response to Slave Synchronization Requests During Master Instance bgsave Execution](https://github.com/OpenAtomFoundation/pika/pull/2437)\n- [Fixes Data Inconsistency Issues When Applying Binlog on Slave Instances Without Locking the Operated Key](https://github.com/OpenAtomFoundation/pika/pull/2409)\n- [Fixes Data Inconsistency Issues After Data Migration](https://github.com/OpenAtomFoundation/pika/pull/2485)\n\n### 1.10 Test Suite Additions\n\nThe PikiwiDB (Pika) test suite consists of gtest unit tests, Redis TCL test suites, and Go test suites. In 3.5.3, we have added Codis cluster e2e tests.\n\nKey PRs:\n\n- [Pika TCL Test Suite](https://github.com/OpenAtomFoundation/pika/pull/2497)\n- [Pika Gotest Test Suite](https://github.com/OpenAtomFoundation/pika/pull/2502)\n\n### 1.11 Toolkit Additions\n\nPikiwiDB (Pika) has always valued the construction of toolkits, and all related tools can be found at https://github.com/OpenAtomFoundation/pika/tree/unstable/tools. In 3.5.3, we have added a new tool:\n\n- [PikiwiDB (Pika) Supports Large Key Analysis Tools](https://github.com/OpenAtomFoundation/pika/pull/2195)\n\n### 1.12 Documentation Updates\n\nThe PikiwiDB (Pika) documentation mainly consists of wiki documentation. In 3.5.3, we have updated the documentation for the Redis commands supported by Pika.\n\nDocumentation link: https://github.com/OpenAtomFoundation/pika/wiki/Pika-Supports-Redis-Interface-and-Content-Situation\n\n## 2 Release Improvements\n\nIn the first chapter, we described the main feature upgrades and improvements of version 3.5.3. Below is a detailed list of the relevant PRs for this release.\n\n### 2.1 New Features\n\n- [Pika Supports ACL](https://github.com/OpenAtomFoundation/pika/pull/2013)\n- [During Full-Quantity Replication, Pika Slave Nodes Do Not Accept Read Requests](https://github.com/OpenAtomFoundation/pika/pull/2197)\n- [Removes Residual Slot Code from Sharing Mode, Returns to v3.0, Where One Pika Instance Has Multiple DBs, Each with Only One Blackwidow](https://github.com/OpenAtomFoundation/pika/pull/2251)\n- [Automatically Recovers Service When Codis Dashboard Coroutine Panics](https://github.com/OpenAtomFoundation/pika/pull/2349)\n- [Pika Cache Adds New Bitmap Data Type](https://github.com/OpenAtomFoundation/pika/pull/2253)\n- [Pika Supports Separation of Fast and Slow Commands](https://github.com/OpenAtomFoundation/pika/pull/2162)\n- [Pika Exporter Exposes Cache-Related Data Collection Metrics](https://github.com/OpenAtomFoundation/pika/pull/2318)\n- [Pika Keeps Unix Timepoint After Completing Bgsave](https://github.com/OpenAtomFoundation/pika/pull/2167)\n- [Pika Supports Dynamic Configuration of disable_auto_compations Parameter](https://github.com/OpenAtomFoundation/pika/pull/2257)\n- [Pika Supports Redis Stream](https://github.com/OpenAtomFoundation/pika/pull/1955)\n- [Pika Supports Large Key Analysis Tools](https://github.com/OpenAtomFoundation/pika/pull/2195)\n- [Pika Supports Dynamic Adjustment of Pika Cache Parameters](https://github.com/OpenAtomFoundation/pika/pull/2197)\n- [Updates Pika Benchmark Tool to Support More Interface Pressure Tests](https://github.com/OpenAtomFoundation/pika/pull/2222)\n- [Pika Operator Supports Pika Cluster Auto-Scaling](https://github.com/OpenAtomFoundation/pika/pull/2121)\n- [Adds CompactRange Command to Support Compaction of a Specific Range of Keys](https://github.com/OpenAtomFoundation/pika/pull/2163)\n- [Improves Compaction Speed and Reduces Compaction Time](https://github.com/OpenAtomFoundation/pika/pull/2172)\n- [Upgrades RocksDB Version to v8.7.3](https://github.com/OpenAtomFoundation/pika/pull/2157)\n- [PikiwiDB (Pika) Distributed Cluster Codis Proxy Adds Observable Metrics](https://github.com/OpenAtomFoundation/pika/pull/2199)\n- [PikiwiDB (Pika) Distributed Cluster Supports Automatic Failover](https://github.com/OpenAtomFoundation/pika/pull/2386)\n- [Pika Supports Redis rename-command Feature](https://github.com/OpenAtomFoundation/pika/pull/2455)\n- [Optimizes Codis Slot Migration Speed, Supports Dynamic Adjustment of Migration Threads and Speed](https://github.com/OpenAtomFoundation/pika/pull/2486)\n- [PikiwiDB (Pika) Supports Dynamic Adjustment of max-conn-rbuf-size Parameter](https://github.com/OpenAtomFoundation/pika/pull/2434)\n- [Pika-Operator Supports Namespaces, Allows Deploying Different Clusters in Different Namespaces](https://github.com/OpenAtomFoundation/pika/pull/2480)\n- [Pika-Operator Supports Monitoring Metric Collection, Automatically Launches Pika-Exporter](https://github.com/OpenAtomFoundation/pika/pull/2451)\n- [ACL Backward Compatibility with Userblacklist](https://github.com/OpenAtomFoundation/pika/pull/2459)\n- [Enriches Pika TCL Test Suite](https://github.com/OpenAtomFoundation/pika/pull/2497)\n- [Enriches Pika Gotest Test Suite](https://github.com/OpenAtomFoundation/pika/pull/2502)\n\n### 2.2 Bug Fixes\n\n- [Fixes Issue of Incorrect Deletion of Dump Files During Full-Quantity Replication by Pika Slave Nodes](https://github.com/OpenAtomFoundation/pika/pull/2377)\n- [Fixes the Logic for Slave Nodes Receiving Exceptional Reply Packets from Masters During Full-Quantity Replication](https://github.com/OpenAtomFoundation/pika/pull/2319)\n- [Invokes Disable Compaction When Executing Shutdown Command, Enhances Exit Speed](https://github.com/OpenAtomFoundation/pika/pull/2345)\n- [Fixes Inaccurate Redis Memory Values in Codis-Dashboard](https://github.com/OpenAtomFoundation/pika/pull/2337)\n- [Optimizes INFO Command Latency, Reduces Frequency of Checking Disk Usage](https://github.com/OpenAtomFoundation/pika/pull/2197)\n- [Fixes Issue of Rsync Deleting Temporary Files with Incorrect Path, Leading to Failure in Opening RocksDB](https://github.com/OpenAtomFoundation/pika/pull/2186)\n- [Fixes Issue of Commands Not Specifying DB Name, Leading to Coredump of Some Commands](https://github.com/OpenAtomFoundation/pika/pull/2194)\n- [Uses info replication Command in Codis Dashboard Instead of info Command to Query Master IP, Reducing Performance Impact on Pika](https://github.com/OpenAtomFoundation/pika/pull/2198)\n- [Fixes Inconsistency Issues Between Cache and DB Data in Certain Scenarios](https://github.com/OpenAtomFoundation/pika/pull/2225)\n- [Fixes Issue of Segmentation Fault When Dump Directory is Empty](https://github.com/OpenAtomFoundation/pika/pull/2265)\n- [Fixes Issue of Certain Commands' Cache Not Taking Effect Due to Incorrect Flag Calculation](https://github.com/OpenAtomFoundation/pika/pull/2217)\n- [Fixes Issue of Slave Instances Being Inaccessible Due to Deadlock After Master Instance flushdb in Master-Slave Replication Mode](https://github.com/OpenAtomFoundation/pika/pull/2249)\n- [Fixes Issue of Commands Not Judging the Return Value of RocksDB](https://github.com/OpenAtomFoundation/pika/pull/2187)\n- [Standardizes Function Return Values and Initial Values](https://github.com/OpenAtomFoundation/pika/pull/2176)\n- [Fixes Inaccurate Network Monitoring Metric Statistics](https://github.com/OpenAtomFoundation/pika/pull/2234)\n- [Fixes Issue of Abnormal Parameters When Loading Configuration File](https://github.com/OpenAtomFoundation/pika/pull/2218)\n- [Fixes 100% CPU Usage Issue in Codis Dashboard](https://github.com/OpenAtomFoundation/pika/pull/2393)\n- [Fixes Issue of Abnormal Display of Pika Master-Slave Roles in Codis Front End](https://github.com/OpenAtomFoundation/pika/pull/2387)\n- [Fixes Data Inconsistency Issues After Data Migration](https://github.com/OpenAtomFoundation/pika/pull/2485)\n- [Fixes Issue of Inaccurate Display in Codis-dashboard After Scaling or Pod Start/Stop](https://github.com/OpenAtomFoundation/pika/pull/2475)\n- [Fixes Issue of Repeated Locking at the DB Level](https://github.com/OpenAtomFoundation/pika/pull/2372)\n- [Fixes Issue of Data Loss After Full-Quantity Replication Failure](https://github.com/OpenAtomFoundation/pika/pull/2439)\n- [Fixes Issue of No Proper Response to Slave Synchronization Requests During Master Instance bgsave Execution](https://github.com/OpenAtomFoundation/pika/pull/2437)\n- [Adds Data Synchronization Status During Full-Quantity Replication, Clarifying Data Synchronization Progress](https://github.com/OpenAtomFoundation/pika/pull/2430)\n- [Fixes Issue of No Locking of Operated Key When Applying Binlog on Slave Instances, Leading to Data Inconsistency](https://github.com/OpenAtomFoundation/pika/pull/2409)\n- [Fixes Issue of Master Instance Coredump During Codis Slot Migration](https://github.com/OpenAtomFoundation/pika/pull/2415)\n- [Fixes Issue of Deleting Dump Files in Use During Master-Slave Replication](https://github.com/OpenAtomFoundation/pika/pull/2377)\n- [Fixes Issue of Rsync Response Errors from Slave Instances During Master-Slave Replication](https://github.com/OpenAtomFoundation/pika/pull/2319)\n\n### 2.3 Release Tag\n\n[PikiwiDB (Pika) v3.5.3 Release Tag](https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3)\n\n## 3 Community\n\nIf you have any questions, feel free to join our community discussion group. The PikiwiDB (Pika) open-source community appreciates your support and help.\n\n* telegram https://t.me/+gMlTzNacOF1iMTM1\n* WeChat Assistant \"PikiwiDB\""},{"id":"Pika-3.5.3","metadata":{"permalink":"/blog/Pika-3.5.3","source":"@site/blog/2024-03-27-Pika-3.5.3.md","title":"What's new in Pika v3.5.3 ","description":"随着 Redis 宣布采用双协议以维护其商业利益,PikiwiDB(Pika) 社区非常荣幸地宣布之际,我们的最新 v3.5.3 正式生产可用版本现已发布。","date":"2024-03-27T00:00:00.000Z","tags":[],"readingTime":14.775,"hasTruncateMarker":false,"authors":[{"name":"360 中间件团队","title":"Pika 开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.3 ","slug":"Pika-3.5.3","authors":[{"name":"360 中间件团队","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.3 (英文版本)","permalink":"/blog/Pika-3.5.3-en"},"nextItem":{"title":"What's new in Pika v3.5.2","permalink":"/blog/Pika-3.5.2"}},"content":"随着 Redis 宣布采用双协议以维护其商业利益,PikiwiDB(Pika) 社区非常荣幸地宣布之际,我们的最新 v3.5.3 正式生产可用版本现已发布。\n\nv3.5.3 版本不仅修复了长期存在的 Bug,还引入了一系列新特性。这些新特性包括 Pika 对 ACL 的支持、移除了 Sharing 模式的残留 Slot 代码、命令执行的快慢分离、Redis Stream 支持、大 key 分析工具、以及 Pika 分布式集群的全自动化 failover 等。此外,我们在 3.5.3 版本中增加了更多的自动化测试用例,以提高 Pika 服务的稳定性和健壮性,确保用户能够享受到更高效、更稳定的使用体验。本文将详细介绍本次更新的主要功能、Bug 修复和性能提升。\n\n在深入探讨 3.5.3 版本的更新内容之前,请注意以下几点声明:\n\n1. 由于商标问题,Pika 项目已更名为 PikiwiDB。在本文中,我们将使用 PikiwiDB(Pika) 来指代项目,项目地址为:https://github.com/OpenAtomFoundation/pika\n2. 我们创建了一个新项目 https://github.com/OpenAtomFoundation/pikiwidb,这是一个基于 Raft 协议实现的兼容 Redis 协议的大容量 KV 数据库,主要面向强一致性数据场景,例如存储约 10TiB 规模的元数据。PikiwiDB 将专门用于指代此项目。\n3. 我们为 PikiwiDB 设计了一个新的 logo,作为其商标,并已在相关政府机构注册。\n\n![](https://github.com/OpenAtomFoundation/pikiwidb/blob/unstable/docs/images/pikiwidb-logo.png)\n\n## 1 主要更新\n\n### 1.1 支持 ACL\n\nPikiwiDB(Pika) 3.5.3 版本正式全面支持 Redis ACL,为未来在云原生 Pika 集群中支持多租户场景奠定了基础。在此之前,Pika 已经支持了 Redis 的用户认证方式,如 auth/userpass/requirepass,以及通过 pika.conf 中的 userblacklist 配置命令黑名单模式。本次更新保持了向后兼容,并支持这些已有的使用方式。\n\n我们还确保 PikiwiDB(Pika) 的 ACL 实现与 Redis ACL 完全兼容,通过将 Redis 的所有 ACL TCL 测试集纳入 PikiwiDB(Pika) 的测试集中。\n\n关键 PR 链接:\n\n- [PikiwiDB(Pika) 支持 ACL](https://github.com/OpenAtomFoundation/pika/pull/2013)\n- [修正 ACL 用户认证错误问题](https://github.com/OpenAtomFoundation/pika/pull/2449)\n- [ACL 向前兼容 userblacklist](https://github.com/OpenAtomFoundation/pika/pull/2459)\n- [添加 Redis ACL 测试集](https://github.com/OpenAtomFoundation/pika/pull/2495)\n\n### 1.2 混合存储模型支持 bitmap\n\n在单体环境下,同时优化 PikiwiDB(Pika) 的读/写/compaction 是一项挑战。在 v3.5.2 版本中,我们引入了由缓存 Redis 和 RocksDB 构成的混合存储模型,并支持了 string/list/set/zset/hashtable 五种数据结构。在 3.5.3 版本中,我们增加了对 bitmap 的支持。\n\n此外,我们在 3.5.3 版本中支持对 Redis 缓存进行动态参数调整。\n\n关键 PR 链接:\n\n- [PikiwiDB(Pika) 支持 bitmap](https://github.com/OpenAtomFoundation/pika/pull/2253)\n- [支持对 Redis 缓存进行动态调参](https://github.com/OpenAtomFoundation/pika/pull/2197)\n\n### 1.3 快慢命令分离\n\n为了避免慢命令阻塞快命令的执行,我们在 Codis-Proxy 和 PikiwiDB(Pika) 两个层面实现了快慢命令分离。\n\n关键 PR 链接:\n\n- [实现快慢命令分离](https://github.com/OpenAtomFoundation/pika/pull/2162)\n\n### 1.4 Redis Stream 支持\n\n虽然 PikiwiDB(Pika) 之前支持了 Redis pubsub,但它只能进行在线消息传递。在 3.5.3 版本中,我们增加了对 Redis Stream 的有限支持,类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,我们在底层引擎 BlackWidow 中特别添加了对 Stream 数据类型的支持。\n\n关键 PR 链接:\n\n- [Pika 支持 Redis Stream](https://github.com/OpenAtomFoundation/pika/pull/1955)\n\n请注意,Pika Stream 目前还不支持消费组消费,这将在后续版本中实现。\n\n### 1.5 云原生集群\n\n在 PikiwiDB(Pika) 3.5.0 版本中,我们开源了 Pika-Operator,它支持在 K8s 上部署 Pika 主从对。在 3.5.2 版本中,我们基于 Kubeblocks 的 Pika-Operator 支持了在 K8s 上部署类似 Codis 的 Pika Cluster,但当时还不支持动态扩缩容。\n\n在 3.5.3 版本中,最新的 Pika-Operator 已经支持了 Codis Group 级别的节点扩缩容,并且支持数据的 Rebalance。\n\n关键 PR 链接:\n\n- [Pika-Operator 支持 Pika 集群自动扩容](https://github.com/OpenAtomFoundation/pika/pull/2121)\n- [优化 codis slot 迁移速度,支持动态修改迁移线程和速度](https://github.com/OpenAtomFoundation/pika/pull/2486)\n- [Pika-operator 支持 namespace,可在不同 namespace 下部署不同的集群](https://github.com/OpenAtomFoundation/pika/pull/2480)\n- [Pika-operator 支持监控指标采集,自动拉起 pika-expoter](https://github.com/OpenAtomFoundation/pika/pull/2451)\n\n### 1.6 Compaction 优化\n\nPikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。\n\n关键 PR 链接:\n\n- [添加 CompactRange 命令,支持对一定范围内的 key 进行 compact](https://github.com/OpenAtomFoundation/pika/pull/2163)\n- [提升 Compaction 速度,减少 Compaction 耗时](https://github.com/OpenAtomFoundation/pika/pull/2172)\n- [执行 shutdown 命令时调用 disable compaction,提升进程退出速度](https://github.com/OpenAtomFoundation/pika/pull/2345)\n\n### 1.7 自动 Failover\n\nPikiwiDB(Pika) 集群目前是基于 Codis 实现的。为了提高基于 Codis 的 PikiwiDB(Pika) Cluster 的易用性,我们对 Codis 进行了许多扩展。\n\n原始的 Codis 不支持 Group 内的 Failover,需要使用 Redis Sentinel,这会导致运维成本增加。我们在 Codis Dashboard 中加入了 sentinel 的功能,实现了对 Group 内主从的自动 failover。\n\n关键 PR 链接:\n\n- [PikiwiDB(Pika) 分布式集群支持自动 failover](https://github.com/OpenAtomFoundation/pika/pull/2386)\n\n### 1.8 可观测性提升\n\nPikiwiDB(Pika) 的可观测性关键组件是 Pika-Exporter。在 3.5.2 版本中,我们虽然添加了 Redis Cache 缓存热数据,但缺少监控指标。在 3.5.3 版本中,我们增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标。\n\n关键 PR 链接:\n\n- [Pika exporter 暴露 cache 相关的数据采集指标](https://github.com/OpenAtomFoundation/pika/pull/2318)\n- [PikiwiDB(Pika) 分布式集群 Codis proxy 新增可观测指标](https://github.com/OpenAtomFoundation/pika/pull/2199)\n- [修复 dbsize 计算错误问题](https://github.com/OpenAtomFoundation/pika/pull/2494)\n- [修复网络监控指标统计不准确的问题](https://github.com/OpenAtomFoundation/pika/pull/2234)\n\n### 1.9 数据一致性\n\n3.5.3 版本修复了许多 PikiwiDB(Pika) 主从同步问题,确保数据的一致性。\n\n关键 PR 链接:\n\n- [修复主从复制过程中,slave 节点收到 master 异常回包后的处理逻辑](https://github.com/OpenAtomFoundation/pika/pull/2319)\n- [修复 Pika cache 部分场景下 cache 和 DB 数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2225)\n- [修复全量复制失败后,未做处理导致数据丢失问题](https://github.com/OpenAtomFoundation/pika/pull/2439)\n- [修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求](https://github.com/OpenAtomFoundation/pika/pull/2437)\n- [全量复制过程中,添加数据同步状态,明确数据同步进度](https://github.com/OpenAtomFoundation/pika/pull/2430)\n- [修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2409)\n- [修复迁移数据后数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2485)\n\n### 1.10 测试集增加\n\nPikiwiDB(Pika) 的测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。在 3.5.3 版本中,我们增加了 Codis 集群 e2e 测试。\n\n关键 PR 链接:\n\n- [Pika TCL 测试集](https://github.com/OpenAtomFoundation/pika/pull/2497)\n- [Pika Gotest 测试集](https://github.com/OpenAtomFoundation/pika/pull/2502)\n\n### 1.11 工具集更新\n\nPikiwiDB(Pika) 一直重视工具集的建设,所有相关工具都可以在 https://github.com/OpenAtomFoundation/pika/tree/unstable/tools 中找到。在 3.5.3 版本中,我们新增了一个工具:\n\n- [PikiwiDB(Pika) 支持大 key 分析工具](https://github.com/OpenAtomFoundation/pika/pull/2195)\n\n### 1.12 文档更新\n\nPikiwiDB(Pika) 的文档主要是 wiki 文档。在 3.5.3 版本中,我们更新了 Pika 支持的 Redis 命令文档。\n\n文档链接:https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5\n\n## 2 发版详情\n\n在第一章节中,我们概述了 3.5.3 版本的主要功能升级和改进。下面详细列出了本次发版的相关 PR。\n\n### 2.1 新特性\n\n- [Pika 支持 ACL](https://github.com/OpenAtomFoundation/pika/pull/2013)\n- [在全量复制过程中,pika 服务的从节点不接收读请求](https://github.com/OpenAtomFoundation/pika/pull/2197)\n- [删除 Sharing 模式残留的 Slot 代码,回归 3.0,以后一个 Pika 下有多个 DB,每个 DB 只有一个 Blackwidow](https://github.com/OpenAtomFoundation/pika/pull/2251)\n- [在 Codis dashboard 协程 panic 时自动恢复服务](https://github.com/OpenAtomFoundation/pika/pull/2349)\n- [Pika cache 新增 bimap数据类型](https://github.com/OpenAtomFoundation/pika/pull/2253)\n- [Pika 支持快慢命令分离](https://github.com/OpenAtomFoundation/pika/pull/2162)\n- [Pika exporter 暴露 cache 相关的数据采集指标](https://github.com/OpenAtomFoundation/pika/pull/2318)\n- [Pika 执行完成 Bgsave 后, 保留 unix timepoint](https://github.com/OpenAtomFoundation/pika/pull/2167)\n- [Pika 支持动态配置 disable_auto_compations 参数](https://github.com/OpenAtomFoundation/pika/pull/2257)\n- [Pika 支持 Redis Stream](https://github.com/OpenAtomFoundation/pika/pull/1955)\n- [Pika 支持大 key 分析工具](https://github.com/OpenAtomFoundation/pika/pull/2195)\n- [Pika 支持动态调整 Pika cache 参数](https://github.com/OpenAtomFoundation/pika/pull/2197)\n- [更新 Pika benchmark 工具支持更多的接口压测](https://github.com/OpenAtomFoundation/pika/pull/2222)\n- [Pika Operator 支持 Pika 集群自动扩容](https://github.com/OpenAtomFoundation/pika/pull/2121)\n- [添加 CompactRange 命令支持对一定范围内的 key 进行 compact](https://github.com/OpenAtomFoundation/pika/pull/2163)\n- [提升 Compaction 速度减少 Compaction 耗时](https://github.com/OpenAtomFoundation/pika/pull/2172)\n- [升级 RocksDB 版本到 v8.7.3](https://github.com/OpenAtomFoundation/pika/pull/2157)\n- [Pika 分布式集群 Codis proxy 新增可观测指标](https://github.com/OpenAtomFoundation/pika/pull/2199)\n- [Pika 分布式集群支持自动 failover](https://github.com/OpenAtomFoundation/pika/pull/2386)\n- [Pika 支持 redis rename-command 功能](https://github.com/OpenAtomFoundation/pika/pull/2455)\n- [优化 codis slot 迁移速度,支持动态修改迁移线程和速度](https://github.com/OpenAtomFoundation/pika/pull/2486)\n- [Pika 支持动态调整 max-conn-rbuf-size 参数](https://github.com/OpenAtomFoundation/pika/pull/2434)\n- [Pika-operator 支持 namespace,可以在不同的 namespace 下部署不同的集群](https://github.com/OpenAtomFoundation/pika/pull/2480)\n- [Pika-operator 支持监控指标采集,自动拉起 pika-expoter](https://github.com/OpenAtomFoundation/pika/pull/2451)\n- [ACL 向前兼容 userblacklist](https://github.com/OpenAtomFoundation/pika/pull/2459)\n- [丰富了 Pika TCL 测试集](https://github.com/OpenAtomFoundation/pika/pull/2497)\n- [丰富了 Pika Gotest 测试集](https://github.com/OpenAtomFoundation/pika/pull/2502)\n\n### 2.2 Bug 修复\n\n- [修复 Pika 有从节点进行全量复制期间会误删除 dump 文件的问题](https://github.com/OpenAtomFoundation/pika/pull/2377)\n- [修复主从复制过程中, slave 节点收到 master 异常回包后的处理逻辑](https://github.com/OpenAtomFoundation/pika/pull/2319)\n- [在 Pika 执行 shutdown 命令时调用 disable compaction, 提升进程退出速度](https://github.com/OpenAtomFoundation/pika/pull/2345)\n- [修复 Codis-dashboard Redis Memory 值不准确的问题](https://github.com/OpenAtomFoundation/pika/pull/2337)\n- [INFO 命令耗时优化,降低查磁盘使用量的频率](https://github.com/OpenAtomFoundation/pika/pull/2197)\n- [修复 Rsync 删除临时文件路径不对,删除失败,导致rocksdb打开失败的问题](https://github.com/OpenAtomFoundation/pika/pull/2186)\n- [修复 Compact, Bgsave, Info keyspace 命令未指定db名称,导致部分命令 coredump 的问题](https://github.com/OpenAtomFoundation/pika/pull/2194)\n- [Codis dashboard 用 info replication 替代 info 命令查寻 master ip 降低对 Pika 的性能影响](https://github.com/OpenAtomFoundation/pika/pull/2198)\n- [修复 Pika cache 使用边缘case,解决部分场景下 cache 和 DB 数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2225)\n- [修复当 dump 文件夹为空时,会启动报错 Segmentation fault 的问题](https://github.com/OpenAtomFoundation/pika/pull/2265)\n- [修复因为 flag 计算错误,导致的部分命令缓存没有生效问题](https://github.com/OpenAtomFoundation/pika/pull/2217)\n- [修复主从复制模式下,主实例 flushdb 后,从实例因为死锁导致的不能访问的问题](https://github.com/OpenAtomFoundation/pika/pull/2249)\n- [修复部分命令未对 RocksDB 的返回值进行判断的问题](https://github.com/OpenAtomFoundation/pika/pull/2187)\n- [规范函数的返回值及初始值](https://github.com/OpenAtomFoundation/pika/pull/2176)\n- [修复网络监控指标统计不准确的问题](https://github.com/OpenAtomFoundation/pika/pull/2234)\n- [修复配置文件加载部分参数异常的问题](https://github.com/OpenAtomFoundation/pika/pull/2218)\n- [修复 Codis dashboard cpu 100% 的问题](https://github.com/OpenAtomFoundation/pika/pull/2393)\n- [修复 Codis fe pika 主从角色显示异常的问题](https://github.com/OpenAtomFoundation/pika/pull/2387)\n- [修复迁移数据后数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2485)\n- [修复 dbsize 计算错误问题](https://github.com/OpenAtomFoundation/pika/pull/2494)\n- [修复扩缩容或者 pod 起停后,Codis-dashboard 界面显示不准确的问题](https://github.com/OpenAtomFoundation/pika/pull/2475)\n- [修复 DB 层重复上锁的问题](https://github.com/OpenAtomFoundation/pika/pull/2372)\n- [修复全量复制失败后,未做处理导致数据丢失问题](https://github.com/OpenAtomFoundation/pika/pull/2439)\n- [修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求](https://github.com/OpenAtomFoundation/pika/pull/2437)\n- [全量复制过程中,添加数据同步状态,明确数据同步进度](https://github.com/OpenAtomFoundation/pika/pull/2430)\n- [修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2409)\n- [修复 codis slot 迁移过程中 master 实例 coredump 的问题](https://github.com/OpenAtomFoundation/pika/pull/2415)\n- [修复在主从复制过程中,删除正在使用的 dump 文件的问题](https://github.com/OpenAtomFoundation/pika/pull/2377)\n- [修复主从复制过程中从实例 rsync 响应错误的问题](https://github.com/OpenAtomFoundation/pika/pull/2319)\n\n### 2.3 发版标签\n\nhttps://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3\n\n## 3 社区\n\nPikiwiDB(Pika) 开源社区感谢您的支持,如果您有任何疑问或建议,欢迎加入我们的社区交流群:\n\n* 微信助手 PikiwiDB【请在微信中搜索 PikiwiDB】\n* telegram 群 https://t.me/+gMlTzNacOF1iMTM1"},{"id":"Pika-3.5.2","metadata":{"permalink":"/blog/Pika-3.5.2","source":"@site/blog/2023-12-03-Pika-3.5.2.md","title":"What's new in Pika v3.5.2","description":"Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。","date":"2023-12-03T00:00:00.000Z","tags":[],"readingTime":2.575,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.2","slug":"Pika-3.5.2","authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.3 ","permalink":"/blog/Pika-3.5.3"},"nextItem":{"title":"What's new in Pika v3.5.1","permalink":"/blog/Pika-3.5.1"}},"content":"Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。\n\n## 新特性\n\n+ Pika 支持 Redis 事务,使得 Pika 的数据够在一系列命令的执行中保持数据的一致性和可靠性。 https://github.com/OpenAtomFoundation/pika/pull/2124\n+ Pika 上层增加缓存层实现冷热数据分离,提升读性能。 https://github.com/OpenAtomFoundation/pika/pull/2171\n+ Codis-Proxy 支持动态修改配置参数,方便我们做参数调整。 https://github.com/OpenAtomFoundation/pika/pull/2110\n+ 补全 Go Test 测试用例。 https://github.com/OpenAtomFoundation/pika/pull/2082\n+ CI 增加 cache 提升编译速度。 https://github.com/OpenAtomFoundation/pika/pull/2093\n+ 增加 redis-copy 流量复制工具。 https://github.com/OpenAtomFoundation/pika/pull/2060\n\nbugfix\n\n+ 修复 pika 在使用 SETRANGE 命令出现 coredump 的问题。 https://github.com/OpenAtomFoundation/pika/pull/2141\n+ 修复因删除 Clearreplicationid 写进 binlog 导致的全量复制问题。 https://github.com/OpenAtomFoundation/pika/pull/2135\n+ 修改锁粒度,提升 pika 写 binlog 的性能。 https://github.com/OpenAtomFoundation/pika/pull/2129\n+ 修复复杂数据类型成员变量可能出现数据溢出。 https://github.com/OpenAtomFoundation/pika/pull/2106\n+ 修复 decr 命令返回值错误问题。 https://github.com/OpenAtomFoundation/pika/pull/2092\n+ 修复 setrange 和 setbit 命令没有保留原 key 的过期时间的问题。 https://github.com/OpenAtomFoundation/pika/pull/2095\n\n下期版本规划\n\n预计再过两个月左右,我们会在农历新年前发布 3.5.3 版本,相关关键特性有:\n\n+ Pika 通过快慢命令分离提升读写性能。 https://github.com/OpenAtomFoundation/pika/pull/2162\n+ 支持 Redis ACL,在 Pika 中引入用户概念,进行权限控制。 https://github.com/OpenAtomFoundation/pika/pull/2013\n+ 支持 Redis Stream,实现消息队列。 https://github.com/OpenAtomFoundation/pika/pull/1955\n+ 添加 Pika 特有命令 compactrange,对指定范围内的 key 进行 compact 以解决大 key 删除时读放大的问题。 https://github.com/OpenAtomFoundation/pika/pull/2163\n+ 支持 lastsave 指令。 https://github.com/OpenAtomFoundation/pika/pull/2167\n\n感谢大家对 Pika 开源公众号的关注 ,Pika 3.5 版本重大特性及使用规范我们会在稍后的文章中进行介绍,我们下期再见~\n\n![2023-09-28-Pika-3.5.2-connect](2023-12-03-Pika-3.5.2-connect.png)"},{"id":"Pika-3.5.1","metadata":{"permalink":"/blog/Pika-3.5.1","source":"@site/blog/2023-09-28-Pika-3.5.1.md","title":"What's new in Pika v3.5.1","description":"Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 。","date":"2023-09-28T00:00:00.000Z","tags":[],"readingTime":4.385,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.1","slug":"Pika-3.5.1","authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.2","permalink":"/blog/Pika-3.5.2"},"nextItem":{"title":"What's new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"}},"content":"Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 。\n\n该版本不仅做了很多优化工作,还引入了多项新功能。这些新功能包括 动态关闭 WAL、ReplicationID 检测是否增量复制、在 K8s 环境上 Pika 服务的自动注册从而实现集群的自组织、以及 exporter 检测集群指标等等,无疑将会让用户享受到更为稳定和高效的 NoSQL 使用体验。\n\n## 新特性\n\n+ 1 Slow log 增加队列等待时间统计,在队列阻塞的时候方便我们进行问题定位。PR 1997, 作者 wangshao1。\n+ 2 主从复制使用 ReplicationID 判断是否进行增量同步,解决原主从同步方式切主后整个数据集会进行全量复制的问题,可以提升 Pika 性能。PR 1951, 作者 Mixficsol。\n+ 3 WAL 以 'disablewal' 命令方式支持动态关闭,在写性能遇到瓶颈的时候,可以通过命令关闭 WAL 缓解写性能下降的问题,关闭 WAL 有机器宕机后丢失数据的风险,用户需要根据自己的使用习惯权衡。PR 2015,作者 Mixficsol。\n+ 4 flush 线程数和 compaction 线程数合二为一,在 Compaction 性能瓶颈时,可以动态调整线程数,缓解 Comapction 损耗 Pika 性能的问题。PR 2014, 作者 Tianpingan。\n+ 5 升级了 RocksDB 版本到 v8.3.3。PR 2000, 作者 dingxiaoshuai123。\n+ 6 新增周期性打印工作队列的长度功能,在队列阻塞的时候可以快速定位问题。PR 1978, 作者 Tianpingan。\n+ 7 新增利用一个 pika_exporter 监测整个集群的指标,实现一个 Pika Exporter 实例监控整个集群,解决了 3.5.0 版本一个 Pika Exporter 监测一个 Pika 实例消耗资源的问题。PR 1953, 作者 chenbt-hz。\n+ 8 实现在 K8s 环境上 Pika 服务的自动注册,在启动时自动注册,从而实现集群的自组织 ,实现了通过命令拉起整个 Pika Cluster 集群。PR 1931, 作者 machinly。\n\n## 2 bug 修复\n\n+ 1 调整了 Rate_limit 参数,修复了压测时出现 RPS 为 0 的情况 。PR 2009, 作者 Mixficsol。\n+ 2 修复了 INFODATA 命令中对于遍历数据文件时出现空路径的逻辑判断。PR 1996, 作者 Mixficsol。\n+ 3 修复了 Codis 在线上出现大毛刺的问题。PR 2016, 作者 chejinge。\n+ 4 修复了 macOS 环境下编译使用 tools 导致编译不过的问题 。PR 2011, 作者 A2ureStone。\n+ 5 减少了 exporter 非必要日志的打印,降低 了资源利用率。PR 1945, 作者 Mixficsol。\n\n## 3 使用建议\n\n本次新增了几个配置参数,大家在使用过程中,需要根据使用情况按需调整:\n\n+ 1 max-rsync-parallel-num:主从全量复制线程数,需要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 2。\n+ 2 rate-limiter-bandwidth: 限制 RocksDB 数据库读写速度,限制数据库在一定时间内可以读写的数据量,默认 2000MiB/s,需要根据自己的机器性能和部署实例做调整。\n+ max-background-jobs: compaction 和 flushdb 线程数,要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 4。\n+ 3 throttle-bytes-per-second: 主从复制传输限速参数,默认为 200MiB/s,该参数可以根据机器网卡的配置及部署 pika 实例的个数进行调整。\n\n![2023-09-28-Pika-3.5.1-connect.png](2023-09-28-Pika-3.5.1-connect.png)"},{"id":"Pika-3.5.0","metadata":{"permalink":"/blog/Pika-3.5.0","source":"@site/blog/2023-08-25-Pika-3.5.0.md","title":"What's new in Pika v3.5.0","description":"时隔两年,Pika 社区正式发布经由社区 50 多人参与开发并在 360 生产环境验证可用的 v3.5.0 版本,新版本在提升性能的同时,也支持了 Codis 集群部署,BlobDB KV 分离,增加 Exporter 等新特性。","date":"2023-08-25T00:00:00.000Z","tags":[],"readingTime":9.825,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbogo示土区"}],"frontMatter":{"title":"What's new in Pika v3.5.0","slug":"Pika-3.5.0","authors":[{"name":"于雨","title":"dubbogo示土区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.1","permalink":"/blog/Pika-3.5.1"},"nextItem":{"title":"Pika Blackwidow 引擎数据存储格式","permalink":"/blog/pika-blackwidow"}},"content":"时隔两年,Pika 社区正式发布经由社区 50 多人参与开发并在 360 生产环境验证可用的 v3.5.0 版本,新版本在提升性能的同时,也支持了 Codis 集群部署,BlobDB KV 分离,增加 Exporter 等新特性。\n\n我们将详细介绍该版本引入的重要新特性。\n\n## 1 去除 Rsync\n\n在 v3.5.0 版本之前,Pika 使用 Rsync 工具进行引擎中存量数据的同步,Pika 进程启动时创建 Rsync 子进程。这种同步方式在实际使用中出现了一些问题,包括Pika 进程 crash 后重新拉起无法正常同步以及同步过程中 Rsync 进程无故退出等。在今年发布的 v3.5.0 版本中,我们在全量同步方案方面进行了重要的改进,摒弃了以往使用的 Rsync,实现了全新的数据同步方案,支持了断点续传,动态调节传输限速等特性,以确保同步过程更加稳定、可控。这些改进不仅增强了同步的可靠性,还为用户提供了更好的使用体验。\n\n+ 去除 Rsync 进程,使用自研全量同步方式\n https://github.com/OpenAtomFoundation/pika/pull/1805\n\n+ 实现断点续传,传输限速功能\n https://github.com/OpenAtomFoundation/pika/pull/1926\n\n+ Pika 主从同步时,进行 master run_id 的检验\n https://github.com/OpenAtomFoundation/pika/pull/1805\n\n## 2 兼容更多 Redis 命令\n\n在 v3.5.0 版本中,我们迈出了更大的一步,提升了对 Redis 命令的兼容性,对 Redis 命令提供了更广泛的支持。这个版本的改进使得 Pika 在与 Redis 生态系统的集成中表现更加出色,为用户提供了更丰富的功能和更广阔的可能性。我们对命令支持的扩展,为用户提供了更多的灵活性,以满足不同场景下的需求。\n\n+ 支持 UNLINK 命令\n https://github.com/OpenAtomFoundation/pika/pull/1273\n+ 支持 INFO COMMANDSTATS 命令\n https://github.com/OpenAtomFoundation/pika/pull/1660\n+ 支持 HELLO、SETNAME 命令\n https://github.com/OpenAtomFoundation/pika/pull/1245\n+ 支持 BLPOP、BRPOP 命令\n https://github.com/OpenAtomFoundation/pika/pull/1548\n+ 新增 Pika 原创 DISKRECOVERY 命令\n https://github.com/OpenAtomFoundation/pika/pull/1843\n\n## 3 RocksDB 版本升级和分级压缩\n\n在 v3.5.0 版本中,我们进行了一项重要的升级,将 RocksDB 引擎升级至 v8.1.1 版本,并实现了分级压缩功能的整合。这一升级不仅是技术的飞跃,也是我们对系统性能和优化的持续关注的体现。通过这项升级,我们为 Pika 增加了更高级别的数据管理能力,同时也让系统更好地适应不同的压缩需求,为用户的数据存储和检索提供了更大的灵活性和效率。\n\n+ 升级 RocksDB 版本到 v8.1.1\n https://github.com/OpenAtomFoundation/pika/pull/1396\n+ 实现 RocksDB 分级压缩\n https://github.com/OpenAtomFoundation/pika/pull/1365\n+ 新增 RocksDB 缓存配置项 num-shard-bits 能够从配置文件中读取\n https://github.com/OpenAtomFoundation/pika/pull/1189\n\n## 4 支持 BlobDB\n\n在 v3.5.0 版本中,我们引入了引人瞩目的创新--对 BlobDB 和 KV 存储层进行了分离,为我们的系统注入了新的活力。这个版本的升级使得 Pika 在数据存储方面更加灵活和高效。我们通过支持 BlobDB KV 分离,提供了更优化的数据存储结构,为用户的数据管理和查询操作带来了更深层次的优势。这一重要改进将在更多应用场景下展现出其强大的潜力。\n\n+ 支持 BlobDB KV 分离\n https://github.com/OpenAtomFoundation/pika/pull/1456\n\n## 5 基于 Codis 的集群模式\n\n在 v3.5.0 版本中,我们积极引入了 Codis 集群模式,此外,我们不仅仅将 Codis 集群模式融入了系统中,还为其提供了迁移 slot 的命令支持,从而实现了更加智能化的集群管理。这一重大变革不仅扩展了 Pika 在大规模数据存储场景中的应用范围,还进一步提升了系统的可扩展性和高可用性。通过引入 Codis 集群模式,我们对用户的数据处理和管理提供了更优化的解决方案。\n\n+ 引入 Codis 到 Pika\n\n https://github.com/OpenAtomFoundation/pika/pull/1279\n\n+ 引入 Codis 的 CI\n\n https://github.com/OpenAtomFoundation/pika/pull/1311\n\n+ 支持 Codis 迁移 slot 命令\n\n https://github.com/OpenAtomFoundation/pika/pull/1632\n\n+ 新增是否在 reload 的 slotmigrate 状态\n\n https://github.com/OpenAtomFoundation/pika/pull/1700\n\n## 6 可观测性\n\n在 v3.5.0 版本中,我们引入了一个创新性的工具--pika_exporter,以提升对 Pika 数据库的可观测性。这一工具的加入不仅是对我们对系统监测能力的持续增强的反映。而在版本的后续更新中,我们进一步充实了指标,不断丰富了 Pika 的可观测性。为用户提供了更为全面和精准的数据洞察力。\n\n+ 新增 Pika 可观测系统 pika_exporter\n\n https://github.com/OpenAtomFoundation/pika/pull/1388\n\n+ 新增网络 I/O 流量监控指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1733\n\n+ 新增命令统计耗时指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1751\n\n+ 新增 estimate_pending_compaction_bytes 度量来分析碎片率指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1736\n\n+ 新增 RocksDB 指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1560\n\n## 7 容器化部署\n\n在 v3.5.0 版本中,我们引入了一个具有创新意义的里程碑--pika-operator mvp 版本,这一版本在技术上实现了一个重要目标:将 Pika 单实例服务迁移到 Kubernetes(K8s)平台上的快速部署。这不仅是对我们持续关注行业发展的体现,也是我们不断提升用户体验的追求。通过 pika-operator,我们为用户提供了更便捷的部署方案,将 Pika 的高性能数据库引擎与 Kubernetes 的灵活性相融合,从而为用户的应用环境带来更高效、更弹性的支持。\n\n+ 实现 Pika 单例服务在 K8s 上快速部署\n https://github.com/OpenAtomFoundation/pika/pull/1243\n+ 实现了在 MiniKube 环境中部署 Pika\n https://github.com/OpenAtomFoundation/pika/pull/1330\n+ 给 pika-operator 添加 E2E 测试\n https://github.com/OpenAtomFoundation/pika/pull/1347\n\n## 8 跨平台编译\n\n在 v3.5.0 版本中,Pika 呈现出一种全面性的蓬勃发展态势,得以在不同操作系统平台上展现其优越性。此版本的突破性之处在于,Pika 实现了对 MacOS、CentOS 和 Ubuntu 这些主要平台的完整编译和使用支持。这个举措不仅仅体现了我们对多样化技术环境的关注,也是为了最大程度地拓展用户基础,为广泛的用户群体提供灵活、高效的数据库解决方案。这种跨平台兼容性的加强将 Pika 推向更广阔的技术生态。\n\n+ 支持 MacOS 平台\n https://github.com/OpenAtomFoundation/pika/pull/1372\n\n## 9 多平台集成测试及单元测试\n\n在 v3.5.0 版本中,我们迈出了一个令人瞩目的步伐,不仅在多个主要操作系统平台上实现了支持,还在测试领域实施了全面升级。我们为 Ubuntu、CentOS 和 MacOS 这三大平台搭建了持续集成(CI)环境,以确保系统的完整性和稳定性。在测试方面,我们引入了更为广泛的覆盖,包括 Go 语言的集成测试、TCL 的单元测试以及 Python 的端到端(E2E)测试。通过这些测试策略的升级,我们在确保系统性能和可靠性方面迈出了更大的一步。\n\n+ 新增 CentOS 环境下的 CI\n https://github.com/OpenAtomFoundation/pika/pull/1534\n+ 新增 MacOS 环境下的 CI\n https://github.com/OpenAtomFoundation/pika/pull/1769\n+ 新增 E2E 测试框架\n https://github.com/OpenAtomFoundation/pika/pull/1347\n+ 新增在 Github CI Workflow 中添加 CMake 编译环境\n https://github.com/OpenAtomFoundation/pika/pull/1268\n+ 新增在 TCL 脚本中 populate 方法模拟 Redis debug populate 方法,用以填充测试数据\n https://github.com/OpenAtomFoundation/pika/pull/1693\n+ 新增在 blackwidow 中添加 CMake 文件,添加对 blackwidow 的单元测试\n https://github.com/OpenAtomFoundation/pika/pull/1246\n+ 移植 Redis 测试脚本\n https://github.com/OpenAtomFoundation/pika/pull/1357\n\n## 10 Others\n\n若您有任何疑问,诚挚欢迎您扫描微信二维码,加入我们的交流群,与一众志同道合的成员展开深入的讨论,我们热切期待与您分享见解、交流心得,为共同的技术探索和创新之旅添砖加瓦。在这个群体中,我们将以卓越的智慧和互动的合作精神,构建出一个相互学习、不断进步的技术共同体。\n\n![2023-08-25-Pika-3.5.0](2023-08-25-Pika-3.5.0-connect.png)"},{"id":"pika-blackwidow","metadata":{"permalink":"/blog/pika-blackwidow","source":"@site/blog/2020-7-16-pika-blackwidow.md","title":"Pika Blackwidow 引擎数据存储格式","description":"Blackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。","date":"2020-07-16T00:00:00.000Z","tags":[],"readingTime":12.29,"hasTruncateMarker":false,"authors":[{"name":"Axlgrep","title":"Pika 开源社区"}],"frontMatter":{"title":"Pika Blackwidow 引擎数据存储格式","slug":"pika-blackwidow","authors":[{"name":"Axlgrep","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"},"nextItem":{"title":"pika_port 迁移工具","permalink":"/blog/Pika-Tools-Port-Bin"}},"content":"Blackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。\n\n![pika-blackwidow-1](pika-blackwidow-1.png)\n\n## 1. String结构的存储\nString本质上就是Key, Value, 我们知道Rocksdb本身就是支持kv存储的, 我们为了实现Redis中的expire功能,所以在value后面添加了4 Bytes用于存储timestamp, 作为最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n\n![pika-blackwidow-2](pika-blackwidow-2.png)\n\n如果我们没有对该String对象设置超时时间,则timestamp存储的值就是默认值0, 否则就是该对象过期时间的时间戳, 每次我们获取一个String对象的时候, 首先会解析Value部分的后四字节, 获取到timestamp做出判断之后再返回结果。\n\n## 2. Hash结构的存储\nblackwidow中的hash表由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是hash表的一些信息, 比如说当前hash表的域的数量以及当前hash表的版本号和过期时间(用做秒删功能), 而普通数据主要就是指的同一个hash表中一一对应的field和value,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n1. 每个hash表的meta_key和meta_value的落盘方式:\n![pika-blackwidow-3](pika-blackwidow-3.png)\n\nmeta_key实际上就是hash表的key, 而meta_value由三个部分构成: 4Bytes的Hash size(用于存储当前hash表的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Hash表设置的超时时间的时间戳, 默认为0)\n\n2. hash表中data_key和data_value的落盘方式:\n![pika-blackwidow-4](pika-blackwidow-4.png)\n\ndata_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + Field的内容, 而data_value就是hash表某个field对应的value。\n\n3. 如果我们需要查找一个hash表中的某一个field对应的value, 我们首先会获取到meta_value解析出其中的timestamp判断这个hash表是否过期, 如果没有过期, 我们可以拿到其中的version, 然后我们使用key, version,和field拼出data_key, 进而找到对应的data_value(如果存在的话)\n\n## 3. List结构的存储\nblackwidow中的list由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是list链表的一些信息, 比如说当前list链表结点的的数量以及当前list链表的版本号和过期时间(用做秒删功能), 还有当前list链表的左右边界(由于nemo实现的链表结构被吐槽lrange效率低下,所以这次blackwidow我们底层用数组来模拟链表,这样lrange速度会大大提升,因为结点存储都是有序的), 普通数据实际上就是指的list中每一个结点中的数据,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式\n1. 每个list链表的meta_key和meta_value的落盘方式:\n![pika-blackwidow-5](pika-blackwidow-5.png)\n\nmeta_key实际上就是list链表的key, 而meta_value由五个部分构成: 8Bytes的List size(用于存储当前链表中总共有多少个结点) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个List链表设置的超时时间的时间戳, 默认为0) + 8Bytes的Left Index(数组的左边界) + 8Bytes的Right Index(数组的右边界)\n\n2. list链表中data_key和data_value的落盘方式:\n![pika-blackwidow-6](pika-blackwidow-6.png)\n\ndata_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Index(这个记录的就是当前结点的在这个list链表中的索引), 而data_value就是list链表该node中存储的值\n\n## 4. Set结构的存储\nblackwidow中的set由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是set集合的一些信息, 比如说当前set集合member的数量以及当前set集合的版本号和过期时间(用做秒删功能), 普通数据实际上就是指的set集合中的member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n1. 每个set集合的meta_key和meta_value的落盘方式:\n![pika-blackwidow-7](pika-blackwidow-7.png)\n\nmeta_key实际上就是set集合的key, 而meta_value由三个部分构成: 4Bytes的Set size(用于存储当前Set集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个set集合设置的超时时间的时间戳, 默认为0)\n\n2. set集合中data_key和data_value的落盘方式:\n![pika-blackwidow-8](pika-blackwidow-8.png)\n\ndata_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, 由于set集合只需要存储member, 所以data_value实际上就是空串\n\n## 5. ZSet结构的存储\nblackwidow中的zset由两部部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是zset集合的一些信息, 比如说当前zset集合member的数量以及当前zset集合的版本号和过期时间(用做秒删功能), 而普通数据就是指的zset中每个member以及对应的score, 由于zset这种数据结构比较特殊,需要按照memer进行排序,也需要按照score进行排序, 所以我们对于每一个zset我们会按照不同的格式存储两份普通数据, 在这里我们称为member to score和score to member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n1. 每个zset集合的meta_key和meta_value的落盘方式:\n![](https://i.imgur.com/RhZ8KMw.png)\n\nmeta_key实际上就是zset集合的key, 而meta_value由三个部分构成: 4Bytes的ZSet size(用于存储当前zSet集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Zset集合设置的超时时间的时间戳, 默认为0)\n\n2. 每个zset集合的data_key和data_value的落盘方式(member to score):\n![](https://i.imgur.com/C85Ba5Z.png)\n\nmember to socre的data_key由四个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, data_value中存储的其member对应的score的值,大小为8个字节,由于rocksdb默认是按照字典序进行排列的,所以同一个zset中不同的member就是按照member的字典序来排列的(同一个zset的key size, key, 以及version,也就是前缀都是一致的,不同的只有末端的member).\n\n3. 每个zset集合的data_key和data_value的落盘方式(score to member):\n![](https://i.imgur.com/QV9XHEk.png)\n\nscore to member的data_key由五个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Score + member的内容, 由于score和member都已经放在data_key中进行存储了所以data_value就是一个空串,无需存储其他内容了,对于score to member中的data_key我们自己实现了rocksdb的comparator,同一个zset中score to member的data_key会首先按照score来排序, 在score相同的情况下再按照member来排序\n\n\n## Blackwidow相对于Nemo有哪些优势\n\n1. Blackwidow采用了rocksdb的column families的新特性,将元数据和实际数据分开存放(对应于上面的meta数据和data数据), 这种存储方式相对于Nemo将meta, data混在一起存放更加合理, 并且可以提升查找效率(比如info keyspace的效率会大大提升)\n2. Blackwidow中参数传递大量采用Slice而Nemo中采用的是std::string, 所以Nemo会有很多没有必要的string对象的构造函数以及析构函数的调用,造成额外的资源消耗,而Blackwidow则不会有这个问题\n3. Blackwidow对kv模拟多数据结构的存储格式上做了重新设计(具体可以参考Nemo引擎数据存储格式和本篇文章),使之前在Nemo上出现的一些无法解决的性能问题得以解决,所以Blackwidow的多数据结构在某些场景下性能远远优于Nemo\n4. 原来Nemo对多数据结构的Key的长度最大只能支持到256 Bytes,而Blackwidow经过重新设计,放开了多数据结构Key长度的这个限制\n5. Blackwidow相对于Nemo更加节省空间,Nemo由于需要nemo-rocksdb的支持,所以不管在meta还是data数据部分都追加了version和timestamp这些信息,并且为了区分meta_key和data_key, 在最前面加入s和S(拿Set数据结构打比方),Blackwidow在这方面做了优化,使同样的数据量下Blackwidow所占用的空间比Nemo要小(举个例子,Blackwidow中List结构中的一个Node就比Nemo中的一个Node节省了16 Bytes的空间)\n6. Blackwidow在锁的实现上参照了RocksDB事务里锁的实现方法,而弃用了之前Nemo的行锁,所以在多线程对同一把锁有抢占的情况下性能会有所提升"},{"id":"Pika-Tools-Port-Bin","metadata":{"permalink":"/blog/Pika-Tools-Port-Bin","source":"@site/blog/2020-04-26-Pika-Tools-Port-Bin.md","title":"pika_port 迁移工具","description":"项目作者:","date":"2020-04-26T00:00:00.000Z","tags":[],"readingTime":2.56,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"Pika 开源社区"}],"frontMatter":{"title":"pika_port 迁移工具","slug":"Pika-Tools-Port-Bin","authors":[{"name":"于雨","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Pika Blackwidow 引擎数据存储格式","permalink":"/blog/pika-blackwidow"}},"content":"## 项目作者:\n[AlexStocks](https://github.com/alexstocks)\n\n## 适用版本:\n3.1 和 2.x\n\n## 项目地址:\n[https://github.com/ipixiu/pika-tools](https://github.com/ipixiu/pika-tools)\n\n[https://github.com/Axlgrep/pika-tools 长期维护地址需自行编译](https://github.com/Axlgrep/pika-tools)\n\n## 二进制包:\n[https://github.com/ipixiu/pika-port-bin](https://github.com/ipixiu/pika-port-bin)\n\n## 功能:\n将Pika中的数据在线迁移到Pika、Redis(支持全量、增量同步)\n\n## 开发背景:\n之前Pika项目官方提供的pika_to_redis工具仅支持离线将Pika的DB中的数据迁移到Pika、Redis, 且无法增量同步,该工具可以直接伪装为一个Pika的从库,将主库数据通过同步获取并转发给Pika、Redis,同时并支持增量同步\n\n\n## 实现:\n### trysync线程\n1. 尝试与主库建立同步关系 \n2. 如果需要全同步,则在接收到master的db之后,启动migrator和sender线程将db里面的数据发送给Pika、Redis \n3. 启动Slaveping线程定期给主库发送心跳,完成建立主从关系\n\n### binlog_receiver线程\n1. 接收主库发送过来的binlog并且将其解析成redis命令\n2. 将redis命令转发给Pika、Redis\n\n### migrator线程\n1. 扫描不同数据类型的分库\n2. 将key进行解析成响应数据Pika、redis指令\n3. 将解析好的redis指令加载到sender的发送buf中\n\n### sender线程\n1. 从发送buf中读取数据,以非阻塞方式向Pika、redis发送数据\n2. 接收Pika、redis返回的结果并解析,如果出现错误则显示错误结果\n\n## 使用帮助:\n```\nUsage: \n pika_port [-h] [-t local_ip -p local_port -i master_ip -o master_port\n -m forward_ip -n forward_port -x forward_thread_num -y forward_passwd]\n -f filenum -s offset -w password -r rsync_dump_path -l log_path\n -h -- show this help\n -t -- local host ip(OPTIONAL default: 127.0.0.1)\n -p -- local port(OPTIONAL)\n -i -- master ip(OPTIONAL default: 127.0.0.1)\n -o -- master port(REQUIRED)\n -m -- forward ip(OPTIONAL default: 127.0.0.1)\n -n -- forward port(REQUIRED)\n -x -- forward thread num(OPTIONAL default: 1)\n -y -- forward password(OPTIONAL)\n -f -- binlog filenum(OPTIONAL default: local offset)\n -s -- binlog offset(OPTIONAL default: local offset)\n -w -- password for master(OPTIONAL)\n -r -- rsync dump data path(OPTIONAL default: ./rsync_dump)\n -l -- local log path(OPTIONAL default: ./log)\n -b -- max batch number when port rsync dump data (OPTIONAL default: 512)\n -d -- daemonize(OPTIONAL)\n example: ./pika_port -t 127.0.0.1 -p 12345 -i 127.0.0.1 -o 9221 -m 127.0.0.1 -n 6379 -x 7 -f 0 -s 0 -w abc -l ./log -r ./rsync_dump -b 512 -d\n```"}]}} \ No newline at end of file diff --git a/.docusaurus/docusaurus-plugin-content-blog/default/p/blog-bd9.json b/.docusaurus/docusaurus-plugin-content-blog/default/p/blog-bd9.json index 04e18f1..762bbeb 100644 --- a/.docusaurus/docusaurus-plugin-content-blog/default/p/blog-bd9.json +++ b/.docusaurus/docusaurus-plugin-content-blog/default/p/blog-bd9.json @@ -1 +1 @@ -{"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":8,"blogDescription":"Blog","blogTitle":"Blog"}} \ No newline at end of file +{"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":9,"blogDescription":"Blog","blogTitle":"Blog"}} \ No newline at end of file diff --git a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2020-7-16-pika-blackwidow-md-569.json b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2020-7-16-pika-blackwidow-md-569.json index 9a92353..bfd1a6c 100644 --- a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2020-7-16-pika-blackwidow-md-569.json +++ b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2020-7-16-pika-blackwidow-md-569.json @@ -2,7 +2,7 @@ "permalink": "/blog/pika-blackwidow", "source": "@site/blog/2020-7-16-pika-blackwidow.md", "title": "Pika Blackwidow 引擎数据存储格式", - "description": "\bBlackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。", + "description": "Blackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。", "date": "2020-07-16T00:00:00.000Z", "tags": [], "readingTime": 12.29, diff --git a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2023-09-28-pika-3-5-1-md-8cf.json b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2023-09-28-pika-3-5-1-md-8cf.json index 22464b5..1007d59 100644 --- a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2023-09-28-pika-3-5-1-md-8cf.json +++ b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2023-09-28-pika-3-5-1-md-8cf.json @@ -26,8 +26,8 @@ }, "unlisted": false, "prevItem": { - "title": "What's new in Pika v3.5.0", - "permalink": "/blog/Pika-3.5.0" + "title": "What's new in Pika v3.5.2", + "permalink": "/blog/Pika-3.5.2" }, "nextItem": { "title": "What's new in Pika v3.5.0", diff --git a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2023-12-03-pika-3-5-2-md-f78.json b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2023-12-03-pika-3-5-2-md-f78.json index 1b19fe4..84497bf 100644 --- a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2023-12-03-pika-3-5-2-md-f78.json +++ b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2023-12-03-pika-3-5-2-md-f78.json @@ -1,7 +1,7 @@ { - "permalink": "/blog/Pika-3.5.0", + "permalink": "/blog/Pika-3.5.2", "source": "@site/blog/2023-12-03-Pika-3.5.2.md", - "title": "What's new in Pika v3.5.0", + "title": "What's new in Pika v3.5.2", "description": "Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。", "date": "2023-12-03T00:00:00.000Z", "tags": [], @@ -14,8 +14,8 @@ } ], "frontMatter": { - "title": "What's new in Pika v3.5.0", - "slug": "Pika-3.5.0", + "title": "What's new in Pika v3.5.2", + "slug": "Pika-3.5.2", "authors": [ { "name": "于雨", diff --git a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-03-27-pika-3-5-3-en-md-c0e.json b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-03-27-pika-3-5-3-en-md-c0e.json new file mode 100644 index 0000000..0441e29 --- /dev/null +++ b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-03-27-pika-3-5-3-en-md-c0e.json @@ -0,0 +1,36 @@ +{ + "permalink": "/blog/Pika-3.5.3-en", + "source": "@site/blog/2024-03-27-Pika-3.5.3-en.md", + "title": "What's new in Pika v3.5.3 (英文版本)", + "description": "As Redis announces the adoption of dual protocols to maintain its commercial interests, the PikiwiDB (Pika) community is pleased to announce the release of the v3.5.3 stable version for production use today.", + "date": "2024-03-27T00:00:00.000Z", + "tags": [], + "readingTime": 8.965, + "hasTruncateMarker": false, + "authors": [ + { + "name": "360 中间件团队", + "title": "Pika 开源社区" + } + ], + "frontMatter": { + "title": "What's new in Pika v3.5.3 (英文版本)", + "slug": "Pika-3.5.3-en", + "authors": [ + { + "name": "360 中间件团队", + "title": "Pika 开源社区" + } + ], + "hide_table_of_contents": false + }, + "unlisted": false, + "prevItem": { + "title": "What's new in PikiwiDB(Pika) v3.5.4", + "permalink": "/blog/Pika-3.5.4" + }, + "nextItem": { + "title": "What's new in Pika v3.5.3 ", + "permalink": "/blog/Pika-3.5.3" + } +} \ No newline at end of file diff --git a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-03-27-pika-3-5-3-md-2c2.json b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-03-27-pika-3-5-3-md-2c2.json index 93d2cb5..07f3975 100644 --- a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-03-27-pika-3-5-3-md-2c2.json +++ b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-03-27-pika-3-5-3-md-2c2.json @@ -2,10 +2,10 @@ "permalink": "/blog/Pika-3.5.3", "source": "@site/blog/2024-03-27-Pika-3.5.3.md", "title": "What's new in Pika v3.5.3 ", - "description": "随着 Redis 宣布采用双协议以维护其商业利益之际,PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.3 正式生产可用版本现已发布。", + "description": "随着 Redis 宣布采用双协议以维护其商业利益,PikiwiDB(Pika) 社区非常荣幸地宣布之际,我们的最新 v3.5.3 正式生产可用版本现已发布。", "date": "2024-03-27T00:00:00.000Z", "tags": [], - "readingTime": 14.535, + "readingTime": 14.775, "hasTruncateMarker": false, "authors": [ { @@ -26,11 +26,11 @@ }, "unlisted": false, "prevItem": { - "title": "What's new in Pika v3.5.4", - "permalink": "/blog/Pika-3.5.4" + "title": "What's new in Pika v3.5.3 (英文版本)", + "permalink": "/blog/Pika-3.5.3-en" }, "nextItem": { - "title": "What's new in Pika v3.5.0", - "permalink": "/blog/Pika-3.5.0" + "title": "What's new in Pika v3.5.2", + "permalink": "/blog/Pika-3.5.2" } } \ No newline at end of file diff --git a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-05-16-pika-3-5-4-md-6ed.json b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-05-16-pika-3-5-4-md-6ed.json index 1cf6292..4181e85 100644 --- a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-05-16-pika-3-5-4-md-6ed.json +++ b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-05-16-pika-3-5-4-md-6ed.json @@ -1,25 +1,25 @@ { "permalink": "/blog/Pika-3.5.4", "source": "@site/blog/2024-05-16-Pika-3.5.4.md", - "title": "What's new in Pika v3.5.4", - "description": "PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。", + "title": "What's new in PikiwiDB(Pika) v3.5.4", + "description": "PikiwiDB (Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。", "date": "2024-05-16T00:00:00.000Z", "tags": [], - "readingTime": 5.935, + "readingTime": 6.53, "hasTruncateMarker": false, "authors": [ { - "name": "于雨", - "title": "dubbogo示土区" + "name": "陈俊华", + "title": "360" } ], "frontMatter": { - "title": "What's new in Pika v3.5.4", + "title": "What's new in PikiwiDB(Pika) v3.5.4", "slug": "Pika-3.5.4", "authors": [ { - "name": "于雨", - "title": "dubbogo示土区" + "name": "陈俊华", + "title": "360" } ], "hide_table_of_contents": false @@ -30,7 +30,7 @@ "permalink": "/blog/PikiwiDB-Pika--4.0.0" }, "nextItem": { - "title": "What's new in Pika v3.5.3 ", - "permalink": "/blog/Pika-3.5.3" + "title": "What's new in Pika v3.5.3 (英文版本)", + "permalink": "/blog/Pika-3.5.3-en" } } \ No newline at end of file diff --git a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-07-08-pikiwi-db-pika-4-0-0-md-878.json b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-07-08-pikiwi-db-pika-4-0-0-md-878.json index 3677094..25ada94 100644 --- a/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-07-08-pikiwi-db-pika-4-0-0-md-878.json +++ b/.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2024-07-08-pikiwi-db-pika-4-0-0-md-878.json @@ -5,7 +5,7 @@ "description": "尊敬的社区成员及技术爱好者们:", "date": "2024-07-08T00:00:00.000Z", "tags": [], - "readingTime": 17.085, + "readingTime": 17.605, "hasTruncateMarker": false, "authors": [ { @@ -26,7 +26,7 @@ }, "unlisted": false, "nextItem": { - "title": "What's new in Pika v3.5.4", + "title": "What's new in PikiwiDB(Pika) v3.5.4", "permalink": "/blog/Pika-3.5.4" } } \ No newline at end of file diff --git a/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-175.json b/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-175.json index 4d02522..c78dc76 100644 --- a/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-175.json +++ b/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-175.json @@ -1 +1 @@ -{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"序言","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PikiwiDB(Pika) 简介","href":"/docs/序言/简介/","docId":"序言/简介/index","unlisted":false},{"type":"link","label":"支持的 Redis 接口与兼容情况","href":"/docs/序言/支持的 Redis 接口与兼容情况/","docId":"序言/支持的 Redis 接口与兼容情况/index","unlisted":false},{"type":"link","label":"FAQ","href":"/docs/序言/FAQ/","docId":"序言/FAQ/index","unlisted":false}],"href":"/docs/序言/"},{"type":"category","label":"使用与运维","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"配置文件说明","href":"/docs/使用与运维/配置文件说明/","docId":"使用与运维/配置文件说明/index","unlisted":false},{"type":"link","label":"page info 信息说明","href":"/docs/使用与运维/page info 信息说明/","docId":"使用与运维/page info 信息说明/index","unlisted":false},{"type":"link","label":"数据目录","href":"/docs/使用与运维/数据目录/","docId":"使用与运维/数据目录/index","unlisted":false},{"type":"link","label":"管理指令","href":"/docs/使用与运维/管理指令/","docId":"使用与运维/管理指令/index","unlisted":false},{"type":"link","label":"差异化命令","href":"/docs/使用与运维/差异化命令/","docId":"使用与运维/差异化命令/index","unlisted":false},{"type":"link","label":"订阅","href":"/docs/使用与运维/订阅/","docId":"使用与运维/订阅/index","unlisted":false},{"type":"link","label":"分布式模式简单教程","href":"/docs/使用与运维/分布式模式简单教程/","docId":"使用与运维/分布式模式简单教程/index","unlisted":false},{"type":"link","label":"自动容灾","href":"/docs/使用与运维/自动容灾/","docId":"使用与运维/自动容灾/index","unlisted":false},{"type":"link","label":"多库版命令","href":"/docs/使用与运维/多库版命令/","docId":"使用与运维/多库版命令/index","unlisted":false},{"type":"link","label":"服务器状态监控","href":"/docs/使用与运维/服务器状态监控/","docId":"使用与运维/服务器状态监控/index","unlisted":false},{"type":"link","label":"分片教程(3.1.2 ‐ 3.3.6)","href":"/docs/使用与运维/分片教程/","docId":"使用与运维/分片教程/index","unlisted":false},{"type":"link","label":"副本一致性(使用文档)","href":"/docs/使用与运维/副本一致性(使用文档)/","docId":"使用与运维/副本一致性(使用文档)/index","unlisted":false},{"type":"link","label":"安装使用","href":"/docs/使用与运维/安装使用/","docId":"使用与运维/安装使用/index","unlisted":false},{"type":"link","label":"副本一致性(设计文档)","href":"/docs/使用与运维/副本一致性(设计文档)/","docId":"使用与运维/副本一致性(设计文档)/index","unlisted":false},{"type":"link","label":"Pika 最佳实践","href":"/docs/使用与运维/Pika 最佳实践/","docId":"使用与运维/Pika 最佳实践/index","unlisted":false}],"href":"/docs/使用与运维/"},{"type":"category","label":"性能与优化","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"3.2.x 性能","href":"/docs/性能与优化/3.2.x 性能/","docId":"性能与优化/3.2.x 性能/index","unlisted":false},{"type":"link","label":"Pika 内存使用","href":"/docs/性能与优化/Pika 内存使用/","docId":"性能与优化/Pika 内存使用/index","unlisted":false},{"type":"link","label":"Redis 与 Pika scan 性能对比","href":"/docs/性能与优化/Redis 与 Pika scan 性能对比/","docId":"性能与优化/Redis 与 Pika scan 性能对比/index","unlisted":false},{"type":"link","label":"Pika 3.5 参数优化手册","href":"/docs/性能与优化/Pika 3.5 参数优化手册/","docId":"性能与优化/Pika 3.5 参数优化手册/index","unlisted":false},{"type":"category","label":"Pika 优化案例","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"喜马拉雅 Redis 与 Pika 缓存使用军规","href":"/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/","docId":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index","unlisted":false},{"type":"link","label":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","href":"/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/","docId":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index","unlisted":false}],"href":"/docs/性能与优化/Pika 优化案例/"}],"href":"/docs/性能与优化/"},{"type":"category","label":"设计与实现","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"整体技术架构","href":"/docs/设计与实现/整体技术架构/","docId":"设计与实现/整体技术架构/index","unlisted":false},{"type":"link","label":"线程模型","href":"/docs/设计与实现/线程模型/","docId":"设计与实现/线程模型/index","unlisted":false},{"type":"link","label":"锁的应用","href":"/docs/设计与实现/锁的应用/","docId":"设计与实现/锁的应用/index","unlisted":false},{"type":"link","label":"全同步","href":"/docs/设计与实现/全同步/","docId":"设计与实现/全同步/index","unlisted":false},{"type":"link","label":"增量同步","href":"/docs/设计与实现/增量同步/","docId":"设计与实现/增量同步/index","unlisted":false},{"type":"link","label":"主从同步","href":"/docs/设计与实现/主从同步/","docId":"设计与实现/主从同步/index","unlisted":false},{"type":"link","label":"副本一致性","href":"/docs/设计与实现/副本一致性/","docId":"设计与实现/副本一致性/index","unlisted":false},{"type":"link","label":"Pika 与 Codis","href":"/docs/设计与实现/Pika 与 Codis/","docId":"设计与实现/Pika 与 Codis/index","unlisted":false},{"type":"link","label":"快照式备份","href":"/docs/设计与实现/快照式备份/","docId":"设计与实现/快照式备份/index","unlisted":false},{"type":"link","label":"NoSQL 原理概述","href":"/docs/设计与实现/NoSQL 原理概述/","docId":"设计与实现/NoSQL 原理概述/index","unlisted":false},{"type":"link","label":"旧存储结构","href":"/docs/设计与实现/旧存储结构/","docId":"设计与实现/旧存储结构/index","unlisted":false},{"type":"link","label":"新存储结构","href":"/docs/设计与实现/新存储结构/","docId":"设计与实现/新存储结构/index","unlisted":false},{"type":"link","label":"新存储结构:详细解析","href":"/docs/设计与实现/新存储方案:详细解析/","docId":"设计与实现/新存储方案:详细解析/index","unlisted":false},{"type":"category","label":"Pika 源码学习笔记","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"通信和线程模型","href":"/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/","docId":"设计与实现/Pika 源码学习笔记/通信和线程模型/index","unlisted":false},{"type":"link","label":"Pubsub 机制","href":"/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/","docId":"设计与实现/Pika 源码学习笔记/PubSub 机制/index","unlisted":false},{"type":"link","label":"Pika 的命令执行框架","href":"/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/","docId":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index","unlisted":false},{"type":"link","label":"Pika 和 RockSDB 的对接","href":"/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/","docId":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index","unlisted":false}],"href":"/docs/设计与实现/Pika 源码学习笔记/"},{"type":"category","label":"Pika 传火计划","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Pika 线程模型简介","href":"/docs/设计与实现/Pika 传火计划/线程模型/","docId":"设计与实现/Pika 传火计划/线程模型/index","unlisted":false},{"type":"link","label":"Pika 读写流程简介","href":"/docs/设计与实现/Pika 传火计划/读写流程/","docId":"设计与实现/Pika 传火计划/读写流程/index","unlisted":false},{"type":"link","label":"Pika 主从同比","href":"/docs/设计与实现/Pika 传火计划/主从同步/","docId":"设计与实现/Pika 传火计划/主从同步/index","unlisted":false}],"href":"/docs/设计与实现/Pika 传火计划/"}],"href":"/docs/设计与实现/"},{"type":"category","label":"编码规范","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"编码规范","href":"/docs/开发文档/编码规范/","docId":"开发文档/编码规范/index","unlisted":false},{"type":"link","label":"c++ coding style","href":"/docs/开发文档/coding-style/","docId":"开发文档/coding-style/index","unlisted":false}],"href":"/docs/开发文档/"}]},"docs":{"使用与运维/index":{"id":"使用与运维/index","title":"使用与运维","description":"","sidebar":"tutorialSidebar"},"使用与运维/page info 信息说明/index":{"id":"使用与运维/page info 信息说明/index","title":"page info 信息说明","description":"执行INFO命令","sidebar":"tutorialSidebar"},"使用与运维/Pika 最佳实践/index":{"id":"使用与运维/Pika 最佳实践/index","title":"Pika 最佳实践","description":"我们根据360内部的pika使用经验及社区用户的问题反馈,整理了如下文档并会不断更新","sidebar":"tutorialSidebar"},"使用与运维/分布式模式简单教程/index":{"id":"使用与运维/分布式模式简单教程/index","title":"分布式模式简单教程","description":"关于sharding mode,pika底层提供slot 的概念。Pika将key进行哈希取模之后散列到各个slot当中处理。sharding mode 根据线上的具体情况可以应用于单个pika,也可以应用到多个pika组成的pika cluster。这个tutorial主要介绍开启sharding mode 需要了解的一些概念,以及需要调整的一些配置参数。","sidebar":"tutorialSidebar"},"使用与运维/分片教程/index":{"id":"使用与运维/分片教程/index","title":"分片教程(3.1.2 ‐ 3.3.6)","description":"Pika自版本3.1.2起开始对分片做了一系列支持,为此我们为分片模式添加了一系列的命令.","sidebar":"tutorialSidebar"},"使用与运维/副本一致性(使用文档)/index":{"id":"使用与运维/副本一致性(使用文档)/index","title":"副本一致性(使用文档)","description":"简介","sidebar":"tutorialSidebar"},"使用与运维/副本一致性(设计文档)/index":{"id":"使用与运维/副本一致性(设计文档)/index","title":"副本一致性(设计文档)","description":"目前线程模型","sidebar":"tutorialSidebar"},"使用与运维/多库版命令/index":{"id":"使用与运维/多库版命令/index","title":"多库版命令","description":"Pika自版本3.1.0起开始支持多db,为了兼容多db部分命令、配置参数发生了变化,具体变化如下:","sidebar":"tutorialSidebar"},"使用与运维/安装使用/index":{"id":"使用与运维/安装使用/index","title":"安装使用","description":"快速试用","sidebar":"tutorialSidebar"},"使用与运维/差异化命令/index":{"id":"使用与运维/差异化命令/index","title":"差异化命令","description":"config [get | set | rewrite]","sidebar":"tutorialSidebar"},"使用与运维/数据目录/index":{"id":"使用与运维/数据目录/index","title":"数据目录","description":"db目录","sidebar":"tutorialSidebar"},"使用与运维/服务器状态监控/index":{"id":"使用与运维/服务器状态监控/index","title":"服务器状态监控","description":"在pika的使用中,也为用户提供了丰富的info展示,用于监控服务器的运行状态。","sidebar":"tutorialSidebar"},"使用与运维/管理指令/index":{"id":"使用与运维/管理指令/index","title":"管理指令","description":"client kill all","sidebar":"tutorialSidebar"},"使用与运维/自动容灾/index":{"id":"使用与运维/自动容灾/index","title":"自动容灾","description":"pika能够配合Redis-sentinel(哨兵)实现自动容灾切主, 使用方式与redis完全一致","sidebar":"tutorialSidebar"},"使用与运维/订阅/index":{"id":"使用与运维/订阅/index","title":"订阅","description":"可用版本: >= 2.3.0","sidebar":"tutorialSidebar"},"使用与运维/配置文件说明/index":{"id":"使用与运维/配置文件说明/index","title":"配置文件说明","description":"","sidebar":"tutorialSidebar"},"序言/FAQ/index":{"id":"序言/FAQ/index","title":"FAQ","description":"1 编译安装","sidebar":"tutorialSidebar"},"序言/index":{"id":"序言/index","title":"序言","description":"欢迎来到 PikiwiDB(Pika) 的世界。接下来的篇章旨在于帮助你建立对 PikiwiDB 数据库的基本了解,你将会阅读到:","sidebar":"tutorialSidebar"},"序言/支持的 Redis 接口与兼容情况/index":{"id":"序言/支持的 Redis 接口与兼容情况/index","title":"支持的 Redis 接口与兼容情况","description":"pika支持redis五种类型(分别为string、hash、list、set、zset)的接口,先列出其对redis的五种数据结构兼容统计。","sidebar":"tutorialSidebar"},"序言/简介/index":{"id":"序言/简介/index","title":"PikiwiDB(Pika) 简介","description":"PikiwiDB(Pika)-Logo-Logo.png)","sidebar":"tutorialSidebar"},"开发文档/coding-style/index":{"id":"开发文档/coding-style/index","title":"c++ coding style","description":"header file","sidebar":"tutorialSidebar"},"开发文档/index":{"id":"开发文档/index","title":"编码规范","description":"","sidebar":"tutorialSidebar"},"开发文档/编码规范/index":{"id":"开发文档/编码规范/index","title":"编码规范","description":"c++ coding style","sidebar":"tutorialSidebar"},"性能与优化/3.2.x 性能/index":{"id":"性能与优化/3.2.x 性能/index","title":"3.2.x 性能","description":"Performance:","sidebar":"tutorialSidebar"},"性能与优化/index":{"id":"性能与优化/index","title":"性能与优化","description":"","sidebar":"tutorialSidebar"},"性能与优化/Pika 3.5 参数优化手册/index":{"id":"性能与优化/Pika 3.5 参数优化手册/index","title":"Pika 3.5 参数优化手册","description":"1970","sidebar":"tutorialSidebar"},"性能与优化/Pika 优化案例/index":{"id":"性能与优化/Pika 优化案例/index","title":"Pika 优化案例","description":"","sidebar":"tutorialSidebar"},"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index":{"id":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index","title":"喜马拉雅 Redis 与 Pika 缓存使用军规","description":"宣言:缓存不是万金油,更不是垃圾桶!!!","sidebar":"tutorialSidebar"},"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index":{"id":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index","title":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","description":"现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。","sidebar":"tutorialSidebar"},"性能与优化/Pika 内存使用/index":{"id":"性能与优化/Pika 内存使用/index","title":"Pika 内存使用","description":"Pika内存占用","sidebar":"tutorialSidebar"},"性能与优化/Redis 与 Pika scan 性能对比/index":{"id":"性能与优化/Redis 与 Pika scan 性能对比/index","title":"Redis 与 Pika scan 性能对比","description":"Redis 是后端常用的键值数据库。Pika 是 360 出品的一款与 Redis 协议几乎兼容的数据库。与 Redis 不同的是,Pika 基于硬盘,使用 RocksDB 作为引擎,从容量上来说,比基于内存的 Redis 大了不少,而且在性能上也能满足一般需求。","sidebar":"tutorialSidebar"},"设计与实现/index":{"id":"设计与实现/index","title":"设计与实现","description":"","sidebar":"tutorialSidebar"},"设计与实现/NoSQL 原理概述/index":{"id":"设计与实现/NoSQL 原理概述/index","title":"NoSQL 原理概述","description":"pika 设计","sidebar":"tutorialSidebar"},"设计与实现/Pika 与 Codis/index":{"id":"设计与实现/Pika 与 Codis/index","title":"Pika 与 Codis","description":"背景","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/index":{"id":"设计与实现/Pika 传火计划/index","title":"Pika 传火计划","description":"为方便刚接触Pika的同学能够更快的上手提交第一个Pika PR。基于v3.3.4代码,从代码层面对Pika进行了全方面的梳理。这个想法叫传火计划,希望Pika星星之火可以燎原。","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/主从同步/index":{"id":"设计与实现/Pika 传火计划/主从同步/index","title":"Pika 主从同比","description":"alt text","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/线程模型/index":{"id":"设计与实现/Pika 传火计划/线程模型/index","title":"Pika 线程模型简介","description":"alt text","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/读写流程/index":{"id":"设计与实现/Pika 传火计划/读写流程/index","title":"Pika 读写流程简介","description":"alt text","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/index":{"id":"设计与实现/Pika 源码学习笔记/index","title":"Pika 源码学习笔记","description":"","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index":{"id":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index","title":"Pika 和 RockSDB 的对接","description":"在《Pika源码学习--pika的命令执行框架》中我们了解了一个命令的执行流程,也知道了pika使用的是Blackwidow引擎,现在我们来看看pika是怎么和rocksdb对接的,Blackwidow具体怎么处理命令。","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index":{"id":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index","title":"Pika 的命令执行框架","description":"今天我们一起来看下pika收到一个命令后,是怎么处理这个命令的。","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/PubSub 机制/index":{"id":"设计与实现/Pika 源码学习笔记/PubSub 机制/index","title":"Pubsub 机制","description":"前一篇《Pika源码学习--pika的通信和线程模型》里说到WorkerThread里面有两种处理命令的方式,一种是同步,一种是异步。那什么时候是同步处理,什么时候是异步处理呢?其实","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/通信和线程模型/index":{"id":"设计与实现/Pika 源码学习笔记/通信和线程模型/index","title":"通信和线程模型","description":"pika的线程模型有官方的wiki介绍,这里主要介绍了pika都有哪些线程,这些线程用来干嘛。本篇文章主要涉及监听线程DispatchThread、IO工作线程WorkerThread和工作线程池ThreadPool,结合代码介绍里面实现的一些细节。","sidebar":"tutorialSidebar"},"设计与实现/主从同步/index":{"id":"设计与实现/主从同步/index","title":"主从同步","description":"pika主从同步","sidebar":"tutorialSidebar"},"设计与实现/全同步/index":{"id":"设计与实现/全同步/index","title":"全同步","description":"背景","sidebar":"tutorialSidebar"},"设计与实现/副本一致性/index":{"id":"设计与实现/副本一致性/index","title":"副本一致性","description":"目前线程模型","sidebar":"tutorialSidebar"},"设计与实现/增量同步/index":{"id":"设计与实现/增量同步/index","title":"增量同步","description":"背景","sidebar":"tutorialSidebar"},"设计与实现/快照式备份/index":{"id":"设计与实现/快照式备份/index","title":"快照式备份","description":"原理","sidebar":"tutorialSidebar"},"设计与实现/整体技术架构/index":{"id":"设计与实现/整体技术架构/index","title":"整体技术架构","description":"概述","sidebar":"tutorialSidebar"},"设计与实现/新存储方案:详细解析/index":{"id":"设计与实现/新存储方案:详细解析/index","title":"新存储结构:详细解析","description":"整体架构","sidebar":"tutorialSidebar"},"设计与实现/新存储结构/index":{"id":"设计与实现/新存储结构/index","title":"新存储结构","description":"整体架构","sidebar":"tutorialSidebar"},"设计与实现/旧存储结构/index":{"id":"设计与实现/旧存储结构/index","title":"旧存储结构","description":"Blackwidow 本质上是基于 rocksdb 的封装,使本身只支持 kv 存储的 rocksdb 能够支持多种数据结构, 目前 Blackwidow 支持五种数据结构的存储:String 结构(实际上就是存储 key, value), Hash 结构,List 结构,Set 结构和 ZSet 结构, 因为 Rocksdb 的存储方式只有 kv 一种, 所以上述五种数据结构最终都要落盘到 Rocksdb 的 kv 存储方式上,下面我们展示 Blackwidow 和 rocksdb 的关系并且说明我们是如何用 kv 来模拟多数据结构的。","sidebar":"tutorialSidebar"},"设计与实现/线程模型/index":{"id":"设计与实现/线程模型/index","title":"线程模型","description":"pika使用的是多线程模型,使用多个工作线程来进行读写操作,由底层blackwidow引擎来保证线程安全,线程分为12种:","sidebar":"tutorialSidebar"},"设计与实现/锁的应用/index":{"id":"设计与实现/锁的应用/index","title":"锁的应用","description":"pika作为类redis的存储系统,为了弥补在性能上的不足,在整个系统中大量使用多线程的结构,涉及到多线程编程,势必需要为线程加锁来保证数据访问的一致性和有效性。其中主要用到了三种锁","sidebar":"tutorialSidebar"}}}} \ No newline at end of file +{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"序言","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PikiwiDB(Pika) 简介","href":"/docs/序言/简介/","docId":"序言/简介/index","unlisted":false},{"type":"link","label":"支持的 Redis 接口与兼容情况","href":"/docs/序言/支持的 Redis 接口与兼容情况/","docId":"序言/支持的 Redis 接口与兼容情况/index","unlisted":false},{"type":"link","label":"FAQ","href":"/docs/序言/FAQ/","docId":"序言/FAQ/index","unlisted":false}],"href":"/docs/序言/"},{"type":"category","label":"使用与运维","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"配置文件说明","href":"/docs/使用与运维/配置文件说明/","docId":"使用与运维/配置文件说明/index","unlisted":false},{"type":"link","label":"page info 信息说明","href":"/docs/使用与运维/page info 信息说明/","docId":"使用与运维/page info 信息说明/index","unlisted":false},{"type":"link","label":"数据目录","href":"/docs/使用与运维/数据目录/","docId":"使用与运维/数据目录/index","unlisted":false},{"type":"link","label":"管理指令","href":"/docs/使用与运维/管理指令/","docId":"使用与运维/管理指令/index","unlisted":false},{"type":"link","label":"差异化命令","href":"/docs/使用与运维/差异化命令/","docId":"使用与运维/差异化命令/index","unlisted":false},{"type":"link","label":"订阅","href":"/docs/使用与运维/订阅/","docId":"使用与运维/订阅/index","unlisted":false},{"type":"link","label":"分布式模式简单教程","href":"/docs/使用与运维/分布式模式简单教程/","docId":"使用与运维/分布式模式简单教程/index","unlisted":false},{"type":"link","label":"自动容灾","href":"/docs/使用与运维/自动容灾/","docId":"使用与运维/自动容灾/index","unlisted":false},{"type":"link","label":"多库版命令","href":"/docs/使用与运维/多库版命令/","docId":"使用与运维/多库版命令/index","unlisted":false},{"type":"link","label":"服务器状态监控","href":"/docs/使用与运维/服务器状态监控/","docId":"使用与运维/服务器状态监控/index","unlisted":false},{"type":"link","label":"分片教程(3.1.2 ‐ 3.3.6)","href":"/docs/使用与运维/分片教程/","docId":"使用与运维/分片教程/index","unlisted":false},{"type":"link","label":"副本一致性(使用文档)","href":"/docs/使用与运维/副本一致性(使用文档)/","docId":"使用与运维/副本一致性(使用文档)/index","unlisted":false},{"type":"link","label":"安装使用","href":"/docs/使用与运维/安装使用/","docId":"使用与运维/安装使用/index","unlisted":false},{"type":"link","label":"副本一致性(设计文档)","href":"/docs/使用与运维/副本一致性(设计文档)/","docId":"使用与运维/副本一致性(设计文档)/index","unlisted":false},{"type":"link","label":"Pika 最佳实践","href":"/docs/使用与运维/Pika 最佳实践/","docId":"使用与运维/Pika 最佳实践/index","unlisted":false}],"href":"/docs/使用与运维/"},{"type":"category","label":"性能与优化","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"3.2.x 性能","href":"/docs/性能与优化/3.2.x 性能/","docId":"性能与优化/3.2.x 性能/index","unlisted":false},{"type":"link","label":"Pika 内存使用","href":"/docs/性能与优化/Pika 内存使用/","docId":"性能与优化/Pika 内存使用/index","unlisted":false},{"type":"link","label":"Redis 与 Pika scan 性能对比","href":"/docs/性能与优化/Redis 与 Pika scan 性能对比/","docId":"性能与优化/Redis 与 Pika scan 性能对比/index","unlisted":false},{"type":"link","label":"Pika 3.5 参数优化手册","href":"/docs/性能与优化/Pika 3.5 参数优化手册/","docId":"性能与优化/Pika 3.5 参数优化手册/index","unlisted":false},{"type":"category","label":"Pika 优化案例","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"喜马拉雅 Redis 与 Pika 缓存使用军规","href":"/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/","docId":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index","unlisted":false},{"type":"link","label":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","href":"/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/","docId":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index","unlisted":false}],"href":"/docs/性能与优化/Pika 优化案例/"}],"href":"/docs/性能与优化/"},{"type":"category","label":"设计与实现","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"整体技术架构","href":"/docs/设计与实现/整体技术架构/","docId":"设计与实现/整体技术架构/index","unlisted":false},{"type":"link","label":"线程模型","href":"/docs/设计与实现/线程模型/","docId":"设计与实现/线程模型/index","unlisted":false},{"type":"link","label":"锁的应用","href":"/docs/设计与实现/锁的应用/","docId":"设计与实现/锁的应用/index","unlisted":false},{"type":"link","label":"全同步","href":"/docs/设计与实现/全同步/","docId":"设计与实现/全同步/index","unlisted":false},{"type":"link","label":"增量同步","href":"/docs/设计与实现/增量同步/","docId":"设计与实现/增量同步/index","unlisted":false},{"type":"link","label":"主从同步","href":"/docs/设计与实现/主从同步/","docId":"设计与实现/主从同步/index","unlisted":false},{"type":"link","label":"副本一致性","href":"/docs/设计与实现/副本一致性/","docId":"设计与实现/副本一致性/index","unlisted":false},{"type":"link","label":"Pika 与 Codis","href":"/docs/设计与实现/Pika 与 Codis/","docId":"设计与实现/Pika 与 Codis/index","unlisted":false},{"type":"link","label":"快照式备份","href":"/docs/设计与实现/快照式备份/","docId":"设计与实现/快照式备份/index","unlisted":false},{"type":"link","label":"NoSQL 原理概述","href":"/docs/设计与实现/NoSQL 原理概述/","docId":"设计与实现/NoSQL 原理概述/index","unlisted":false},{"type":"link","label":"旧存储结构","href":"/docs/设计与实现/旧存储结构/","docId":"设计与实现/旧存储结构/index","unlisted":false},{"type":"link","label":"新存储结构","href":"/docs/设计与实现/新存储结构/","docId":"设计与实现/新存储结构/index","unlisted":false},{"type":"link","label":"新存储结构:详细解析","href":"/docs/设计与实现/新存储方案:详细解析/","docId":"设计与实现/新存储方案:详细解析/index","unlisted":false},{"type":"category","label":"Pika 源码学习笔记","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"通信和线程模型","href":"/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/","docId":"设计与实现/Pika 源码学习笔记/通信和线程模型/index","unlisted":false},{"type":"link","label":"Pubsub 机制","href":"/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/","docId":"设计与实现/Pika 源码学习笔记/PubSub 机制/index","unlisted":false},{"type":"link","label":"Pika 的命令执行框架","href":"/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/","docId":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index","unlisted":false},{"type":"link","label":"Pika 和 RockSDB 的对接","href":"/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/","docId":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index","unlisted":false}],"href":"/docs/设计与实现/Pika 源码学习笔记/"},{"type":"category","label":"Pika 传火计划","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Pika 线程模型简介","href":"/docs/设计与实现/Pika 传火计划/线程模型/","docId":"设计与实现/Pika 传火计划/线程模型/index","unlisted":false},{"type":"link","label":"Pika 读写流程简介","href":"/docs/设计与实现/Pika 传火计划/读写流程/","docId":"设计与实现/Pika 传火计划/读写流程/index","unlisted":false},{"type":"link","label":"Pika 主从同比","href":"/docs/设计与实现/Pika 传火计划/主从同步/","docId":"设计与实现/Pika 传火计划/主从同步/index","unlisted":false}],"href":"/docs/设计与实现/Pika 传火计划/"}],"href":"/docs/设计与实现/"},{"type":"category","label":"编码规范","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"编码规范","href":"/docs/开发文档/编码规范/","docId":"开发文档/编码规范/index","unlisted":false},{"type":"link","label":"c++ coding style","href":"/docs/开发文档/coding-style/","docId":"开发文档/coding-style/index","unlisted":false}],"href":"/docs/开发文档/"}]},"docs":{"开发文档/编码规范/index":{"id":"开发文档/编码规范/index","title":"编码规范","description":"c++ coding style","sidebar":"tutorialSidebar"},"开发文档/coding-style/index":{"id":"开发文档/coding-style/index","title":"c++ coding style","description":"header file","sidebar":"tutorialSidebar"},"开发文档/index":{"id":"开发文档/index","title":"编码规范","description":"","sidebar":"tutorialSidebar"},"设计与实现/副本一致性/index":{"id":"设计与实现/副本一致性/index","title":"副本一致性","description":"目前线程模型","sidebar":"tutorialSidebar"},"设计与实现/旧存储结构/index":{"id":"设计与实现/旧存储结构/index","title":"旧存储结构","description":"Blackwidow 本质上是基于 rocksdb 的封装,使本身只支持 kv 存储的 rocksdb 能够支持多种数据结构, 目前 Blackwidow 支持五种数据结构的存储:String 结构(实际上就是存储 key, value), Hash 结构,List 结构,Set 结构和 ZSet 结构, 因为 Rocksdb 的存储方式只有 kv 一种, 所以上述五种数据结构最终都要落盘到 Rocksdb 的 kv 存储方式上,下面我们展示 Blackwidow 和 rocksdb 的关系并且说明我们是如何用 kv 来模拟多数据结构的。","sidebar":"tutorialSidebar"},"设计与实现/快照式备份/index":{"id":"设计与实现/快照式备份/index","title":"快照式备份","description":"原理","sidebar":"tutorialSidebar"},"设计与实现/全同步/index":{"id":"设计与实现/全同步/index","title":"全同步","description":"背景","sidebar":"tutorialSidebar"},"设计与实现/锁的应用/index":{"id":"设计与实现/锁的应用/index","title":"锁的应用","description":"pika作为类redis的存储系统,为了弥补在性能上的不足,在整个系统中大量使用多线程的结构,涉及到多线程编程,势必需要为线程加锁来保证数据访问的一致性和有效性。其中主要用到了三种锁","sidebar":"tutorialSidebar"},"设计与实现/线程模型/index":{"id":"设计与实现/线程模型/index","title":"线程模型","description":"pika使用的是多线程模型,使用多个工作线程来进行读写操作,由底层blackwidow引擎来保证线程安全,线程分为12种:","sidebar":"tutorialSidebar"},"设计与实现/新存储方案:详细解析/index":{"id":"设计与实现/新存储方案:详细解析/index","title":"新存储结构:详细解析","description":"整体架构","sidebar":"tutorialSidebar"},"设计与实现/新存储结构/index":{"id":"设计与实现/新存储结构/index","title":"新存储结构","description":"整体架构","sidebar":"tutorialSidebar"},"设计与实现/增量同步/index":{"id":"设计与实现/增量同步/index","title":"增量同步","description":"背景","sidebar":"tutorialSidebar"},"设计与实现/整体技术架构/index":{"id":"设计与实现/整体技术架构/index","title":"整体技术架构","description":"概述","sidebar":"tutorialSidebar"},"设计与实现/主从同步/index":{"id":"设计与实现/主从同步/index","title":"主从同步","description":"pika主从同步","sidebar":"tutorialSidebar"},"设计与实现/index":{"id":"设计与实现/index","title":"设计与实现","description":"","sidebar":"tutorialSidebar"},"设计与实现/NoSQL 原理概述/index":{"id":"设计与实现/NoSQL 原理概述/index","title":"NoSQL 原理概述","description":"pika 设计","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/读写流程/index":{"id":"设计与实现/Pika 传火计划/读写流程/index","title":"Pika 读写流程简介","description":"alt text","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/线程模型/index":{"id":"设计与实现/Pika 传火计划/线程模型/index","title":"Pika 线程模型简介","description":"alt text","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/主从同步/index":{"id":"设计与实现/Pika 传火计划/主从同步/index","title":"Pika 主从同比","description":"alt text","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/index":{"id":"设计与实现/Pika 传火计划/index","title":"Pika 传火计划","description":"为方便刚接触Pika的同学能够更快的上手提交第一个Pika PR。基于v3.3.4代码,从代码层面对Pika进行了全方面的梳理。这个想法叫传火计划,希望Pika星星之火可以燎原。","sidebar":"tutorialSidebar"},"设计与实现/Pika 与 Codis/index":{"id":"设计与实现/Pika 与 Codis/index","title":"Pika 与 Codis","description":"背景","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/通信和线程模型/index":{"id":"设计与实现/Pika 源码学习笔记/通信和线程模型/index","title":"通信和线程模型","description":"pika的线程模型有官方的wiki介绍,这里主要介绍了pika都有哪些线程,这些线程用来干嘛。本篇文章主要涉及监听线程DispatchThread、IO工作线程WorkerThread和工作线程池ThreadPool,结合代码介绍里面实现的一些细节。","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/index":{"id":"设计与实现/Pika 源码学习笔记/index","title":"Pika 源码学习笔记","description":"","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index":{"id":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index","title":"Pika 的命令执行框架","description":"今天我们一起来看下pika收到一个命令后,是怎么处理这个命令的。","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index":{"id":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index","title":"Pika 和 RockSDB 的对接","description":"在《Pika源码学习--pika的命令执行框架》中我们了解了一个命令的执行流程,也知道了pika使用的是Blackwidow引擎,现在我们来看看pika是怎么和rocksdb对接的,Blackwidow具体怎么处理命令。","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/PubSub 机制/index":{"id":"设计与实现/Pika 源码学习笔记/PubSub 机制/index","title":"Pubsub 机制","description":"前一篇《Pika源码学习--pika的通信和线程模型》里说到WorkerThread里面有两种处理命令的方式,一种是同步,一种是异步。那什么时候是同步处理,什么时候是异步处理呢?其实","sidebar":"tutorialSidebar"},"使用与运维/安装使用/index":{"id":"使用与运维/安装使用/index","title":"安装使用","description":"快速试用","sidebar":"tutorialSidebar"},"使用与运维/差异化命令/index":{"id":"使用与运维/差异化命令/index","title":"差异化命令","description":"config [get | set | rewrite]","sidebar":"tutorialSidebar"},"使用与运维/订阅/index":{"id":"使用与运维/订阅/index","title":"订阅","description":"可用版本: >= 2.3.0","sidebar":"tutorialSidebar"},"使用与运维/多库版命令/index":{"id":"使用与运维/多库版命令/index","title":"多库版命令","description":"Pika自版本3.1.0起开始支持多db,为了兼容多db部分命令、配置参数发生了变化,具体变化如下:","sidebar":"tutorialSidebar"},"使用与运维/分布式模式简单教程/index":{"id":"使用与运维/分布式模式简单教程/index","title":"分布式模式简单教程","description":"关于sharding mode,pika底层提供slot 的概念。Pika将key进行哈希取模之后散列到各个slot当中处理。sharding mode 根据线上的具体情况可以应用于单个pika,也可以应用到多个pika组成的pika cluster。这个tutorial主要介绍开启sharding mode 需要了解的一些概念,以及需要调整的一些配置参数。","sidebar":"tutorialSidebar"},"使用与运维/分片教程/index":{"id":"使用与运维/分片教程/index","title":"分片教程(3.1.2 ‐ 3.3.6)","description":"Pika自版本3.1.2起开始对分片做了一系列支持,为此我们为分片模式添加了一系列的命令.","sidebar":"tutorialSidebar"},"使用与运维/服务器状态监控/index":{"id":"使用与运维/服务器状态监控/index","title":"服务器状态监控","description":"在pika的使用中,也为用户提供了丰富的info展示,用于监控服务器的运行状态。","sidebar":"tutorialSidebar"},"使用与运维/副本一致性(设计文档)/index":{"id":"使用与运维/副本一致性(设计文档)/index","title":"副本一致性(设计文档)","description":"目前线程模型","sidebar":"tutorialSidebar"},"使用与运维/副本一致性(使用文档)/index":{"id":"使用与运维/副本一致性(使用文档)/index","title":"副本一致性(使用文档)","description":"简介","sidebar":"tutorialSidebar"},"使用与运维/管理指令/index":{"id":"使用与运维/管理指令/index","title":"管理指令","description":"client kill all","sidebar":"tutorialSidebar"},"使用与运维/配置文件说明/index":{"id":"使用与运维/配置文件说明/index","title":"配置文件说明","description":"","sidebar":"tutorialSidebar"},"使用与运维/数据目录/index":{"id":"使用与运维/数据目录/index","title":"数据目录","description":"db目录","sidebar":"tutorialSidebar"},"使用与运维/自动容灾/index":{"id":"使用与运维/自动容灾/index","title":"自动容灾","description":"pika能够配合Redis-sentinel(哨兵)实现自动容灾切主, 使用方式与redis完全一致","sidebar":"tutorialSidebar"},"使用与运维/index":{"id":"使用与运维/index","title":"使用与运维","description":"","sidebar":"tutorialSidebar"},"使用与运维/page info 信息说明/index":{"id":"使用与运维/page info 信息说明/index","title":"page info 信息说明","description":"执行INFO命令","sidebar":"tutorialSidebar"},"使用与运维/Pika 最佳实践/index":{"id":"使用与运维/Pika 最佳实践/index","title":"Pika 最佳实践","description":"我们根据360内部的pika使用经验及社区用户的问题反馈,整理了如下文档并会不断更新","sidebar":"tutorialSidebar"},"性能与优化/3.2.x 性能/index":{"id":"性能与优化/3.2.x 性能/index","title":"3.2.x 性能","description":"Performance:","sidebar":"tutorialSidebar"},"性能与优化/index":{"id":"性能与优化/index","title":"性能与优化","description":"","sidebar":"tutorialSidebar"},"性能与优化/Pika 3.5 参数优化手册/index":{"id":"性能与优化/Pika 3.5 参数优化手册/index","title":"Pika 3.5 参数优化手册","description":"1970","sidebar":"tutorialSidebar"},"性能与优化/Pika 内存使用/index":{"id":"性能与优化/Pika 内存使用/index","title":"Pika 内存使用","description":"Pika内存占用","sidebar":"tutorialSidebar"},"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index":{"id":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index","title":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","description":"现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。","sidebar":"tutorialSidebar"},"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index":{"id":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index","title":"喜马拉雅 Redis 与 Pika 缓存使用军规","description":"宣言:缓存不是万金油,更不是垃圾桶!!!","sidebar":"tutorialSidebar"},"性能与优化/Pika 优化案例/index":{"id":"性能与优化/Pika 优化案例/index","title":"Pika 优化案例","description":"","sidebar":"tutorialSidebar"},"性能与优化/Redis 与 Pika scan 性能对比/index":{"id":"性能与优化/Redis 与 Pika scan 性能对比/index","title":"Redis 与 Pika scan 性能对比","description":"Redis 是后端常用的键值数据库。Pika 是 360 出品的一款与 Redis 协议几乎兼容的数据库。与 Redis 不同的是,Pika 基于硬盘,使用 RocksDB 作为引擎,从容量上来说,比基于内存的 Redis 大了不少,而且在性能上也能满足一般需求。","sidebar":"tutorialSidebar"},"序言/简介/index":{"id":"序言/简介/index","title":"PikiwiDB(Pika) 简介","description":"PikiwiDB(Pika)-Logo-Logo.png)","sidebar":"tutorialSidebar"},"序言/支持的 Redis 接口与兼容情况/index":{"id":"序言/支持的 Redis 接口与兼容情况/index","title":"支持的 Redis 接口与兼容情况","description":"pika支持redis五种类型(分别为string、hash、list、set、zset)的接口,先列出其对redis的五种数据结构兼容统计。","sidebar":"tutorialSidebar"},"序言/FAQ/index":{"id":"序言/FAQ/index","title":"FAQ","description":"1 编译安装","sidebar":"tutorialSidebar"},"序言/index":{"id":"序言/index","title":"序言","description":"欢迎来到 PikiwiDB(Pika) 的世界。接下来的篇章旨在于帮助你建立对 PikiwiDB 数据库的基本了解,你将会阅读到:","sidebar":"tutorialSidebar"}}}} \ No newline at end of file diff --git a/.docusaurus/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json b/.docusaurus/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json index f2ef9f1..6c2bb7c 100644 --- a/.docusaurus/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json +++ b/.docusaurus/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json @@ -1 +1 @@ -{"allContent":{"docusaurus-plugin-content-docs":{"default":{"loadedVersions":[{"versionName":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","path":"/docs","tagsPath":"/docs/tags","editUrl":"https://github.com/pikiwidb/website/tree/main/docs","editUrlLocalized":"https://github.com/pikiwidb/website/tree/main/i18n/zh-Hans/docusaurus-plugin-content-docs/current","isLast":true,"routePriority":-1,"sidebarFilePath":"/home/wenyi/project/website/sidebars.js","contentPath":"/home/wenyi/project/website/docs","contentPathLocalized":"/home/wenyi/project/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current","docs":[{"id":"使用与运维/index","title":"使用与运维","description":"","source":"@site/docs/使用与运维/index.md","sourceDirName":"使用与运维","slug":"/使用与运维/","permalink":"/docs/使用与运维/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/index.md","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"title":"使用与运维","sidebar_position":20},"sidebar":"tutorialSidebar","previous":{"title":"FAQ","permalink":"/docs/序言/FAQ/"},"next":{"title":"配置文件说明","permalink":"/docs/使用与运维/配置文件说明/"}},{"id":"使用与运维/page info 信息说明/index","title":"page info 信息说明","description":"执行INFO命令","source":"@site/docs/使用与运维/page info 信息说明/index.md","sourceDirName":"使用与运维/page info 信息说明","slug":"/使用与运维/page info 信息说明/","permalink":"/docs/使用与运维/page info 信息说明/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/page info 信息说明/index.md","tags":[],"version":"current","sidebarPosition":30,"frontMatter":{"title":"page info 信息说明","sidebar_position":30},"sidebar":"tutorialSidebar","previous":{"title":"配置文件说明","permalink":"/docs/使用与运维/配置文件说明/"},"next":{"title":"数据目录","permalink":"/docs/使用与运维/数据目录/"}},{"id":"使用与运维/Pika 最佳实践/index","title":"Pika 最佳实践","description":"我们根据360内部的pika使用经验及社区用户的问题反馈,整理了如下文档并会不断更新","source":"@site/docs/使用与运维/Pika 最佳实践/index.md","sourceDirName":"使用与运维/Pika 最佳实践","slug":"/使用与运维/Pika 最佳实践/","permalink":"/docs/使用与运维/Pika 最佳实践/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/Pika 最佳实践/index.md","tags":[],"version":"current","sidebarPosition":110,"frontMatter":{"title":"Pika 最佳实践","sidebar_position":110},"sidebar":"tutorialSidebar","previous":{"title":"副本一致性(设计文档)","permalink":"/docs/使用与运维/副本一致性(设计文档)/"},"next":{"title":"性能与优化","permalink":"/docs/性能与优化/"}},{"id":"使用与运维/分布式模式简单教程/index","title":"分布式模式简单教程","description":"关于sharding mode,pika底层提供slot 的概念。Pika将key进行哈希取模之后散列到各个slot当中处理。sharding mode 根据线上的具体情况可以应用于单个pika,也可以应用到多个pika组成的pika cluster。这个tutorial主要介绍开启sharding mode 需要了解的一些概念,以及需要调整的一些配置参数。","source":"@site/docs/使用与运维/分布式模式简单教程/index.md","sourceDirName":"使用与运维/分布式模式简单教程","slug":"/使用与运维/分布式模式简单教程/","permalink":"/docs/使用与运维/分布式模式简单教程/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/分布式模式简单教程/index.md","tags":[],"version":"current","sidebarPosition":65,"frontMatter":{"title":"分布式模式简单教程","sidebar_position":65},"sidebar":"tutorialSidebar","previous":{"title":"订阅","permalink":"/docs/使用与运维/订阅/"},"next":{"title":"自动容灾","permalink":"/docs/使用与运维/自动容灾/"}},{"id":"使用与运维/分片教程/index","title":"分片教程(3.1.2 ‐ 3.3.6)","description":"Pika自版本3.1.2起开始对分片做了一系列支持,为此我们为分片模式添加了一系列的命令.","source":"@site/docs/使用与运维/分片教程/index.md","sourceDirName":"使用与运维/分片教程","slug":"/使用与运维/分片教程/","permalink":"/docs/使用与运维/分片教程/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/分片教程/index.md","tags":[],"version":"current","sidebarPosition":90,"frontMatter":{"title":"分片教程(3.1.2 ‐ 3.3.6)","sidebar_position":90},"sidebar":"tutorialSidebar","previous":{"title":"服务器状态监控","permalink":"/docs/使用与运维/服务器状态监控/"},"next":{"title":"副本一致性(使用文档)","permalink":"/docs/使用与运维/副本一致性(使用文档)/"}},{"id":"使用与运维/副本一致性(使用文档)/index","title":"副本一致性(使用文档)","description":"简介","source":"@site/docs/使用与运维/副本一致性(使用文档)/index.md","sourceDirName":"使用与运维/副本一致性(使用文档)","slug":"/使用与运维/副本一致性(使用文档)/","permalink":"/docs/使用与运维/副本一致性(使用文档)/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/副本一致性(使用文档)/index.md","tags":[],"version":"current","sidebarPosition":100,"frontMatter":{"title":"副本一致性(使用文档)","sidebar_position":100},"sidebar":"tutorialSidebar","previous":{"title":"分片教程(3.1.2 ‐ 3.3.6)","permalink":"/docs/使用与运维/分片教程/"},"next":{"title":"安装使用","permalink":"/docs/使用与运维/安装使用/"}},{"id":"使用与运维/副本一致性(设计文档)/index","title":"副本一致性(设计文档)","description":"目前线程模型","source":"@site/docs/使用与运维/副本一致性(设计文档)/index.md","sourceDirName":"使用与运维/副本一致性(设计文档)","slug":"/使用与运维/副本一致性(设计文档)/","permalink":"/docs/使用与运维/副本一致性(设计文档)/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/副本一致性(设计文档)/index.md","tags":[],"version":"current","sidebarPosition":105,"frontMatter":{"title":"副本一致性(设计文档)","sidebar_position":105},"sidebar":"tutorialSidebar","previous":{"title":"安装使用","permalink":"/docs/使用与运维/安装使用/"},"next":{"title":"Pika 最佳实践","permalink":"/docs/使用与运维/Pika 最佳实践/"}},{"id":"使用与运维/多库版命令/index","title":"多库版命令","description":"Pika自版本3.1.0起开始支持多db,为了兼容多db部分命令、配置参数发生了变化,具体变化如下:","source":"@site/docs/使用与运维/多库版命令/index.md","sourceDirName":"使用与运维/多库版命令","slug":"/使用与运维/多库版命令/","permalink":"/docs/使用与运维/多库版命令/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/多库版命令/index.md","tags":[],"version":"current","sidebarPosition":80,"frontMatter":{"title":"多库版命令","sidebar_position":80},"sidebar":"tutorialSidebar","previous":{"title":"自动容灾","permalink":"/docs/使用与运维/自动容灾/"},"next":{"title":"服务器状态监控","permalink":"/docs/使用与运维/服务器状态监控/"}},{"id":"使用与运维/安装使用/index","title":"安装使用","description":"快速试用","source":"@site/docs/使用与运维/安装使用/index.md","sourceDirName":"使用与运维/安装使用","slug":"/使用与运维/安装使用/","permalink":"/docs/使用与运维/安装使用/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/安装使用/index.md","tags":[],"version":"current","sidebarPosition":100,"frontMatter":{"title":"安装使用","sidebar_position":100},"sidebar":"tutorialSidebar","previous":{"title":"副本一致性(使用文档)","permalink":"/docs/使用与运维/副本一致性(使用文档)/"},"next":{"title":"副本一致性(设计文档)","permalink":"/docs/使用与运维/副本一致性(设计文档)/"}},{"id":"使用与运维/差异化命令/index","title":"差异化命令","description":"config [get | set | rewrite]","source":"@site/docs/使用与运维/差异化命令/index.md","sourceDirName":"使用与运维/差异化命令","slug":"/使用与运维/差异化命令/","permalink":"/docs/使用与运维/差异化命令/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/差异化命令/index.md","tags":[],"version":"current","sidebarPosition":50,"frontMatter":{"title":"差异化命令","sidebar_position":50},"sidebar":"tutorialSidebar","previous":{"title":"管理指令","permalink":"/docs/使用与运维/管理指令/"},"next":{"title":"订阅","permalink":"/docs/使用与运维/订阅/"}},{"id":"使用与运维/数据目录/index","title":"数据目录","description":"db目录","source":"@site/docs/使用与运维/数据目录/index.md","sourceDirName":"使用与运维/数据目录","slug":"/使用与运维/数据目录/","permalink":"/docs/使用与运维/数据目录/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/数据目录/index.md","tags":[],"version":"current","sidebarPosition":30,"frontMatter":{"title":"数据目录","sidebar_position":30},"sidebar":"tutorialSidebar","previous":{"title":"page info 信息说明","permalink":"/docs/使用与运维/page info 信息说明/"},"next":{"title":"管理指令","permalink":"/docs/使用与运维/管理指令/"}},{"id":"使用与运维/服务器状态监控/index","title":"服务器状态监控","description":"在pika的使用中,也为用户提供了丰富的info展示,用于监控服务器的运行状态。","source":"@site/docs/使用与运维/服务器状态监控/index.md","sourceDirName":"使用与运维/服务器状态监控","slug":"/使用与运维/服务器状态监控/","permalink":"/docs/使用与运维/服务器状态监控/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/服务器状态监控/index.md","tags":[],"version":"current","sidebarPosition":85,"frontMatter":{"title":"服务器状态监控","sidebar_position":85},"sidebar":"tutorialSidebar","previous":{"title":"多库版命令","permalink":"/docs/使用与运维/多库版命令/"},"next":{"title":"分片教程(3.1.2 ‐ 3.3.6)","permalink":"/docs/使用与运维/分片教程/"}},{"id":"使用与运维/管理指令/index","title":"管理指令","description":"client kill all","source":"@site/docs/使用与运维/管理指令/index.md","sourceDirName":"使用与运维/管理指令","slug":"/使用与运维/管理指令/","permalink":"/docs/使用与运维/管理指令/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/管理指令/index.md","tags":[],"version":"current","sidebarPosition":40,"frontMatter":{"title":"管理指令","sidebar_position":40},"sidebar":"tutorialSidebar","previous":{"title":"数据目录","permalink":"/docs/使用与运维/数据目录/"},"next":{"title":"差异化命令","permalink":"/docs/使用与运维/差异化命令/"}},{"id":"使用与运维/自动容灾/index","title":"自动容灾","description":"pika能够配合Redis-sentinel(哨兵)实现自动容灾切主, 使用方式与redis完全一致","source":"@site/docs/使用与运维/自动容灾/index.md","sourceDirName":"使用与运维/自动容灾","slug":"/使用与运维/自动容灾/","permalink":"/docs/使用与运维/自动容灾/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/自动容灾/index.md","tags":[],"version":"current","sidebarPosition":70,"frontMatter":{"title":"自动容灾","sidebar_position":70},"sidebar":"tutorialSidebar","previous":{"title":"分布式模式简单教程","permalink":"/docs/使用与运维/分布式模式简单教程/"},"next":{"title":"多库版命令","permalink":"/docs/使用与运维/多库版命令/"}},{"id":"使用与运维/订阅/index","title":"订阅","description":"可用版本: >= 2.3.0","source":"@site/docs/使用与运维/订阅/index.md","sourceDirName":"使用与运维/订阅","slug":"/使用与运维/订阅/","permalink":"/docs/使用与运维/订阅/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/订阅/index.md","tags":[],"version":"current","sidebarPosition":60,"frontMatter":{"title":"订阅","sidebar_position":60},"sidebar":"tutorialSidebar","previous":{"title":"差异化命令","permalink":"/docs/使用与运维/差异化命令/"},"next":{"title":"分布式模式简单教程","permalink":"/docs/使用与运维/分布式模式简单教程/"}},{"id":"使用与运维/配置文件说明/index","title":"配置文件说明","description":"","source":"@site/docs/使用与运维/配置文件说明/index.md","sourceDirName":"使用与运维/配置文件说明","slug":"/使用与运维/配置文件说明/","permalink":"/docs/使用与运维/配置文件说明/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/配置文件说明/index.md","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"title":"配置文件说明","sidebar_position":20},"sidebar":"tutorialSidebar","previous":{"title":"使用与运维","permalink":"/docs/使用与运维/"},"next":{"title":"page info 信息说明","permalink":"/docs/使用与运维/page info 信息说明/"}},{"id":"序言/FAQ/index","title":"FAQ","description":"1 编译安装","source":"@site/docs/序言/FAQ/index.md","sourceDirName":"序言/FAQ","slug":"/序言/FAQ/","permalink":"/docs/序言/FAQ/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/序言/FAQ/index.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"FAQ","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"支持的 Redis 接口与兼容情况","permalink":"/docs/序言/支持的 Redis 接口与兼容情况/"},"next":{"title":"使用与运维","permalink":"/docs/使用与运维/"}},{"id":"序言/index","title":"序言","description":"欢迎来到 PikiwiDB(Pika) 的世界。接下来的篇章旨在于帮助你建立对 PikiwiDB 数据库的基本了解,你将会阅读到:","source":"@site/docs/序言/index.md","sourceDirName":"序言","slug":"/序言/","permalink":"/docs/序言/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/序言/index.md","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"title":"序言","sidebar_position":10},"sidebar":"tutorialSidebar","next":{"title":"PikiwiDB(Pika) 简介","permalink":"/docs/序言/简介/"}},{"id":"序言/支持的 Redis 接口与兼容情况/index","title":"支持的 Redis 接口与兼容情况","description":"pika支持redis五种类型(分别为string、hash、list、set、zset)的接口,先列出其对redis的五种数据结构兼容统计。","source":"@site/docs/序言/支持的 Redis 接口与兼容情况/index.md","sourceDirName":"序言/支持的 Redis 接口与兼容情况","slug":"/序言/支持的 Redis 接口与兼容情况/","permalink":"/docs/序言/支持的 Redis 接口与兼容情况/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/序言/支持的 Redis 接口与兼容情况/index.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"支持的 Redis 接口与兼容情况","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"PikiwiDB(Pika) 简介","permalink":"/docs/序言/简介/"},"next":{"title":"FAQ","permalink":"/docs/序言/FAQ/"}},{"id":"序言/简介/index","title":"PikiwiDB(Pika) 简介","description":"PikiwiDB(Pika)-Logo-Logo.png)","source":"@site/docs/序言/简介/index.md","sourceDirName":"序言/简介","slug":"/序言/简介/","permalink":"/docs/序言/简介/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/序言/简介/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"PikiwiDB(Pika) 简介","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"序言","permalink":"/docs/序言/"},"next":{"title":"支持的 Redis 接口与兼容情况","permalink":"/docs/序言/支持的 Redis 接口与兼容情况/"}},{"id":"开发文档/coding-style/index","title":"c++ coding style","description":"header file","source":"@site/docs/开发文档/coding-style/index.md","sourceDirName":"开发文档/coding-style","slug":"/开发文档/coding-style/","permalink":"/docs/开发文档/coding-style/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/开发文档/coding-style/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"c++ coding style","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"编码规范","permalink":"/docs/开发文档/编码规范/"}},{"id":"开发文档/index","title":"编码规范","description":"","source":"@site/docs/开发文档/index.md","sourceDirName":"开发文档","slug":"/开发文档/","permalink":"/docs/开发文档/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/开发文档/index.md","tags":[],"version":"current","sidebarPosition":60,"frontMatter":{"title":"编码规范","sidebar_position":60},"sidebar":"tutorialSidebar","previous":{"title":"Pika 主从同比","permalink":"/docs/设计与实现/Pika 传火计划/主从同步/"},"next":{"title":"编码规范","permalink":"/docs/开发文档/编码规范/"}},{"id":"开发文档/编码规范/index","title":"编码规范","description":"c++ coding style","source":"@site/docs/开发文档/编码规范/index.md","sourceDirName":"开发文档/编码规范","slug":"/开发文档/编码规范/","permalink":"/docs/开发文档/编码规范/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/开发文档/编码规范/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"编码规范","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"编码规范","permalink":"/docs/开发文档/"},"next":{"title":"c++ coding style","permalink":"/docs/开发文档/coding-style/"}},{"id":"性能与优化/3.2.x 性能/index","title":"3.2.x 性能","description":"Performance:","source":"@site/docs/性能与优化/3.2.x 性能/index.md","sourceDirName":"性能与优化/3.2.x 性能","slug":"/性能与优化/3.2.x 性能/","permalink":"/docs/性能与优化/3.2.x 性能/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/3.2.x 性能/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"3.2.x 性能","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"性能与优化","permalink":"/docs/性能与优化/"},"next":{"title":"Pika 内存使用","permalink":"/docs/性能与优化/Pika 内存使用/"}},{"id":"性能与优化/index","title":"性能与优化","description":"","source":"@site/docs/性能与优化/index.md","sourceDirName":"性能与优化","slug":"/性能与优化/","permalink":"/docs/性能与优化/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/index.md","tags":[],"version":"current","sidebarPosition":30,"frontMatter":{"title":"性能与优化","sidebar_position":30},"sidebar":"tutorialSidebar","previous":{"title":"Pika 最佳实践","permalink":"/docs/使用与运维/Pika 最佳实践/"},"next":{"title":"3.2.x 性能","permalink":"/docs/性能与优化/3.2.x 性能/"}},{"id":"性能与优化/Pika 3.5 参数优化手册/index","title":"Pika 3.5 参数优化手册","description":"1970","source":"@site/docs/性能与优化/Pika 3.5 参数优化手册/index.md","sourceDirName":"性能与优化/Pika 3.5 参数优化手册","slug":"/性能与优化/Pika 3.5 参数优化手册/","permalink":"/docs/性能与优化/Pika 3.5 参数优化手册/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/Pika 3.5 参数优化手册/index.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Pika 3.5 参数优化手册","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Redis 与 Pika scan 性能对比","permalink":"/docs/性能与优化/Redis 与 Pika scan 性能对比/"},"next":{"title":"Pika 优化案例","permalink":"/docs/性能与优化/Pika 优化案例/"}},{"id":"性能与优化/Pika 优化案例/index","title":"Pika 优化案例","description":"","source":"@site/docs/性能与优化/Pika 优化案例/index.md","sourceDirName":"性能与优化/Pika 优化案例","slug":"/性能与优化/Pika 优化案例/","permalink":"/docs/性能与优化/Pika 优化案例/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/Pika 优化案例/index.md","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"Pika 优化案例","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Pika 3.5 参数优化手册","permalink":"/docs/性能与优化/Pika 3.5 参数优化手册/"},"next":{"title":"喜马拉雅 Redis 与 Pika 缓存使用军规","permalink":"/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/"}},{"id":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index","title":"喜马拉雅 Redis 与 Pika 缓存使用军规","description":"宣言:缓存不是万金油,更不是垃圾桶!!!","source":"@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md","sourceDirName":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规","slug":"/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/","permalink":"/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"喜马拉雅 Redis 与 Pika 缓存使用军规","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"Pika 优化案例","permalink":"/docs/性能与优化/Pika 优化案例/"},"next":{"title":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","permalink":"/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/"}},{"id":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index","title":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","description":"现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。","source":"@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md","sourceDirName":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例","slug":"/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/","permalink":"/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"喜马拉雅 Redis 与 Pika 缓存使用军规","permalink":"/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/"},"next":{"title":"设计与实现","permalink":"/docs/设计与实现/"}},{"id":"性能与优化/Pika 内存使用/index","title":"Pika 内存使用","description":"Pika内存占用","source":"@site/docs/性能与优化/Pika 内存使用/index.md","sourceDirName":"性能与优化/Pika 内存使用","slug":"/性能与优化/Pika 内存使用/","permalink":"/docs/性能与优化/Pika 内存使用/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/Pika 内存使用/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Pika 内存使用","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"3.2.x 性能","permalink":"/docs/性能与优化/3.2.x 性能/"},"next":{"title":"Redis 与 Pika scan 性能对比","permalink":"/docs/性能与优化/Redis 与 Pika scan 性能对比/"}},{"id":"性能与优化/Redis 与 Pika scan 性能对比/index","title":"Redis 与 Pika scan 性能对比","description":"Redis 是后端常用的键值数据库。Pika 是 360 出品的一款与 Redis 协议几乎兼容的数据库。与 Redis 不同的是,Pika 基于硬盘,使用 RocksDB 作为引擎,从容量上来说,比基于内存的 Redis 大了不少,而且在性能上也能满足一般需求。","source":"@site/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md","sourceDirName":"性能与优化/Redis 与 Pika scan 性能对比","slug":"/性能与优化/Redis 与 Pika scan 性能对比/","permalink":"/docs/性能与优化/Redis 与 Pika scan 性能对比/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Redis 与 Pika scan 性能对比","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Pika 内存使用","permalink":"/docs/性能与优化/Pika 内存使用/"},"next":{"title":"Pika 3.5 参数优化手册","permalink":"/docs/性能与优化/Pika 3.5 参数优化手册/"}},{"id":"设计与实现/index","title":"设计与实现","description":"","source":"@site/docs/设计与实现/index.md","sourceDirName":"设计与实现","slug":"/设计与实现/","permalink":"/docs/设计与实现/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/index.md","tags":[],"version":"current","sidebarPosition":40,"frontMatter":{"title":"设计与实现","sidebar_position":40},"sidebar":"tutorialSidebar","previous":{"title":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","permalink":"/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/"},"next":{"title":"整体技术架构","permalink":"/docs/设计与实现/整体技术架构/"}},{"id":"设计与实现/NoSQL 原理概述/index","title":"NoSQL 原理概述","description":"pika 设计","source":"@site/docs/设计与实现/NoSQL 原理概述/index.md","sourceDirName":"设计与实现/NoSQL 原理概述","slug":"/设计与实现/NoSQL 原理概述/","permalink":"/docs/设计与实现/NoSQL 原理概述/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/NoSQL 原理概述/index.md","tags":[],"version":"current","sidebarPosition":13,"frontMatter":{"title":"NoSQL 原理概述","sidebar_position":13},"sidebar":"tutorialSidebar","previous":{"title":"快照式备份","permalink":"/docs/设计与实现/快照式备份/"},"next":{"title":"旧存储结构","permalink":"/docs/设计与实现/旧存储结构/"}},{"id":"设计与实现/Pika 与 Codis/index","title":"Pika 与 Codis","description":"背景","source":"@site/docs/设计与实现/Pika 与 Codis/index.md","sourceDirName":"设计与实现/Pika 与 Codis","slug":"/设计与实现/Pika 与 Codis/","permalink":"/docs/设计与实现/Pika 与 Codis/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 与 Codis/index.md","tags":[],"version":"current","sidebarPosition":11,"frontMatter":{"title":"Pika 与 Codis","sidebar_position":11},"sidebar":"tutorialSidebar","previous":{"title":"副本一致性","permalink":"/docs/设计与实现/副本一致性/"},"next":{"title":"快照式备份","permalink":"/docs/设计与实现/快照式备份/"}},{"id":"设计与实现/Pika 传火计划/index","title":"Pika 传火计划","description":"为方便刚接触Pika的同学能够更快的上手提交第一个Pika PR。基于v3.3.4代码,从代码层面对Pika进行了全方面的梳理。这个想法叫传火计划,希望Pika星星之火可以燎原。","source":"@site/docs/设计与实现/Pika 传火计划/index.md","sourceDirName":"设计与实现/Pika 传火计划","slug":"/设计与实现/Pika 传火计划/","permalink":"/docs/设计与实现/Pika 传火计划/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 传火计划/index.md","tags":[],"version":"current","sidebarPosition":18,"frontMatter":{"title":"Pika 传火计划","sidebar_position":18},"sidebar":"tutorialSidebar","previous":{"title":"Pika 和 RockSDB 的对接","permalink":"/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/"},"next":{"title":"Pika 线程模型简介","permalink":"/docs/设计与实现/Pika 传火计划/线程模型/"}},{"id":"设计与实现/Pika 传火计划/主从同步/index","title":"Pika 主从同比","description":"alt text","source":"@site/docs/设计与实现/Pika 传火计划/主从同步/index.md","sourceDirName":"设计与实现/Pika 传火计划/主从同步","slug":"/设计与实现/Pika 传火计划/主从同步/","permalink":"/docs/设计与实现/Pika 传火计划/主从同步/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 传火计划/主从同步/index.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Pika 主从同比","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Pika 读写流程简介","permalink":"/docs/设计与实现/Pika 传火计划/读写流程/"},"next":{"title":"编码规范","permalink":"/docs/开发文档/"}},{"id":"设计与实现/Pika 传火计划/线程模型/index","title":"Pika 线程模型简介","description":"alt text","source":"@site/docs/设计与实现/Pika 传火计划/线程模型/index.md","sourceDirName":"设计与实现/Pika 传火计划/线程模型","slug":"/设计与实现/Pika 传火计划/线程模型/","permalink":"/docs/设计与实现/Pika 传火计划/线程模型/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 传火计划/线程模型/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"Pika 线程模型简介","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"Pika 传火计划","permalink":"/docs/设计与实现/Pika 传火计划/"},"next":{"title":"Pika 读写流程简介","permalink":"/docs/设计与实现/Pika 传火计划/读写流程/"}},{"id":"设计与实现/Pika 传火计划/读写流程/index","title":"Pika 读写流程简介","description":"alt text","source":"@site/docs/设计与实现/Pika 传火计划/读写流程/index.md","sourceDirName":"设计与实现/Pika 传火计划/读写流程","slug":"/设计与实现/Pika 传火计划/读写流程/","permalink":"/docs/设计与实现/Pika 传火计划/读写流程/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 传火计划/读写流程/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Pika 读写流程简介","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Pika 线程模型简介","permalink":"/docs/设计与实现/Pika 传火计划/线程模型/"},"next":{"title":"Pika 主从同比","permalink":"/docs/设计与实现/Pika 传火计划/主从同步/"}},{"id":"设计与实现/Pika 源码学习笔记/index","title":"Pika 源码学习笔记","description":"","source":"@site/docs/设计与实现/Pika 源码学习笔记/index.md","sourceDirName":"设计与实现/Pika 源码学习笔记","slug":"/设计与实现/Pika 源码学习笔记/","permalink":"/docs/设计与实现/Pika 源码学习笔记/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 源码学习笔记/index.md","tags":[],"version":"current","sidebarPosition":17,"frontMatter":{"title":"Pika 源码学习笔记","sidebar_position":17},"sidebar":"tutorialSidebar","previous":{"title":"新存储结构:详细解析","permalink":"/docs/设计与实现/新存储方案:详细解析/"},"next":{"title":"通信和线程模型","permalink":"/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/"}},{"id":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index","title":"Pika 和 RockSDB 的对接","description":"在《Pika源码学习--pika的命令执行框架》中我们了解了一个命令的执行流程,也知道了pika使用的是Blackwidow引擎,现在我们来看看pika是怎么和rocksdb对接的,Blackwidow具体怎么处理命令。","source":"@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md","sourceDirName":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接","slug":"/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/","permalink":"/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Pika 和 RockSDB 的对接","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Pika 的命令执行框架","permalink":"/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/"},"next":{"title":"Pika 传火计划","permalink":"/docs/设计与实现/Pika 传火计划/"}},{"id":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index","title":"Pika 的命令执行框架","description":"今天我们一起来看下pika收到一个命令后,是怎么处理这个命令的。","source":"@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md","sourceDirName":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架","slug":"/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/","permalink":"/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Pika 的命令执行框架","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Pubsub 机制","permalink":"/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/"},"next":{"title":"Pika 和 RockSDB 的对接","permalink":"/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/"}},{"id":"设计与实现/Pika 源码学习笔记/PubSub 机制/index","title":"Pubsub 机制","description":"前一篇《Pika源码学习--pika的通信和线程模型》里说到WorkerThread里面有两种处理命令的方式,一种是同步,一种是异步。那什么时候是同步处理,什么时候是异步处理呢?其实","source":"@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md","sourceDirName":"设计与实现/Pika 源码学习笔记/PubSub 机制","slug":"/设计与实现/Pika 源码学习笔记/PubSub 机制/","permalink":"/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Pubsub 机制","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"通信和线程模型","permalink":"/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/"},"next":{"title":"Pika 的命令执行框架","permalink":"/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/"}},{"id":"设计与实现/Pika 源码学习笔记/通信和线程模型/index","title":"通信和线程模型","description":"pika的线程模型有官方的wiki介绍,这里主要介绍了pika都有哪些线程,这些线程用来干嘛。本篇文章主要涉及监听线程DispatchThread、IO工作线程WorkerThread和工作线程池ThreadPool,结合代码介绍里面实现的一些细节。","source":"@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md","sourceDirName":"设计与实现/Pika 源码学习笔记/通信和线程模型","slug":"/设计与实现/Pika 源码学习笔记/通信和线程模型/","permalink":"/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"通信和线程模型","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"Pika 源码学习笔记","permalink":"/docs/设计与实现/Pika 源码学习笔记/"},"next":{"title":"Pubsub 机制","permalink":"/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/"}},{"id":"设计与实现/主从同步/index","title":"主从同步","description":"pika主从同步","source":"@site/docs/设计与实现/主从同步/index.md","sourceDirName":"设计与实现/主从同步","slug":"/设计与实现/主从同步/","permalink":"/docs/设计与实现/主从同步/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/主从同步/index.md","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"主从同步","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"增量同步","permalink":"/docs/设计与实现/增量同步/"},"next":{"title":"副本一致性","permalink":"/docs/设计与实现/副本一致性/"}},{"id":"设计与实现/全同步/index","title":"全同步","description":"背景","source":"@site/docs/设计与实现/全同步/index.md","sourceDirName":"设计与实现/全同步","slug":"/设计与实现/全同步/","permalink":"/docs/设计与实现/全同步/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/全同步/index.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"全同步","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"锁的应用","permalink":"/docs/设计与实现/锁的应用/"},"next":{"title":"增量同步","permalink":"/docs/设计与实现/增量同步/"}},{"id":"设计与实现/副本一致性/index","title":"副本一致性","description":"目前线程模型","source":"@site/docs/设计与实现/副本一致性/index.md","sourceDirName":"设计与实现/副本一致性","slug":"/设计与实现/副本一致性/","permalink":"/docs/设计与实现/副本一致性/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/副本一致性/index.md","tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"title":"副本一致性","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"主从同步","permalink":"/docs/设计与实现/主从同步/"},"next":{"title":"Pika 与 Codis","permalink":"/docs/设计与实现/Pika 与 Codis/"}},{"id":"设计与实现/增量同步/index","title":"增量同步","description":"背景","source":"@site/docs/设计与实现/增量同步/index.md","sourceDirName":"设计与实现/增量同步","slug":"/设计与实现/增量同步/","permalink":"/docs/设计与实现/增量同步/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/增量同步/index.md","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"增量同步","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"全同步","permalink":"/docs/设计与实现/全同步/"},"next":{"title":"主从同步","permalink":"/docs/设计与实现/主从同步/"}},{"id":"设计与实现/快照式备份/index","title":"快照式备份","description":"原理","source":"@site/docs/设计与实现/快照式备份/index.md","sourceDirName":"设计与实现/快照式备份","slug":"/设计与实现/快照式备份/","permalink":"/docs/设计与实现/快照式备份/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/快照式备份/index.md","tags":[],"version":"current","sidebarPosition":12,"frontMatter":{"title":"快照式备份","sidebar_position":12},"sidebar":"tutorialSidebar","previous":{"title":"Pika 与 Codis","permalink":"/docs/设计与实现/Pika 与 Codis/"},"next":{"title":"NoSQL 原理概述","permalink":"/docs/设计与实现/NoSQL 原理概述/"}},{"id":"设计与实现/整体技术架构/index","title":"整体技术架构","description":"概述","source":"@site/docs/设计与实现/整体技术架构/index.md","sourceDirName":"设计与实现/整体技术架构","slug":"/设计与实现/整体技术架构/","permalink":"/docs/设计与实现/整体技术架构/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/整体技术架构/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"整体技术架构","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"设计与实现","permalink":"/docs/设计与实现/"},"next":{"title":"线程模型","permalink":"/docs/设计与实现/线程模型/"}},{"id":"设计与实现/新存储方案:详细解析/index","title":"新存储结构:详细解析","description":"整体架构","source":"@site/docs/设计与实现/新存储方案:详细解析/index.md","sourceDirName":"设计与实现/新存储方案:详细解析","slug":"/设计与实现/新存储方案:详细解析/","permalink":"/docs/设计与实现/新存储方案:详细解析/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/新存储方案:详细解析/index.md","tags":[],"version":"current","sidebarPosition":16,"frontMatter":{"title":"新存储结构:详细解析","sidebar_position":16},"sidebar":"tutorialSidebar","previous":{"title":"新存储结构","permalink":"/docs/设计与实现/新存储结构/"},"next":{"title":"Pika 源码学习笔记","permalink":"/docs/设计与实现/Pika 源码学习笔记/"}},{"id":"设计与实现/新存储结构/index","title":"新存储结构","description":"整体架构","source":"@site/docs/设计与实现/新存储结构/index.md","sourceDirName":"设计与实现/新存储结构","slug":"/设计与实现/新存储结构/","permalink":"/docs/设计与实现/新存储结构/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/新存储结构/index.md","tags":[],"version":"current","sidebarPosition":15,"frontMatter":{"title":"新存储结构","sidebar_position":15},"sidebar":"tutorialSidebar","previous":{"title":"旧存储结构","permalink":"/docs/设计与实现/旧存储结构/"},"next":{"title":"新存储结构:详细解析","permalink":"/docs/设计与实现/新存储方案:详细解析/"}},{"id":"设计与实现/旧存储结构/index","title":"旧存储结构","description":"Blackwidow 本质上是基于 rocksdb 的封装,使本身只支持 kv 存储的 rocksdb 能够支持多种数据结构, 目前 Blackwidow 支持五种数据结构的存储:String 结构(实际上就是存储 key, value), Hash 结构,List 结构,Set 结构和 ZSet 结构, 因为 Rocksdb 的存储方式只有 kv 一种, 所以上述五种数据结构最终都要落盘到 Rocksdb 的 kv 存储方式上,下面我们展示 Blackwidow 和 rocksdb 的关系并且说明我们是如何用 kv 来模拟多数据结构的。","source":"@site/docs/设计与实现/旧存储结构/index.md","sourceDirName":"设计与实现/旧存储结构","slug":"/设计与实现/旧存储结构/","permalink":"/docs/设计与实现/旧存储结构/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/旧存储结构/index.md","tags":[],"version":"current","sidebarPosition":14,"frontMatter":{"title":"旧存储结构","sidebar_position":14},"sidebar":"tutorialSidebar","previous":{"title":"NoSQL 原理概述","permalink":"/docs/设计与实现/NoSQL 原理概述/"},"next":{"title":"新存储结构","permalink":"/docs/设计与实现/新存储结构/"}},{"id":"设计与实现/线程模型/index","title":"线程模型","description":"pika使用的是多线程模型,使用多个工作线程来进行读写操作,由底层blackwidow引擎来保证线程安全,线程分为12种:","source":"@site/docs/设计与实现/线程模型/index.md","sourceDirName":"设计与实现/线程模型","slug":"/设计与实现/线程模型/","permalink":"/docs/设计与实现/线程模型/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/线程模型/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"线程模型","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"整体技术架构","permalink":"/docs/设计与实现/整体技术架构/"},"next":{"title":"锁的应用","permalink":"/docs/设计与实现/锁的应用/"}},{"id":"设计与实现/锁的应用/index","title":"锁的应用","description":"pika作为类redis的存储系统,为了弥补在性能上的不足,在整个系统中大量使用多线程的结构,涉及到多线程编程,势必需要为线程加锁来保证数据访问的一致性和有效性。其中主要用到了三种锁","source":"@site/docs/设计与实现/锁的应用/index.md","sourceDirName":"设计与实现/锁的应用","slug":"/设计与实现/锁的应用/","permalink":"/docs/设计与实现/锁的应用/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/锁的应用/index.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"锁的应用","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"线程模型","permalink":"/docs/设计与实现/线程模型/"},"next":{"title":"全同步","permalink":"/docs/设计与实现/全同步/"}}],"drafts":[],"sidebars":{"tutorialSidebar":[{"type":"category","label":"序言","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"PikiwiDB(Pika) 简介","id":"序言/简介/index"},{"type":"doc","label":"支持的 Redis 接口与兼容情况","id":"序言/支持的 Redis 接口与兼容情况/index"},{"type":"doc","label":"FAQ","id":"序言/FAQ/index"}],"link":{"type":"doc","id":"序言/index"}},{"type":"category","label":"使用与运维","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"配置文件说明","id":"使用与运维/配置文件说明/index"},{"type":"doc","label":"page info 信息说明","id":"使用与运维/page info 信息说明/index"},{"type":"doc","label":"数据目录","id":"使用与运维/数据目录/index"},{"type":"doc","label":"管理指令","id":"使用与运维/管理指令/index"},{"type":"doc","label":"差异化命令","id":"使用与运维/差异化命令/index"},{"type":"doc","label":"订阅","id":"使用与运维/订阅/index"},{"type":"doc","label":"分布式模式简单教程","id":"使用与运维/分布式模式简单教程/index"},{"type":"doc","label":"自动容灾","id":"使用与运维/自动容灾/index"},{"type":"doc","label":"多库版命令","id":"使用与运维/多库版命令/index"},{"type":"doc","label":"服务器状态监控","id":"使用与运维/服务器状态监控/index"},{"type":"doc","label":"分片教程(3.1.2 ‐ 3.3.6)","id":"使用与运维/分片教程/index"},{"type":"doc","label":"副本一致性(使用文档)","id":"使用与运维/副本一致性(使用文档)/index"},{"type":"doc","label":"安装使用","id":"使用与运维/安装使用/index"},{"type":"doc","label":"副本一致性(设计文档)","id":"使用与运维/副本一致性(设计文档)/index"},{"type":"doc","label":"Pika 最佳实践","id":"使用与运维/Pika 最佳实践/index"}],"link":{"type":"doc","id":"使用与运维/index"}},{"type":"category","label":"性能与优化","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"3.2.x 性能","id":"性能与优化/3.2.x 性能/index"},{"type":"doc","label":"Pika 内存使用","id":"性能与优化/Pika 内存使用/index"},{"type":"doc","label":"Redis 与 Pika scan 性能对比","id":"性能与优化/Redis 与 Pika scan 性能对比/index"},{"type":"doc","label":"Pika 3.5 参数优化手册","id":"性能与优化/Pika 3.5 参数优化手册/index"},{"type":"category","label":"Pika 优化案例","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"喜马拉雅 Redis 与 Pika 缓存使用军规","id":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index"},{"type":"doc","label":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","id":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index"}],"link":{"type":"doc","id":"性能与优化/Pika 优化案例/index"}}],"link":{"type":"doc","id":"性能与优化/index"}},{"type":"category","label":"设计与实现","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"整体技术架构","id":"设计与实现/整体技术架构/index"},{"type":"doc","label":"线程模型","id":"设计与实现/线程模型/index"},{"type":"doc","label":"锁的应用","id":"设计与实现/锁的应用/index"},{"type":"doc","label":"全同步","id":"设计与实现/全同步/index"},{"type":"doc","label":"增量同步","id":"设计与实现/增量同步/index"},{"type":"doc","label":"主从同步","id":"设计与实现/主从同步/index"},{"type":"doc","label":"副本一致性","id":"设计与实现/副本一致性/index"},{"type":"doc","label":"Pika 与 Codis","id":"设计与实现/Pika 与 Codis/index"},{"type":"doc","label":"快照式备份","id":"设计与实现/快照式备份/index"},{"type":"doc","label":"NoSQL 原理概述","id":"设计与实现/NoSQL 原理概述/index"},{"type":"doc","label":"旧存储结构","id":"设计与实现/旧存储结构/index"},{"type":"doc","label":"新存储结构","id":"设计与实现/新存储结构/index"},{"type":"doc","label":"新存储结构:详细解析","id":"设计与实现/新存储方案:详细解析/index"},{"type":"category","label":"Pika 源码学习笔记","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"通信和线程模型","id":"设计与实现/Pika 源码学习笔记/通信和线程模型/index"},{"type":"doc","label":"Pubsub 机制","id":"设计与实现/Pika 源码学习笔记/PubSub 机制/index"},{"type":"doc","label":"Pika 的命令执行框架","id":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index"},{"type":"doc","label":"Pika 和 RockSDB 的对接","id":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index"}],"link":{"type":"doc","id":"设计与实现/Pika 源码学习笔记/index"}},{"type":"category","label":"Pika 传火计划","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"Pika 线程模型简介","id":"设计与实现/Pika 传火计划/线程模型/index"},{"type":"doc","label":"Pika 读写流程简介","id":"设计与实现/Pika 传火计划/读写流程/index"},{"type":"doc","label":"Pika 主从同比","id":"设计与实现/Pika 传火计划/主从同步/index"}],"link":{"type":"doc","id":"设计与实现/Pika 传火计划/index"}}],"link":{"type":"doc","id":"设计与实现/index"}},{"type":"category","label":"编码规范","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"编码规范","id":"开发文档/编码规范/index"},{"type":"doc","label":"c++ coding style","id":"开发文档/coding-style/index"}],"link":{"type":"doc","id":"开发文档/index"}}]}}]}},"docusaurus-plugin-content-blog":{"default":{"blogSidebarTitle":"全部文章","blogPosts":[{"id":"PikiwiDB-Pika--4.0.0","metadata":{"permalink":"/blog/PikiwiDB-Pika--4.0.0","source":"@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md","title":"What's new in PikiwiDB(Pika) v4.0.0","description":"尊敬的社区成员及技术爱好者们:","date":"2024-07-08T00:00:00.000Z","tags":[],"readingTime":17.085,"hasTruncateMarker":false,"authors":[{"name":"360 车金鸽","title":"Pika 开源社区"}],"frontMatter":{"title":"What's new in PikiwiDB(Pika) v4.0.0","slug":"PikiwiDB-Pika--4.0.0","authors":[{"name":"360 车金鸽","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"What's new in Pika v3.5.4","permalink":"/blog/Pika-3.5.4"}},"content":"尊敬的社区成员及技术爱好者们:\nPikiwiDB 社区荣耀地宣告——经过 9 个月打磨并在生产环境稳定运行 5 个月的 PikiwiDB(Pika) v4.0.0 【下文简称 Pika】今天正式发布。希望基于第三代存储引擎 Floyd 的这个新版本能为社区用户们带来更卓越的体验。\n\n## 1 重大改进\n1.1 第三代存储引擎 Floyd\nFloyd 如同其前代 Blackwidow,基于 RocksDB,不仅支持基础的 String 结构,也原生支持了 Hash、List、Set、Stream及 ZSet 等 KKV 形式的复合数据结构。\n\n+ RocksDB 实例数可配置\n\n摒弃了 Blackwidow 按数据类型采用 RocksDB 实例的物理隔离模式,Floyd 采用了 RocksDB 的 Column-Family 虚拟隔离机制,在单个 RocksDB 实例下可存储所有类型的数据。用户可自由设定 Pika 实例中每个 DB【等同于Redis DB】中 RocksDB 实例的数量,而数据的存储则依据 key 的 hash 值分配至相应的 RocksDB 实例,减小了数据的空间放大和读放大效应,实现了机器资源的高效利用。\n\n+ 禁止重复 key\n\n![2024-05-16-PikiwiDB(Pika)-4.0.0-key](2024-07-08-PikiwiDB(Pika)-4.0.0-key.png)\n基于 RocksDB 的 Column-Family 虚拟隔离机制,Floyd 把所有类型的 key 和 string 一起存储在 Column-Family 0。在此存储基础之上,可明确禁止不同类型的 key 重复,这一设计旨在杜绝潜在的数据冗余与不一致性,与 Redis 服务特性保持一致,进一步提升了系统的整体效率与数据质量。\n\n+ Floyd 详细说明\n\n如果对 Floyd 存储引擎感兴趣,请详阅《Floyd 存储引擎》【链接:https://github.com/OpenAtomFoundation/pika/discussions/2052】。由于 Floyd 前后进行了多个版本的迭代,所以阅读该 github discussion 文档时请注意前后时间,如有相关冲突性说法,以最新日期的文字为准。\n\n关键 PR:\n+ PikiwiDB(Pika) 支持 Floyd 存储引擎 \nhttps://github.com/OpenAtomFoundation/pika/pull/2413\n+ 添加 Floyd 的 compaction-filter 的 Gtest \nhttps://github.com/OpenAtomFoundation/pika/pull/2669\n+ Pika 不支持不同类型的重复 key, 写入重复 key 返回非法类型 \nhttps://github.com/OpenAtomFoundation/pika/pull/2609\n+ 对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操作与 String 操作明确区分开 \nhttps://github.com/OpenAtomFoundation/pika/pull/2720\n+ 添加支持分区索引过滤的功能 \nhttps://github.com/OpenAtomFoundation/pika/pull/2601\n\n1.2 Mget 批量查询缓存\n\nPika v3.5.2 的热数据缓存只实现了对热点 Key 的点查(如get/hget),在后续的 v3.5.3 和 v3.5.4 修复若干 bug 后,对热数据的点查目前已经非常稳定。然而并未支持批量查询(如 mget etc)。\n内部业务侧反馈批量查询速度比较慢,在 40C/256GiB/2TiB SATA SSD 规格机器上数据量超过 100GiB 时,Pika v3.3.6 30% 批量查询延迟超过 35ms。但由于 Pika 热数据缓存尚未支持批量查询,性能并未改善。\n\n为了满足业务需求,Pika 团队开发了批量查询热数据缓存功能,显著提升了批量查询性能,降低了查询延迟和失败率。相关技术细节请阅读《PikiwiDB (Pika) 混合存储之批量查询》 【链接:https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ 】。\n\n关键 PR :\n\n+ Mget 支持多 key 查询缓存, 记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能 \nhttps://github.com/OpenAtomFoundation/pika/pull/2675\n+ 修复 Mget 没有使用解析 ttl 的函数导致出现部分key的ttl未被更新,数据不一致的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2730\n\n1.3 主从复制\n\nPika v3.3.6 有很多主从复制的缺陷。v4.0.0 版本对 Pika 全量复制及增量复制进行了大量优化和 bug 修复,取得了非常好的效果。 \n并在 info 命令中输出了 \"repl_connect_status\" 指标(PR 2638),以方便用户更加明确清晰的确定当前的主从复制状态。\n\n关键 PR :\n\n+ 修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2746\n+ 修复 Spop 在写 binlog 时可能会出现竞态问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2647\n+ 修复多 DB 下全量同步超时后不重试的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2667\n+ 修复多 DB 主从超时场景下,可能会出现窗口崩溃的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2666\n+ 修复主从同步限速逻辑中重复解锁的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2657\n+ 重构主从复制模式 slave 节点的主从同步线程模型,尽可能减少 binlog 消费阻塞问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2638\n\n1.4 Redis Stream\n\nRedis Stream 类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,底层引擎 BlackWidow 和 Floyd 中特别添加了对 Stream 数据类型的支持。\n关键 PR: \n+ 修复 pkpatternmatchdel 命令使用错误导致的 stream 类型数据删除异常的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2726\n+ 修复 Keyspace 命令未计算 Stream 类型数据的问题 \nhttps://github.com/OpenAtomFoundation/pika/pull/2705\n\n1.5 Compaction\n\nPikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。\n\nFloyd 使用了 v8.7.3 版本的 RocksDB,开放了更多 RocksDB 参数,以方便用户优化 RocksDB 性能:\n\n+ enable-partitioned-index-filters: 支持加载分区索引过滤器,加快 RocksDB 查找速度。\n+ min-write-buffer-number-to-merge: 默认值为 1,如果将此值设置得更大,意味着需要更多的写缓冲区被填满后才进行 flush。这样可以减少 flush 的频率,增加数据在内存中的累积量,从而可能提高写入吞吐量。\n+ level0-stop-writes-trigger: 默认值为 36,定义了 L0 层中 sst 文件的最大数量,一旦达到这个数量,RocksDB 将会采取 暂停写入、强制 compaction 等措施来防止写入操作继续累积,以避免 L0 层变得过于庞大,进而可能导致写入放大、查询性能下降等问题。\n+ level0-slowdown-writes-trigger:默认值为 20,用于控制当 Level 0 的 SST 文件数量达到这个阈值时,触发写减速(write slowdown),防止 Level 0 的文件数量过多,导致后续 compaction 操作的压力过大。\n+ level0-file-num-compaction-trigger:默认值为 4,当 Level 0 的 SST 文件数量达到这个参数设定的阈值时,RocksDB 会开始执行 compaction 操作,将 Level 0 的文件合并到 Level 1,以减少 Level 0 的文件数量,降低读取延迟,并优化存储空间的利用率。\n+ max-subcompactions:默认值为 1,用于控制RocksDB 中并发执行的 sub-compaction 任务数量,其值为 1 表示关闭 sub-compaction。如果系统资源充足,建议提升该参数以优化 compaction 效率。\n+ max-bytes-for-level-base:指定了 L1 SST 文件总的大小。这个大小是 RocksDB 进行数据分层管理和 compaction 决策的重要依据:如果 L1 层的大小设置得太小,可能会导致 L0 层的 compaction 过于频繁,进而影响写性能。反之,如果设置得太大,可能会占用较多的磁盘空间,并且影响读取性能,因为读取操作可能需要跨越更多的层级。Pika 没有在 pika.conf 中开放此参数给用户配置,而是使用其他参数(level0-file-num-compaction-trigger 和 write-buffer-size)计算后的结果。\n\n\nstorage_options_.options.max_bytes_for_level_base = g_pika_conf->level0_file_num_compaction_trigger() * g_pika_conf->write_buffer_size()\n\n\n关键 PR:\n添加 Floyd 的 compaction-filter 的 Gtest\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\n添加支持分区索引过滤的功能\nhttps://github.com/OpenAtomFoundation/pika/pull/2601\n新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗\nhttps://github.com/OpenAtomFoundation/pika/pull/2538\n1.6 可观测性\nv3.5 版本增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标,但是在集群方面的可观测性是缺失的。v4.0.0 对 Codis-Proxy 的 P99、P999、延迟等监控指标进行采集和展示,可以直观地反映线上 Codis-proxy 的运行情况。\n\nv4.0.0 开始还提供新的工具:根据 pika benchmark 工具压测结果自动生成可视化的统计图表。\n\n关键 PR:\nCodis 支持 info 命令, 可以通过该命令查询 Codis-proxy 的 info 信息\nhttps://github.com/OpenAtomFoundation/pika/pull/2688\nCodis-proxy 新增 P99 P95 等监控耗时指标\nhttps://github.com/OpenAtomFoundation/pika/pull/2668\n添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表\nhttps://github.com/OpenAtomFoundation/pika/pull/2663\n\n1.7 测试集\nPikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。v4.0.0 中丰富了诸多特性的 go test 功能,并进一步完善了基本数据类型的 TCL 测试。\n关键 PR:\n添加 Floyd 的 compaction-filter 的 Gtest\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\nPika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷\nhttps://github.com/OpenAtomFoundation/pika/pull/2753\n1.8 跨平台\nPikiwiDB(Pika) 以往仅支持 centos 和 ubuntu 等 linux 平台,v3.5 开始支持 Mac 等平台。v4.0.0 将对 Mac 平台的支持扩展至 FreeBSD 平台。\n关键 PR:\nPika 支持在 FreeBSD14 平台上进行编译\nhttps://github.com/OpenAtomFoundation/pika/pull/2711\n2 改进列表\n下面详细列出了本次发版的主要功能升级和改进。\n2.1 新特性\n\n+ Pika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷\n https://github.com/OpenAtomFoundation/pika/pull/2753\n+ Pika 支持在 FreeBSD14 平台上进行编译打包\n https://github.com/OpenAtomFoundation/pika/pull/2711\n+ Pika 线程整理,避免启动过多无用线程,对不同的线程进行命名,方便问题定位\n https://github.com/OpenAtomFoundation/pika/pull/2697\n+ Mget 支持多 key 查询缓存, 记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能\n https://github.com/OpenAtomFoundation/pika/pull/2675\n+ Codis 支持 info 命令, 可以通过该命令查询 Codis-proxy 的 info 信息\n https://github.com/OpenAtomFoundation/pika/pull/2688\n+ 添加 Floyd 的 compaction-filter 的 Gtest\n https://github.com/OpenAtomFoundation/pika/pull/2669\n+ Codis-proxy 新增 P99 P95 等监控耗时指标\n https://github.com/OpenAtomFoundation/pika/pull/2668\n+ 添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表\n https://github.com/OpenAtomFoundation/pika/pull/2663\n+ Pika 主从复制新增监控指标 repl_connect_status, 可以更加明确清晰的确定当前的主从复制的状态\n https://github.com/OpenAtomFoundation/pika/pull/2638\n+ Pika 不支持不同类型的重复 key, 写入重复 key 返回非法类型\n https://github.com/OpenAtomFoundation/pika/pull/2609\n+ 添加支持分区索引过滤的功能\n https://github.com/OpenAtomFoundation/pika/pull/2601\n+ Pika 支持第三代存储引擎 Floyd, 通过支持多 rocksdb 实例、对 Blob 的使用进行优化、对过期数据的清理进行优化,提升了 Pika 实例的读写性能\n https://github.com/OpenAtomFoundation/pika/pull/2413\n\n2.2 bug 修复\n\n+ 修复 iter 未被析构,导致 pkpatternmatchdel 在返回之前不会删除 iter,这可能会导致 rocksdb 永远引用一个版本,导致数据不符合预期的问题\n https://github.com/OpenAtomFoundation/pika/pull/2785\n+ 修复 config 参数 min-blob-size 带单位时解析错误的问题\n https://github.com/OpenAtomFoundation/pika/pull/2767\n+ 修复 zverank 返回值异常的问题\n https://github.com/OpenAtomFoundation/pika/pull/2673\n+ 修复 Pika-port 传输数据过程中报错的问题\n https://github.com/OpenAtomFoundation/pika/pull/2758\n+ 修复因为堆上分配的缓冲区越界导致 Dbsize 命令运行时崩溃的问题\n https://github.com/OpenAtomFoundation/pika/pull/2749\n+ 修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题\n https://github.com/OpenAtomFoundation/pika/pull/2746\n+ 修复参数未初始化导致 slotsscan 等命令不能和 bgsave 命令相互制衡的问题\n https://github.com/OpenAtomFoundation/pika/pull/2745\n+ 修复 Slotmigrate 迁移数据的过程中,返回值设置错误,异常场景下会终止数据迁移的问题\n https://github.com/OpenAtomFoundation/pika/pull/2741\n+ 修复 Mget 没有使用解析 ttl 的函数导致出现部分key的ttl未被更新,数据不一致的问题\n https://github.com/OpenAtomFoundation/pika/pull/2730\n+ 修复 pkpatternmatchdel 命令使用错误导致的 stream 类型数据删除异常的问题\n https://github.com/OpenAtomFoundation/pika/pull/2726\n+ 修复 pkpatternmatchdel 不能正确删除掉对应的 keys 的问题\n https://github.com/OpenAtomFoundation/pika/pull/2717\n+ 修复 ACL 密码验证错误问题\n https://github.com/OpenAtomFoundation/pika/pull/2714\n+ 修复 Keyspace 命令未计算 Stream 类型数据的问题\n https://github.com/OpenAtomFoundation/pika/pull/2705\n+ 对部分命令定制化处理逻辑,避免写 binlog 导致从节点的 binlog 解析失败的问题\n https://github.com/OpenAtomFoundation/pika/pull/2793\n+ 修复 Pika cmdID 赋值在 Cmd 初始函数中,可能会导致并发构造的时候出现内存泄漏的问题\n https://github.com/OpenAtomFoundation/pika/pull/2692\n+ 修复 ExpectedStale 未考虑 String 类型, 如果存在已经过期的 String 类型的 key, ExpectedStale 会返回错误的问题\n https://github.com/OpenAtomFoundation/pika/pull/2682\n+ 修复 Spop 在写 binlog 时可能会出现竞态问题\n https://github.com/OpenAtomFoundation/pika/pull/2674\n+ db instance 设置不合理时,给用户错误提示\n https://github.com/OpenAtomFoundation/pika/pull/2672\n+ 修复 server_stat 中的数据竞态问题\n https://github.com/OpenAtomFoundation/pika/pull/2671\n+ 修复多 DB 下全量同步超时后不重试的问题\n https://github.com/OpenAtomFoundation/pika/pull/2667\n+ 修复多 DB 下全量同步超时后不重试的问题\n https://github.com/OpenAtomFoundation/pika/pull/2666\n+ 修复主从同步限速逻辑中重复解锁的问题\n https://github.com/OpenAtomFoundation/pika/pull/2657\n+ 发版支持自动打包 centos7 和 centos8 平台的二进制编译包\n https://github.com/OpenAtomFoundation/pika/pull/2535\n+ 修复 Codis 侧的 getrange 命令没有返回预期结果的问题\n https://github.com/OpenAtomFoundation/pika/pull/2510\n\n2.3 提升改进项\n\n+ 更新 Pika Docker Readme, 可以按照 Readme 在 Docker 中部署 Pika 服务\n https://github.com/OpenAtomFoundation/pika/pull/2743\n+ 优化重复查询 meta value 导致影响 Pika 服务读写性能的问题\n https://github.com/OpenAtomFoundation/pika/pull/2735\n+ 支持对更多的 RocksDB 参数进行动态调整,用户根据不同的业务使用场景调整参数提升 Pika 的读写性能\n https://github.com/OpenAtomFoundation/pika/pull/2728\n+ 对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操作与 String 操作明确区分开\n https://github.com/OpenAtomFoundation/pika/pull/2720\n+ 更新了 PR 标题验证,不允许在标题末尾出现中文字符\n https://github.com/OpenAtomFoundation/pika/pull/2718\n+ 重构主从复制模式 slave 节点的主从同步线程模型,尽可能减少 binlog 消费阻塞问题\n https://github.com/OpenAtomFoundation/pika/pull/2638\n+ 新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗\n https://github.com/OpenAtomFoundation/pika/pull/2538\n\n2.4 发版 tag\n\n https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0\n3 社区\n感谢所有为 v4.0.0 做出贡献的社区成员,包括 issue/PR 提交者、代码 reviewer 【排名不分先后,依据字母序列】:\n\n AlexStocks\n\n baerwang\n\n chejinge\n\n cheniujh\n\n chienguo\n\n guangkun123\n\n gukj-spel\n\n longfar-ncy\n\n lqxhub\n\n luky116\n\n Mixficsol\n\n saz97\n \n wangshao1\n\nPikiwiDB (Pika) 开源社区热烈欢迎您的参与和支持。如果您有任何问题、意见或建议,请扫码添加 PikiwiDB 小助手【微信号: PikiwiDB】为好友,它会拉您加入官方微信群。\n\n![2024-07-08-PikiwiDB(Pika)-4.0.0-connect](2024-07-08-PikiwiDB(Pika)-4.0.0-connect.png)"},{"id":"Pika-3.5.4","metadata":{"permalink":"/blog/Pika-3.5.4","source":"@site/blog/2024-05-16-Pika-3.5.4.md","title":"What's new in Pika v3.5.4","description":"PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。","date":"2024-05-16T00:00:00.000Z","tags":[],"readingTime":5.935,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbogo示土区"}],"frontMatter":{"title":"What's new in Pika v3.5.4","slug":"Pika-3.5.4","authors":[{"name":"于雨","title":"dubbogo示土区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in PikiwiDB(Pika) v4.0.0","permalink":"/blog/PikiwiDB-Pika--4.0.0"},"nextItem":{"title":"What's new in Pika v3.5.3 ","permalink":"/blog/Pika-3.5.3"}},"content":"PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。\nv3.5.4 解决了历史遗留的 bug,对 PikiwiDB(Pika) 的一些遗留 bug 进行修复和优化,旨在打造出一个高稳定性的版本。本次的重点优化主要包括,PikiwiDB(Pika)支持动态调整限速参数、增强 PikiwiDB(Pika) 的客观测性指标、 磁盘 IO 限速支持读限速及写限速等。\n1 新特性\n\n1. Pika 支持动态调整全量同步限速参数 rsync-timeout-ms 和 throttle-bytes-per-second。\n\n自 v3.5.0 版本开始,PikiwiDB(Pika) 服务摒弃了通过子进程内使用原来 rsync 工具进行主从全量同步的逻辑,在 PikiwiDB(Pika) 内部以线程方式【称作 rsync 线程】自行实现了新的全量同步逻辑,避免因为外部进程不可控引起的主从同步问题,根据 360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 主从进行全量同步的过程中,如果遇到某些不利的外部因素,如网络波动,硬件故障(如网卡降速导致的主从网卡速率不匹配)等,可能引起 rsync 线程请求持续超时(PikiwiDB(Pika) 内置 rsync 模块用于全量同步阶段的文件传输),且超时重试所发出的包可能引发更大的网络信道负担。此时对于运维人员来说,如果能动态调整 rsync 请求的超时时间和 rsync 传输的速率上限,不仅意味着对全量同步阶段控制粒度的进一步细化,更大大降低了在该场景下的运维处置难度。\n\n关键PR:\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2633\n\n2. 将 info key space 1 的结果输出至 info all 并展示到监控界面中。\n\nPikiwiDB(Pika) 是通过 Info 命令采集数据至 Pika-Exporter,展示到 Grafana 界面上的,目前界面上部分数据是没有展示的,如 keys 的数量,本次将执行 info keyspace 的结果展示到监控界面,用户可以通过这个指标来查看存储的量级等。\n\n关键PR:\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2603\n\n3.Pika 磁盘IO 限速参数支持 OnlyRead、OnlyWrite、ReadAndWrite,默认支持OnlyWrite。\n\n自3.5.0版本开始,PikiwiDB(Pika) 服务可以通过调整 rate-limit 参数实现写限速,防止在网卡质量不高的情况下磁盘 IO 过重导致服务不可用,或者 binlog 阻塞的情况发生。360内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 实例的网卡较差情况下,也需要对读实例进行限速,本次修改支持读、写限速,默认是写限速,调整 config 配置中的 rate-limiter-mode 可以设置为读限速,或者同时读写限速。\n\n关键PR:\n\n https://github.com/OpenAtomFoundation/pika/pull/2599\n\n2 改进列表\n\n slotmigrate 添加 go test。\n\n https://github.com/OpenAtomFoundation/pika/pull/2576\n\n INFO 命令耗时优化,降低查磁盘频率,避免因为数据采集调用 info 命令时查磁盘太过频繁导致服务性能下降。\n\n https://github.com/OpenAtomFoundation/pika/pull/2554\n\n 对五种基本数据类型命令增加 Redis tcl 测试。\n\n https://github.com/OpenAtomFoundation/pika/pull/2527\n\n3 Bug 修复\n\n 修复使用 Pika Exporter 时可能会出现 slots 分配不均衡的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2651\n\n 修复 Codis dashboard 不能正确更新 master 实例状态的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2650\n\n 修复 Redis 事务 binlog 解析失败导致的主从同步异常问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2642\n\n 修复 Pika Expoter 启动时不带参数导致启动失败问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2640\n\n 修复使用 Pika Operater 拉起集群 Codis-proxy panic 的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2633\n\n 修复 CI 编译出的二进制进行自动化测试时 cp 命令失败问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2614\n\n 修复变量未初始化导致 cache 启动失败的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2613\n\n 修复 userpass 和 userblacklist 动态修改参数功能异常问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2600\n\n 修复 scard sscan 结果不一致的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2596\n\n 修复当 max-rsync-parallel-num 大于4,slave 会在主从复制时 coredump 的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2595\n\n 调整不常用的线程池线程数,避免因为空跑导致性能损耗。\n\n https://github.com/OpenAtomFoundation/pika/pull/2590\n\n 修复 Pika 事务边缘测试 case 不通过的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2586\n\n 将 cache-model 修改成 cache-mode。\n\n https://github.com/OpenAtomFoundation/pika/pull/2585\n\n 修复使用 info keyspace 后,info all 死锁的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2584\n\n 修复因修改 zsetscorekey comparator impl 字典序比较熟顺序,导致 353 352极端场景不兼容的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2583\n\n 修复 compact 死锁的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2581\n\n Slotmigrate 添加 go test。\n\n https://github.com/OpenAtomFoundation/pika/pull/2576\n\n 更新 Pika Operater 使用的 pika 版本。\n\n https://github.com/OpenAtomFoundation/pika/pull/2572\n\n 修复 config rewrite 后 blockcache 数值异常的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2561\n\n 修复 slotmigrate 动态修复后值错误的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2548\n\n 修复 spop 可能会出现主从数据不一致的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2541\n\n 修复 CloseFd(it->second[i]) 出现越界的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2539\n\n 修复 Flushall 和 FlushDB 死锁的隐患,并删除 FlushSubDB 接口。\n\n https://github.com/OpenAtomFoundation/pika/pull/2533\n\n 增加参数控制是否清理 tcl 测试后产生的数据文件,防止废弃数据占据磁盘。\n\n https://github.com/OpenAtomFoundation/pika/pull/2507\n\n![2024-05-16-Pika-3.5.4-connect.png](2024-05-16-Pika-3.5.4-connect.png)"},{"id":"Pika-3.5.3","metadata":{"permalink":"/blog/Pika-3.5.3","source":"@site/blog/2024-03-27-Pika-3.5.3.md","title":"What's new in Pika v3.5.3 ","description":"随着 Redis 宣布采用双协议以维护其商业利益之际,PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.3 正式生产可用版本现已发布。","date":"2024-03-27T00:00:00.000Z","tags":[],"readingTime":14.535,"hasTruncateMarker":false,"authors":[{"name":"360 中间件团队","title":"Pika 开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.3 ","slug":"Pika-3.5.3","authors":[{"name":"360 中间件团队","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.4","permalink":"/blog/Pika-3.5.4"},"nextItem":{"title":"What's new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"}},"content":"随着 Redis 宣布采用双协议以维护其商业利益之际,PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.3 正式生产可用版本现已发布。\n\nv3.5.3 解决了历史遗留的 Bug,引入了多项新特性。这些特性主要包括 Pika 支持 ACL、删除 Sharing 模式残留的 Slot 代码、快慢命令分离、 Redis Stream、大 key 分析工具、Pika 分布式集群支持全自动化 failover 等功能,同时,我们在 3.5.3 版本丰富了更多的自动化测试 case,提升 Pika 服务的稳定性和健壮性,会让用户感受到更为高效和稳定的使用体验,本文主要阐述本次改动的相关重大 feature、bugfix 性能提升项。\n\n在深入探讨 3.5.3 版本的更新内容之前,请注意以下几点声明:\n\n1. 由于商标问题,Pika 项目已更名为 PikiwiDB。文中以 PikiwiDB(Pika) 指代项目 \n https://github.com/OpenAtomFoundation/pika\n2. 我们新创建了一个项目 \n https://github.com/OpenAtomFoundation/pikiwidb\n 这是一个基于 Raft 协议实现的兼容 Redis 协议的大容量 KV 数据库,主要面向强一致性数据场景,例如存储约 10TiB 规模的元数据。PikiwiDB 将专门用于指代此项目。\n3. 我们为 PikiwiDB 设计了一个新的 logo,作为其商标,并已在相关政府机构注册。\n\n![2024-03-27-Pika-3.5.3-logo](2024-03-27-Pika-3.5.3-logo.png)\n\n1 重大改进\n\n1.1 PikiwiDB(Pika) 支持 ACL\n\nPikiwiDB(Pika) 3.5.3 版本正式全面支持 Redis ACL,为未来在云原生 Pika 集群中支持多租户场景奠定了基础。在此之前,Pika 已经支持了 Redis 的用户认证方式,如 auth/userpass/requirepass,以及通过 pika.conf 中的 userblacklist 配置命令黑名单模式。本次更新保持了向后兼容,并支持这些已有的使用方式。\n\n我们还确保 PikiwiDB(Pika) 的 ACL 实现与 Redis ACL 完全兼容,通过将 Redis 的所有 ACL TCL 测试集纳入 PikiwiDB(Pika) 的测试集中。\n\n关键 PR:\n+ PikiwiDB(Pika) 支持 ACL\n https://github.com/OpenAtomFoundation/pika/pull/2013\n+ 修正 ACL 用户认证错误问题\n https://github.com/OpenAtomFoundation/pika/pull/2449\n+ ACL 向前兼容 userblacklist\n https://github.com/OpenAtomFoundation/pika/pull/2459\n+ 添加 Redis ACL 测试集\n https://github.com/OpenAtomFoundation/pika/pull/2495\n\n1.2 混合存储模型支持 bitmap \n\n在单体环境下,同时优化 PikiwiDB(Pika) 的读/写/compaction 是一项挑战。在 v3.5.2 版本中,我们引入了由缓存 Redis 和 RocksDB 构成的混合存储模型,并支持了 string/list/set/zset/hashtable 五种数据结构。在 3.5.3 版本中,我们增加了对 bitmap 的支持。\n\n此外,我们在 3.5.3 版本中支持对 Redis 缓存进行动态参数调整。\n\n关键 PR 链接:\n\n\n+ 支持 bitmap 的支持:\n https://github.com/OpenAtomFoundation/pika/pull/2253\n\n+ 另外,我们在 3.5.3 版本中支持对 Redis 缓存进行动态调参:\n https://github.com/OpenAtomFoundation/pika/pull/2197\n\n1.3 快慢命令分离\n\n+ 为了防止慢命令把快命令执行卡死,我们在 Codis-Proxy 和 PikiwiDB(Pika) 两个层面都实现了快慢命令分离。 \n https://github.com/OpenAtomFoundation/pika/pull/2162\n\n1.4 Redis Stream\n\n虽然 PikiwiDB(Pika) 之前支持了 Redis pubsub,但它只能进行在线消息传递。在 3.5.3 版本中,我们增加了对 Redis Stream 的有限支持,类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,我们在底层引擎 BlackWidow 中特别添加了对 Stream 数据类型的支持。\n关键 PR: \n+ Pika 支持 Redis Stream\n https://github.com/OpenAtomFoundation/pika/pull/1955\n请注意,Pika Stream 目前还不支持消费组消费,这将在后续版本中实现。\n\n1.5 云原生集群\n\n在 PikiwiDB(Pika) 3.5.0 版本中,我们开源了 Pika-Operator,它支持在 K8s 上部署 Pika 主从对。在 3.5.2 版本中,我们基于 Kubeblocks 的 Pika-Operator 支持了在 K8s 上部署类似 Codis 的 Pika Cluster,但当时还不支持动态扩缩容。\n\n在 3.5.3 版本中,最新的 Pika-Operator 已经支持了 Codis Group 级别的节点扩缩容,并且支持数据的 Rebalance。\n关键 PR:\n\n+ PikiwiDB(Pika) Operator 支持 pika 集群自动扩容\n https://github.com/OpenAtomFoundation/pika/pull/2121\n\n+ 优化 codis slot 迁移速度,支持动态修改迁移线程和速度\n https://github.com/OpenAtomFoundation/pika/pull/2486\n\n+ Pika-operator 支持 namespace,在不同的 namespace 下部署不同的集群\n https://github.com/OpenAtomFoundation/pika/pull/2480\n\n+ Pika-operator 支持监控指标采集,自动拉起 pika-expoter\n\n https://github.com/OpenAtomFoundation/pika/pull/2451\n1.6 Compaction 改进\n\nPikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。\n有关 compaction 的关键优化 PR 如下:\n\n+ 添加 CompactRange 命令支持对一定范围内的 key 进行 compact\n https://github.com/OpenAtomFoundation/pika/pull/2163\n+ 提升 Compaction 速度减少 Compaction 耗时 \n https://github.com/OpenAtomFoundation/pika/pull/2172\n+ 执行 shutdown 命令时调用 disable compaction, 提升进程退出速度\n https://github.com/OpenAtomFoundation/pika/pull/2345\n\n1.7 自动 Failover\n\nPikiwiDB(Pika) 集群目前是基于 Codis 实现的。为了提高基于 Codis 的 PikiwiDB(Pika) Cluster 的易用性,我们对 Codis 进行了许多扩展。\n\n原始的 Codis 不支持 Group 内的 Failover,需要使用 Redis Sentinel,这会导致运维成本增加。我们在 Codis Dashboard 中加入了 sentinel 的功能,实现了对 Group 内主从的自动 failover。\n\n关键 PR:\n\n+ PikiwiDB(Pika) 分布式集群支持自动 failover\n https://github.com/OpenAtomFoundation/pika/pull/2386\n\n1.8 可观测性提升\n\nPikiwiDB(Pika) 的可观测性关键组件是 Pika-Exporter。在 3.5.2 版本中,我们虽然添加了 Redis Cache 缓存热数据,但缺少监控指标。在 3.5.3 版本中,我们增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标。\n\n关键 PR:\n\n+ PikiwiDB(Pika) exporter 暴露 cache 相关的数据采集指标 \n https://github.com/OpenAtomFoundation/pika/pull/2318\n+ PikiwiDB(Pika) 分布式集群 Codis proxy 新增可观测指标 \n https://github.com/OpenAtomFoundation/pika/pull/2199\n+ 修复dbsize 计算错误问题 \n https://github.com/OpenAtomFoundation/pika/pull/2494\n+ 修复网络监控指标统计不准确的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2234\n1.9 数据一致性\n3.5.3 版本修复了许多 PikiwiDB(Pika) 主从同步问题,确保数据的一致性。\n\n关键 PR:\n\n+ 修复主从复制过程中, slave 节点收到 master 异常回包后的处理逻辑 \n https://github.com/OpenAtomFoundation/pika/pull/2319\n+ 修复 Pika cache 部分场景下 cache 和 DB 数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2225\n+ 修复全量复制失败后,未做处理导致数据丢失问题 \n https://github.com/OpenAtomFoundation/pika/pull/2439\n+ 修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求 \n https://github.com/OpenAtomFoundation/pika/pull/2437\n+ 全量复制过程中,添加数据同步状态,明确数据同步进度 \n https://github.com/OpenAtomFoundation/pika/pull/2430\n+ 修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2409\n+ 修复迁移数据后数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2485\n\n\n1.10 添加测试集\n\nPikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成:\n\n+ gtest 单测主要测试 Pika C++ 代码\n+ Redis TCL 测试集来自 Redis,用于测试 PikiwiDB(Pika) 对 Redis 标准命令兼容度\n+ Go 测试集可对 Pika 进行 Redis 命令测试、主从和 Codis 集群 e2e 测试 \n\n3.5.3 中添加了 Codis 集群 e2e 测试,关键 PR 如下:\n\n\n+ 丰富了 Pika TCL 测试集 \n https://github.com/OpenAtomFoundation/pika/pull/2497\n+ 丰富了 Pika Gotest 测试集 \n https://github.com/OpenAtomFoundation/pika/pull/2502\n\n1.11 工具集 \nPikiwiDB(Pika) 一直重视工具集的建设,所有相关工具都可以在 https://github.com/OpenAtomFoundation/pika/tree/unstable/tools 中找到。在 3.5.3 版本中,我们新增了一个工具:\n\nPikiwiDB(Pika) 支持大 key 分析工具\n https://github.com/OpenAtomFoundation/pika/pull/2195\n\n1.12 文档更新\n\nPikiwiDB(Pika) 的文档主要是 wiki 文档。在 3.5.3 版本中,我们更新了 Pika 支持的 Redis 命令文档。\n\n文档链接: https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5\n2 改进列表\n\n在第一章节中,我们概述了 3.5.3 版本的主要功能升级和改进。下面详细列出了本次发版的相关 PR。\n\n2.1 新特性\n\n+ Pika 支持 ACL \n\n https://github.com/OpenAtomFoundation/pika/pull/2013\n\n+ 在全量复制的过程中,pika 服务的从节点不接收读请求 \n\n https://github.com/OpenAtomFoundation/pika/pull/2197\n+ 删除 Sharing 模式残留的 Slot 代码,回归 3.0,以后一个 Pika 下有多个 DB,每个 DB 只有一个 Blackwidow \n https://github.com/OpenAtomFoundation/pika/pull/2251\n+ 在 Codis dashboard 协程 panic 时自动恢复服务 \n https://github.com/OpenAtomFoundation/pika/pull/2349\n+ Pika cache 新增 bimap数据类型 \n https://github.com/OpenAtomFoundation/pika/pull/2253\n+ Pika 支持快慢命令分离 \n https://github.com/OpenAtomFoundation/pika/pull/2162\n+ Pika exporter 暴露 cache 相关的数据采集指标 \n https://github.com/OpenAtomFoundation/pika/pull/2318\n+ Pika 执行完成 Bgsave 后, 保留 unix timepoint \n https://github.com/OpenAtomFoundation/pika/pull/2167\n+ Pika 支持动态配置 disable_auto_compations 参数 \n https://github.com/OpenAtomFoundation/pika/pull/2257\n+ Pika 支持 Redis Stream \n https://github.com/OpenAtomFoundation/pika/pull/1955\n+ Pika 支持大 key 分析工具 \n https://github.com/OpenAtomFoundation/pika/pull/2195\n+ Pika 支持动态调整 Pika cache 参数 \n https://github.com/OpenAtomFoundation/pika/pull/2197\n+ 更新 Pika benchmark 工具支持更多的接口压测 \n https://github.com/OpenAtomFoundation/pika/pull/2222\n+ Pika Operator 支持 pika 集群自动扩容 \n https://github.com/OpenAtomFoundation/pika/pull/2121\n+ 添加 CompactRange 命令支持对一定范围内的 key 进行 compact \n https://github.com/OpenAtomFoundation/pika/pull/2163\n+ 提升 Compaction 速度减少 Compaction 耗时 \n https://github.com/OpenAtomFoundation/pika/pull/2172\n+ 升级 RocksDB 版本到 v8.7.3 \n https://github.com/OpenAtomFoundation/pika/pull/2157\n+ Pika 分布式集群 Codis proxy 新增可观测指标 \n https://github.com/OpenAtomFoundation/pika/pull/2199\n+ Pika 分布式集群支持自动 failover \n https://github.com/OpenAtomFoundation/pika/pull/2386\n+ Pika 支持 redis rename-command 功能 \n https://github.com/OpenAtomFoundation/pika/pull/2455\n+ 优化 codis slot 迁移速度,支持动态修改迁移线程和速度 \n https://github.com/OpenAtomFoundation/pika/pull/2486\n+ Pika 支持动态调整 max-conn-rbuf-size 参数 \n https://github.com/OpenAtomFoundation/pika/pull/2434\n+ Pika-operator 支持 namespace,可以在不同的 namespace 下部署不同的集群 \n https://github.com/OpenAtomFoundation/pika/pull/2480\n+ Pika-operator 支持监控指标采集,自动拉起 pika-expoter \n https://github.com/OpenAtomFoundation/pika/pull/2451\n+ ACL 向前兼容 userblacklist \n https://github.com/OpenAtomFoundation/pika/pull/2459\n+ 丰富了 Pika TCL 测试集 \n https://github.com/OpenAtomFoundation/pika/pull/2497\n+ 丰富了 Pika Gotest 测试集 \n https://github.com/OpenAtomFoundation/pika/pull/2502\n\n2.2 bug 修复\n\n+ 修复 Pika 有从节点进行全量复制期间会误删除 dump 文件的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2377\n+ 修复主从复制过程中, slave 节点收到 master 异常回包后的处理逻辑 \n https://github.com/OpenAtomFoundation/pika/pull/2319\n+ 在 Pika 执行 shutdown 命令时调用 disable compaction, 提升进程退出速度 \n https://github.com/OpenAtomFoundation/pika/pull/2345\n+ 修复 Codis-dashboard Redis Memory 值不准确的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2337\n+ INFO 命令耗时优化,降低查磁盘使用量的频率 \n https://github.com/OpenAtomFoundation/pika/pull/2197\n+ 修复 Rsync 删除临时文件路径不对,删除失败,导致rocksdb打开失败的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2186\n+ 修复 Compact ,Bgsave ,Info keyspace 命令未指定db名称,导致部分命令 coredump 的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2194\n+ Codis dashboard 用 info replication 替代 info 命令查寻 master ip 降低对 Pika 的性能影响 \n https://github.com/OpenAtomFoundation/pika/pull/2198\n+ 修复 Pika cache 使用边缘case,解决部分场景下 cache 和 DB 数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2225\n+ 修复当 dump 文件夹为空时,会启动报错 Segmentation fault 的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2265\n+ 修复因为 flag 计算错误,导致的部分命令缓存没有生效问题 \n https://github.com/OpenAtomFoundation/pika/pull/2217\n+ 修复主从复制模式下,主实例 flushdb 后,从实例因为死锁导致的不能访问的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2249\n+ 修复部分命令未对 RocksDB 的返回值进行判断的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2187\n+ 规范函数的返回值及初始值 \n https://github.com/OpenAtomFoundation/pika/pull/2176\n+ 修复网络监控指标统计不准确的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2234\n+ 修复配置文件加载部分参数异常的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2218\n+ 修复 Codis dashboard cpu 100% 的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2393\n+ 修复 Codis fe pika 主从角色显示异常的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2387\n+ 修复迁移数据后数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2485 \n+ 修复dbsize 计算错误问题 \n https://github.com/OpenAtomFoundation/pika/pull/2494\n+ 修复扩缩容或者 pod 起停后,Codis-dashboard 界面显示不准确的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2475\n+ 修复 DB 层重复上锁的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2372 \n+ 修复全量复制失败后,未做处理导致数据丢失问题 \n https://github.com/OpenAtomFoundation/pika/pull/2439\n+ 修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求 \n https://github.com/OpenAtomFoundation/pika/pull/2437\n+ 全量复制过程中,添加数据同步状态,明确数据同步进度 \n https://github.com/OpenAtomFoundation/pika/pull/2430\n+ 修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2409\n+ 修复 codis slot 迁移过程中 master 实例 coredump 的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2415\n+ 修复在主从复制过程中,删除正在使用的 dump 文件的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2377\n+ 修复主从复制过程中从实例 rsync 响应错误的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2319\n\n2.3 发版 tag\n https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3\n3 社区\n\n如果你有任何疑问,欢迎加入交流群,PikiwiDB(Pika) 开源社区感谢大家的支持和帮助。\n\n![2024-03-27-Pika-3.5.3-connect](2024-03-27-Pika-3.5.3-connect.png)"},{"id":"Pika-3.5.0","metadata":{"permalink":"/blog/Pika-3.5.0","source":"@site/blog/2023-12-03-Pika-3.5.2.md","title":"What's new in Pika v3.5.0","description":"Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。","date":"2023-12-03T00:00:00.000Z","tags":[],"readingTime":2.575,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.0","slug":"Pika-3.5.0","authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.3 ","permalink":"/blog/Pika-3.5.3"},"nextItem":{"title":"What's new in Pika v3.5.1","permalink":"/blog/Pika-3.5.1"}},"content":"Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。\n\n## 新特性\n\n+ Pika 支持 Redis 事务,使得 Pika 的数据够在一系列命令的执行中保持数据的一致性和可靠性。 https://github.com/OpenAtomFoundation/pika/pull/2124\n+ Pika 上层增加缓存层实现冷热数据分离,提升读性能。 https://github.com/OpenAtomFoundation/pika/pull/2171\n+ Codis-Proxy 支持动态修改配置参数,方便我们做参数调整。 https://github.com/OpenAtomFoundation/pika/pull/2110\n+ 补全 Go Test 测试用例。 https://github.com/OpenAtomFoundation/pika/pull/2082\n+ CI 增加 cache 提升编译速度。 https://github.com/OpenAtomFoundation/pika/pull/2093\n+ 增加 redis-copy 流量复制工具。 https://github.com/OpenAtomFoundation/pika/pull/2060\n\nbugfix\n\n+ 修复 pika 在使用 SETRANGE 命令出现 coredump 的问题。 https://github.com/OpenAtomFoundation/pika/pull/2141\n+ 修复因删除 Clearreplicationid 写进 binlog 导致的全量复制问题。 https://github.com/OpenAtomFoundation/pika/pull/2135\n+ 修改锁粒度,提升 pika 写 binlog 的性能。 https://github.com/OpenAtomFoundation/pika/pull/2129\n+ 修复复杂数据类型成员变量可能出现数据溢出。 https://github.com/OpenAtomFoundation/pika/pull/2106\n+ 修复 decr 命令返回值错误问题。 https://github.com/OpenAtomFoundation/pika/pull/2092\n+ 修复 setrange 和 setbit 命令没有保留原 key 的过期时间的问题。 https://github.com/OpenAtomFoundation/pika/pull/2095\n\n下期版本规划\n\n预计再过两个月左右,我们会在农历新年前发布 3.5.3 版本,相关关键特性有:\n\n+ Pika 通过快慢命令分离提升读写性能。 https://github.com/OpenAtomFoundation/pika/pull/2162\n+ 支持 Redis ACL,在 Pika 中引入用户概念,进行权限控制。 https://github.com/OpenAtomFoundation/pika/pull/2013\n+ 支持 Redis Stream,实现消息队列。 https://github.com/OpenAtomFoundation/pika/pull/1955\n+ 添加 Pika 特有命令 compactrange,对指定范围内的 key 进行 compact 以解决大 key 删除时读放大的问题。 https://github.com/OpenAtomFoundation/pika/pull/2163\n+ 支持 lastsave 指令。 https://github.com/OpenAtomFoundation/pika/pull/2167\n\n感谢大家对 Pika 开源公众号的关注 ,Pika 3.5 版本重大特性及使用规范我们会在稍后的文章中进行介绍,我们下期再见~\n\n![2023-09-28-Pika-3.5.2-connect](2023-12-03-Pika-3.5.2-connect.png)"},{"id":"Pika-3.5.1","metadata":{"permalink":"/blog/Pika-3.5.1","source":"@site/blog/2023-09-28-Pika-3.5.1.md","title":"What's new in Pika v3.5.1","description":"Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 。","date":"2023-09-28T00:00:00.000Z","tags":[],"readingTime":4.385,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.1","slug":"Pika-3.5.1","authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"},"nextItem":{"title":"What's new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"}},"content":"Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 。\n\n该版本不仅做了很多优化工作,还引入了多项新功能。这些新功能包括 动态关闭 WAL、ReplicationID 检测是否增量复制、在 K8s 环境上 Pika 服务的自动注册从而实现集群的自组织、以及 exporter 检测集群指标等等,无疑将会让用户享受到更为稳定和高效的 NoSQL 使用体验。\n\n## 新特性\n\n+ 1 Slow log 增加队列等待时间统计,在队列阻塞的时候方便我们进行问题定位。PR 1997, 作者 wangshao1。\n+ 2 主从复制使用 ReplicationID 判断是否进行增量同步,解决原主从同步方式切主后整个数据集会进行全量复制的问题,可以提升 Pika 性能。PR 1951, 作者 Mixficsol。\n+ 3 WAL 以 'disablewal' 命令方式支持动态关闭,在写性能遇到瓶颈的时候,可以通过命令关闭 WAL 缓解写性能下降的问题,关闭 WAL 有机器宕机后丢失数据的风险,用户需要根据自己的使用习惯权衡。PR 2015,作者 Mixficsol。\n+ 4 flush 线程数和 compaction 线程数合二为一,在 Compaction 性能瓶颈时,可以动态调整线程数,缓解 Comapction 损耗 Pika 性能的问题。PR 2014, 作者 Tianpingan。\n+ 5 升级了 RocksDB 版本到 v8.3.3。PR 2000, 作者 dingxiaoshuai123。\n+ 6 新增周期性打印工作队列的长度功能,在队列阻塞的时候可以快速定位问题。PR 1978, 作者 Tianpingan。\n+ 7 新增利用一个 pika_exporter 监测整个集群的指标,实现一个 Pika Exporter 实例监控整个集群,解决了 3.5.0 版本一个 Pika Exporter 监测一个 Pika 实例消耗资源的问题。PR 1953, 作者 chenbt-hz。\n+ 8 实现在 K8s 环境上 Pika 服务的自动注册,在启动时自动注册,从而实现集群的自组织 ,实现了通过命令拉起整个 Pika Cluster 集群。PR 1931, 作者 machinly。\n\n## 2 bug 修复\n\n+ 1 调整了 Rate_limit 参数,修复了压测时出现 RPS 为 0 的情况 。PR 2009, 作者 Mixficsol。\n+ 2 修复了 INFODATA 命令中对于遍历数据文件时出现空路径的逻辑判断。PR 1996, 作者 Mixficsol。\n+ 3 修复了 Codis 在线上出现大毛刺的问题。PR 2016, 作者 chejinge。\n+ 4 修复了 macOS 环境下编译使用 tools 导致编译不过的问题 。PR 2011, 作者 A2ureStone。\n+ 5 减少了 exporter 非必要日志的打印,降低 了资源利用率。PR 1945, 作者 Mixficsol。\n\n## 3 使用建议\n\n本次新增了几个配置参数,大家在使用过程中,需要根据使用情况按需调整:\n\n+ 1 max-rsync-parallel-num:主从全量复制线程数,需要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 2。\n+ 2 rate-limiter-bandwidth: 限制 RocksDB 数据库读写速度,限制数据库在一定时间内可以读写的数据量,默认 2000MiB/s,需要根据自己的机器性能和部署实例做调整。\n+ max-background-jobs: compaction 和 flushdb 线程数,要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 4。\n+ 3 throttle-bytes-per-second: 主从复制传输限速参数,默认为 200MiB/s,该参数可以根据机器网卡的配置及部署 pika 实例的个数进行调整。\n\n![2023-09-28-Pika-3.5.1-connect.png](2023-09-28-Pika-3.5.1-connect.png)"},{"id":"Pika-3.5.0","metadata":{"permalink":"/blog/Pika-3.5.0","source":"@site/blog/2023-08-25-Pika-3.5.0.md","title":"What's new in Pika v3.5.0","description":"时隔两年,Pika 社区正式发布经由社区 50 多人参与开发并在 360 生产环境验证可用的 v3.5.0 版本,新版本在提升性能的同时,也支持了 Codis 集群部署,BlobDB KV 分离,增加 Exporter 等新特性。","date":"2023-08-25T00:00:00.000Z","tags":[],"readingTime":9.825,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbogo示土区"}],"frontMatter":{"title":"What's new in Pika v3.5.0","slug":"Pika-3.5.0","authors":[{"name":"于雨","title":"dubbogo示土区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.1","permalink":"/blog/Pika-3.5.1"},"nextItem":{"title":"Pika Blackwidow 引擎数据存储格式","permalink":"/blog/pika-blackwidow"}},"content":"时隔两年,Pika 社区正式发布经由社区 50 多人参与开发并在 360 生产环境验证可用的 v3.5.0 版本,新版本在提升性能的同时,也支持了 Codis 集群部署,BlobDB KV 分离,增加 Exporter 等新特性。\n\n我们将详细介绍该版本引入的重要新特性。\n\n## 1 去除 Rsync\n\n在 v3.5.0 版本之前,Pika 使用 Rsync 工具进行引擎中存量数据的同步,Pika 进程启动时创建 Rsync 子进程。这种同步方式在实际使用中出现了一些问题,包括Pika 进程 crash 后重新拉起无法正常同步以及同步过程中 Rsync 进程无故退出等。在今年发布的 v3.5.0 版本中,我们在全量同步方案方面进行了重要的改进,摒弃了以往使用的 Rsync,实现了全新的数据同步方案,支持了断点续传,动态调节传输限速等特性,以确保同步过程更加稳定、可控。这些改进不仅增强了同步的可靠性,还为用户提供了更好的使用体验。\n\n+ 去除 Rsync 进程,使用自研全量同步方式\n https://github.com/OpenAtomFoundation/pika/pull/1805\n\n+ 实现断点续传,传输限速功能\n https://github.com/OpenAtomFoundation/pika/pull/1926\n\n+ Pika 主从同步时,进行 master run_id 的检验\n https://github.com/OpenAtomFoundation/pika/pull/1805\n\n## 2 兼容更多 Redis 命令\n\n在 v3.5.0 版本中,我们迈出了更大的一步,提升了对 Redis 命令的兼容性,对 Redis 命令提供了更广泛的支持。这个版本的改进使得 Pika 在与 Redis 生态系统的集成中表现更加出色,为用户提供了更丰富的功能和更广阔的可能性。我们对命令支持的扩展,为用户提供了更多的灵活性,以满足不同场景下的需求。\n\n+ 支持 UNLINK 命令\n https://github.com/OpenAtomFoundation/pika/pull/1273\n+ 支持 INFO COMMANDSTATS 命令\n https://github.com/OpenAtomFoundation/pika/pull/1660\n+ 支持 HELLO、SETNAME 命令\n https://github.com/OpenAtomFoundation/pika/pull/1245\n+ 支持 BLPOP、BRPOP 命令\n https://github.com/OpenAtomFoundation/pika/pull/1548\n+ 新增 Pika 原创 DISKRECOVERY 命令\n https://github.com/OpenAtomFoundation/pika/pull/1843\n\n## 3 RocksDB 版本升级和分级压缩\n\n在 v3.5.0 版本中,我们进行了一项重要的升级,将 RocksDB 引擎升级至 v8.1.1 版本,并实现了分级压缩功能的整合。这一升级不仅是技术的飞跃,也是我们对系统性能和优化的持续关注的体现。通过这项升级,我们为 Pika 增加了更高级别的数据管理能力,同时也让系统更好地适应不同的压缩需求,为用户的数据存储和检索提供了更大的灵活性和效率。\n\n+ 升级 RocksDB 版本到 v8.1.1\n https://github.com/OpenAtomFoundation/pika/pull/1396\n+ 实现 RocksDB 分级压缩\n https://github.com/OpenAtomFoundation/pika/pull/1365\n+ 新增 RocksDB 缓存配置项 num-shard-bits 能够从配置文件中读取\n https://github.com/OpenAtomFoundation/pika/pull/1189\n\n## 4 支持 BlobDB\n\n在 v3.5.0 版本中,我们引入了引人瞩目的创新--对 BlobDB 和 KV 存储层进行了分离,为我们的系统注入了新的活力。这个版本的升级使得 Pika 在数据存储方面更加灵活和高效。我们通过支持 BlobDB KV 分离,提供了更优化的数据存储结构,为用户的数据管理和查询操作带来了更深层次的优势。这一重要改进将在更多应用场景下展现出其强大的潜力。\n\n+ 支持 BlobDB KV 分离\n https://github.com/OpenAtomFoundation/pika/pull/1456\n\n## 5 基于 Codis 的集群模式\n\n在 v3.5.0 版本中,我们积极引入了 Codis 集群模式,此外,我们不仅仅将 Codis 集群模式融入了系统中,还为其提供了迁移 slot 的命令支持,从而实现了更加智能化的集群管理。这一重大变革不仅扩展了 Pika 在大规模数据存储场景中的应用范围,还进一步提升了系统的可扩展性和高可用性。通过引入 Codis 集群模式,我们对用户的数据处理和管理提供了更优化的解决方案。\n\n+ 引入 Codis 到 Pika\n\n https://github.com/OpenAtomFoundation/pika/pull/1279\n\n+ 引入 Codis 的 CI\n\n https://github.com/OpenAtomFoundation/pika/pull/1311\n\n+ 支持 Codis 迁移 slot 命令\n\n https://github.com/OpenAtomFoundation/pika/pull/1632\n\n+ 新增是否在 reload 的 slotmigrate 状态\n\n https://github.com/OpenAtomFoundation/pika/pull/1700\n\n## 6 可观测性\n\n在 v3.5.0 版本中,我们引入了一个创新性的工具--pika_exporter,以提升对 Pika 数据库的可观测性。这一工具的加入不仅是对我们对系统监测能力的持续增强的反映。而在版本的后续更新中,我们进一步充实了指标,不断丰富了 Pika 的可观测性。为用户提供了更为全面和精准的数据洞察力。\n\n+ 新增 Pika 可观测系统 pika_exporter\n\n https://github.com/OpenAtomFoundation/pika/pull/1388\n\n+ 新增网络 I/O 流量监控指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1733\n\n+ 新增命令统计耗时指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1751\n\n+ 新增 estimate_pending_compaction_bytes 度量来分析碎片率指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1736\n\n+ 新增 RocksDB 指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1560\n\n## 7 容器化部署\n\n在 v3.5.0 版本中,我们引入了一个具有创新意义的里程碑--pika-operator mvp 版本,这一版本在技术上实现了一个重要目标:将 Pika 单实例服务迁移到 Kubernetes(K8s)平台上的快速部署。这不仅是对我们持续关注行业发展的体现,也是我们不断提升用户体验的追求。通过 pika-operator,我们为用户提供了更便捷的部署方案,将 Pika 的高性能数据库引擎与 Kubernetes 的灵活性相融合,从而为用户的应用环境带来更高效、更弹性的支持。\n\n+ 实现 Pika 单例服务在 K8s 上快速部署\n https://github.com/OpenAtomFoundation/pika/pull/1243\n+ 实现了在 MiniKube 环境中部署 Pika\n https://github.com/OpenAtomFoundation/pika/pull/1330\n+ 给 pika-operator 添加 E2E 测试\n https://github.com/OpenAtomFoundation/pika/pull/1347\n\n## 8 跨平台编译\n\n在 v3.5.0 版本中,Pika 呈现出一种全面性的蓬勃发展态势,得以在不同操作系统平台上展现其优越性。此版本的突破性之处在于,Pika 实现了对 MacOS、CentOS 和 Ubuntu 这些主要平台的完整编译和使用支持。这个举措不仅仅体现了我们对多样化技术环境的关注,也是为了最大程度地拓展用户基础,为广泛的用户群体提供灵活、高效的数据库解决方案。这种跨平台兼容性的加强将 Pika 推向更广阔的技术生态。\n\n+ 支持 MacOS 平台\n https://github.com/OpenAtomFoundation/pika/pull/1372\n\n## 9 多平台集成测试及单元测试\n\n在 v3.5.0 版本中,我们迈出了一个令人瞩目的步伐,不仅在多个主要操作系统平台上实现了支持,还在测试领域实施了全面升级。我们为 Ubuntu、CentOS 和 MacOS 这三大平台搭建了持续集成(CI)环境,以确保系统的完整性和稳定性。在测试方面,我们引入了更为广泛的覆盖,包括 Go 语言的集成测试、TCL 的单元测试以及 Python 的端到端(E2E)测试。通过这些测试策略的升级,我们在确保系统性能和可靠性方面迈出了更大的一步。\n\n+ 新增 CentOS 环境下的 CI\n https://github.com/OpenAtomFoundation/pika/pull/1534\n+ 新增 MacOS 环境下的 CI\n https://github.com/OpenAtomFoundation/pika/pull/1769\n+ 新增 E2E 测试框架\n https://github.com/OpenAtomFoundation/pika/pull/1347\n+ 新增在 Github CI Workflow 中添加 CMake 编译环境\n https://github.com/OpenAtomFoundation/pika/pull/1268\n+ 新增在 TCL 脚本中 populate 方法模拟 Redis debug populate 方法,用以填充测试数据\n https://github.com/OpenAtomFoundation/pika/pull/1693\n+ 新增在 blackwidow 中添加 CMake 文件,添加对 blackwidow 的单元测试\n https://github.com/OpenAtomFoundation/pika/pull/1246\n+ 移植 Redis 测试脚本\n https://github.com/OpenAtomFoundation/pika/pull/1357\n\n## 10 Others\n\n若您有任何疑问,诚挚欢迎您扫描微信二维码,加入我们的交流群,与一众志同道合的成员展开深入的讨论,我们热切期待与您分享见解、交流心得,为共同的技术探索和创新之旅添砖加瓦。在这个群体中,我们将以卓越的智慧和互动的合作精神,构建出一个相互学习、不断进步的技术共同体。\n\n![2023-08-25-Pika-3.5.0](2023-08-25-Pika-3.5.0-connect.png)"},{"id":"pika-blackwidow","metadata":{"permalink":"/blog/pika-blackwidow","source":"@site/blog/2020-7-16-pika-blackwidow.md","title":"Pika Blackwidow 引擎数据存储格式","description":"\bBlackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。","date":"2020-07-16T00:00:00.000Z","tags":[],"readingTime":12.29,"hasTruncateMarker":false,"authors":[{"name":"Axlgrep","title":"Pika 开源社区"}],"frontMatter":{"title":"Pika Blackwidow 引擎数据存储格式","slug":"pika-blackwidow","authors":[{"name":"Axlgrep","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"},"nextItem":{"title":"pika_port 迁移工具","permalink":"/blog/Pika-Tools-Port-Bin"}},"content":"\bBlackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。\n\n![pika-blackwidow-1](pika-blackwidow-1.png)\n\n## 1. String结构的存储\nString本质上就是Key, Value, 我们知道Rocksdb本身就是支持kv存储的, 我们为了实现Redis中的expire功能,所以在value后面添加了4 Bytes用于存储timestamp, 作为最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n\n![pika-blackwidow-2](pika-blackwidow-2.png)\n\n如果我们没有对该String对象设置超时时间,则timestamp存储的值就是默认值0, 否则就是该对象过期时间的时间戳, 每次我们获取一个String对象的时候, 首先会解析Value部分的后四字节, 获取到timestamp做出判断之后再返回结果。\n\n## 2. Hash结构的存储\nblackwidow中的hash表由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是hash表的一些信息, 比如说当前hash表的域的数量以及当前hash表的版本号和过期时间(用做秒删功能), 而普通数据主要就是指的同一个hash表中一一对应的field和value,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n1. 每个hash表的meta_key和meta_value的落盘方式:\n![pika-blackwidow-3](pika-blackwidow-3.png)\n\nmeta_key实际上就是hash表的key, 而meta_value由三个部分构成: 4Bytes的Hash size(用于存储当前hash表的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Hash表设置的超时时间的时间戳, 默认为0)\n\n2. hash表中data_key和data_value的落盘方式:\n![pika-blackwidow-4](pika-blackwidow-4.png)\n\ndata_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + Field的内容, 而data_value就是hash表某个field对应的value。\n\n3. 如果我们需要查找一个hash表中的某一个field对应的value, 我们首先会获取到meta_value解析出其中的timestamp判断这个hash表是否过期, 如果没有过期, 我们可以拿到其中的version, 然后我们使用key, version,和field拼出data_key, 进而找到对应的data_value(如果存在的话)\n\n## 3. List结构的存储\nblackwidow中的list由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是list链表的一些信息, 比如说当前list链表结点的的数量以及当前list链表的版本号和过期时间(用做秒删功能), 还有当前list链表的左右边界(由于nemo实现的链表结构被吐槽lrange效率低下,所以这次blackwidow我们底层用数组来模拟链表,这样lrange速度会大大提升,因为结点存储都是有序的), 普通数据实际上就是指的list中每一个结点中的数据,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式\n1. 每个list链表的meta_key和meta_value的落盘方式:\n![pika-blackwidow-5](pika-blackwidow-5.png)\n\nmeta_key实际上就是list链表的key, 而meta_value由五个部分构成: 8Bytes的List size(用于存储当前链表中总共有多少个结点) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个List链表设置的超时时间的时间戳, 默认为0) + 8Bytes的Left Index(数组的左边界) + 8Bytes的Right Index(数组的右边界)\n\n2. list链表中data_key和data_value的落盘方式:\n![pika-blackwidow-6](pika-blackwidow-6.png)\n\ndata_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Index(这个记录的就是当前结点的在这个list链表中的索引), 而data_value就是list链表该node中存储的值\n\n## 4. Set结构的存储\nblackwidow中的set由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是set集合的一些信息, 比如说当前set集合member的数量以及当前set集合的版本号和过期时间(用做秒删功能), 普通数据实际上就是指的set集合中的member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n1. 每个set集合的meta_key和meta_value的落盘方式:\n![pika-blackwidow-7](pika-blackwidow-7.png)\n\nmeta_key实际上就是set集合的key, 而meta_value由三个部分构成: 4Bytes的Set size(用于存储当前Set集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个set集合设置的超时时间的时间戳, 默认为0)\n\n2. set集合中data_key和data_value的落盘方式:\n![pika-blackwidow-8](pika-blackwidow-8.png)\n\ndata_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, 由于set集合只需要存储member, 所以data_value实际上就是空串\n\n## 5. ZSet结构的存储\nblackwidow中的zset由两部部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是zset集合的一些信息, 比如说当前zset集合member的数量以及当前zset集合的版本号和过期时间(用做秒删功能), 而普通数据就是指的zset中每个member以及对应的score, 由于zset这种数据结构比较特殊,需要按照memer进行排序,也需要按照score进行排序, 所以我们对于每一个zset我们会按照不同的格式存储两份普通数据, 在这里我们称为member to score和score to member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n1. 每个zset集合的meta_key和meta_value的落盘方式:\n![](https://i.imgur.com/RhZ8KMw.png)\n\nmeta_key实际上就是zset集合的key, 而meta_value由三个部分构成: 4Bytes的ZSet size(用于存储当前zSet集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Zset集合设置的超时时间的时间戳, 默认为0)\n\n2. 每个zset集合的data_key和data_value的落盘方式(member to score):\n![](https://i.imgur.com/C85Ba5Z.png)\n\nmember to socre的data_key由四个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, data_value中存储的其member对应的score的值,大小为8个字节,由于rocksdb默认是按照字典序进行排列的,所以同一个zset中不同的member就是按照member的字典序来排列的(同一个zset的key size, key, 以及version,也就是前缀都是一致的,不同的只有末端的member).\n\n3. 每个zset集合的data_key和data_value的落盘方式(score to member):\n![](https://i.imgur.com/QV9XHEk.png)\n\nscore to member的data_key由五个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Score + member的内容, 由于score和member都已经放在data_key中进行存储了所以data_value就是一个空串,无需存储其他内容了,对于score to member中的data_key我们自己实现了rocksdb的comparator,同一个zset中score to member的data_key会首先按照score来排序, 在score相同的情况下再按照member来排序\n\n\n## Blackwidow相对于Nemo有哪些优势\n\n1. Blackwidow采用了rocksdb的column families的新特性,将元数据和实际数据分开存放(对应于上面的meta数据和data数据), 这种存储方式相对于Nemo将meta, data混在一起存放更加合理, 并且可以提升查找效率(比如info keyspace的效率会大大提升)\n2. Blackwidow中参数传递大量采用Slice而Nemo中采用的是std::string, 所以Nemo会有很多没有必要的string对象的构造函数以及析构函数的调用,造成额外的资源消耗,而Blackwidow则不会有这个问题\n3. Blackwidow对kv模拟多数据结构的存储格式上做了重新设计(具体可以参考Nemo引擎数据存储格式和本篇文章),使之前在Nemo上出现的一些无法解决的性能问题得以解决,所以Blackwidow的多数据结构在某些场景下性能远远优于Nemo\n4. 原来Nemo对多数据结构的Key的长度最大只能支持到256 Bytes,而Blackwidow经过重新设计,放开了多数据结构Key长度的这个限制\n5. Blackwidow相对于Nemo更加节省空间,Nemo由于需要nemo-rocksdb的支持,所以不管在meta还是data数据部分都追加了version和timestamp这些信息,并且为了区分meta_key和data_key, 在最前面加入s和S(拿Set数据结构打比方),Blackwidow在这方面做了优化,使同样的数据量下Blackwidow所占用的空间比Nemo要小(举个例子,Blackwidow中List结构中的一个Node就比Nemo中的一个Node节省了16 Bytes的空间)\n6. Blackwidow在锁的实现上参照了RocksDB事务里锁的实现方法,而弃用了之前Nemo的行锁,所以在多线程对同一把锁有抢占的情况下性能会有所提升"},{"id":"Pika-Tools-Port-Bin","metadata":{"permalink":"/blog/Pika-Tools-Port-Bin","source":"@site/blog/2020-04-26-Pika-Tools-Port-Bin.md","title":"pika_port 迁移工具","description":"项目作者:","date":"2020-04-26T00:00:00.000Z","tags":[],"readingTime":2.56,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"Pika 开源社区"}],"frontMatter":{"title":"pika_port 迁移工具","slug":"Pika-Tools-Port-Bin","authors":[{"name":"于雨","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Pika Blackwidow 引擎数据存储格式","permalink":"/blog/pika-blackwidow"}},"content":"## 项目作者:\n[AlexStocks](https://github.com/alexstocks)\n\n## 适用版本:\n3.1 和 2.x\n\n## 项目地址:\n[https://github.com/ipixiu/pika-tools](https://github.com/ipixiu/pika-tools)\n\n[https://github.com/Axlgrep/pika-tools 长期维护地址需自行编译](https://github.com/Axlgrep/pika-tools)\n\n## 二进制包:\n[https://github.com/ipixiu/pika-port-bin](https://github.com/ipixiu/pika-port-bin)\n\n## 功能:\n将Pika中的数据在线迁移到Pika、Redis(支持全量、增量同步)\n\n## 开发背景:\n之前Pika项目官方提供的pika_to_redis工具仅支持离线将Pika的DB中的数据迁移到Pika、Redis, 且无法增量同步,该工具可以直接伪装为一个Pika的从库,将主库数据通过同步获取并转发给Pika、Redis,同时并支持增量同步\n\n\n## 实现:\n### trysync线程\n1. 尝试与主库建立同步关系 \n2. 如果需要全同步,则在接收到master的db之后,启动migrator和sender线程将db里面的数据发送给Pika、Redis \n3. 启动Slaveping线程定期给主库发送心跳,完成建立主从关系\n\n### binlog_receiver线程\n1. 接收主库发送过来的binlog并且将其解析成redis命令\n2. 将redis命令转发给Pika、Redis\n\n### migrator线程\n1. 扫描不同数据类型的分库\n2. 将key进行解析成响应数据Pika、redis指令\n3. 将解析好的redis指令加载到sender的发送buf中\n\n### sender线程\n1. 从发送buf中读取数据,以非阻塞方式向Pika、redis发送数据\n2. 接收Pika、redis返回的结果并解析,如果出现错误则显示错误结果\n\n## 使用帮助:\n```\nUsage: \n pika_port [-h] [-t local_ip -p local_port -i master_ip -o master_port\n -m forward_ip -n forward_port -x forward_thread_num -y forward_passwd]\n -f filenum -s offset -w password -r rsync_dump_path -l log_path\n -h -- show this help\n -t -- local host ip(OPTIONAL default: 127.0.0.1)\n -p -- local port(OPTIONAL)\n -i -- master ip(OPTIONAL default: 127.0.0.1)\n -o -- master port(REQUIRED)\n -m -- forward ip(OPTIONAL default: 127.0.0.1)\n -n -- forward port(REQUIRED)\n -x -- forward thread num(OPTIONAL default: 1)\n -y -- forward password(OPTIONAL)\n -f -- binlog filenum(OPTIONAL default: local offset)\n -s -- binlog offset(OPTIONAL default: local offset)\n -w -- password for master(OPTIONAL)\n -r -- rsync dump data path(OPTIONAL default: ./rsync_dump)\n -l -- local log path(OPTIONAL default: ./log)\n -b -- max batch number when port rsync dump data (OPTIONAL default: 512)\n -d -- daemonize(OPTIONAL)\n example: ./pika_port -t 127.0.0.1 -p 12345 -i 127.0.0.1 -o 9221 -m 127.0.0.1 -n 6379 -x 7 -f 0 -s 0 -w abc -l ./log -r ./rsync_dump -b 512 -d\n```"}],"blogListPaginated":[{"items":["PikiwiDB-Pika--4.0.0","Pika-3.5.4","Pika-3.5.3","Pika-3.5.0","Pika-3.5.1","Pika-3.5.0","pika-blackwidow","Pika-Tools-Port-Bin"],"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":8,"blogDescription":"Blog","blogTitle":"Blog"}}],"blogTags":{},"blogTagsListPath":"/blog/tags"}},"docusaurus-plugin-content-pages":{"default":[{"type":"jsx","permalink":"/","source":"@site/src/pages/index.js"}]},"docusaurus-plugin-debug":{},"docusaurus-theme-classic":{},"docusaurus-bootstrap-plugin":{},"docusaurus-mdx-fallback-plugin":{}}} \ No newline at end of file +{"allContent":{"docusaurus-plugin-content-docs":{"default":{"loadedVersions":[{"versionName":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","path":"/docs","tagsPath":"/docs/tags","editUrl":"https://github.com/pikiwidb/website/tree/main/docs","editUrlLocalized":"https://github.com/pikiwidb/website/tree/main/i18n/zh-Hans/docusaurus-plugin-content-docs/current","isLast":true,"routePriority":-1,"sidebarFilePath":"/home/wenyi/project/website/sidebars.js","contentPath":"/home/wenyi/project/website/docs","contentPathLocalized":"/home/wenyi/project/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current","docs":[{"id":"开发文档/编码规范/index","title":"编码规范","description":"c++ coding style","source":"@site/docs/开发文档/编码规范/index.md","sourceDirName":"开发文档/编码规范","slug":"/开发文档/编码规范/","permalink":"/docs/开发文档/编码规范/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/开发文档/编码规范/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"编码规范","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"编码规范","permalink":"/docs/开发文档/"},"next":{"title":"c++ coding style","permalink":"/docs/开发文档/coding-style/"}},{"id":"开发文档/coding-style/index","title":"c++ coding style","description":"header file","source":"@site/docs/开发文档/coding-style/index.md","sourceDirName":"开发文档/coding-style","slug":"/开发文档/coding-style/","permalink":"/docs/开发文档/coding-style/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/开发文档/coding-style/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"c++ coding style","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"编码规范","permalink":"/docs/开发文档/编码规范/"}},{"id":"开发文档/index","title":"编码规范","description":"","source":"@site/docs/开发文档/index.md","sourceDirName":"开发文档","slug":"/开发文档/","permalink":"/docs/开发文档/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/开发文档/index.md","tags":[],"version":"current","sidebarPosition":60,"frontMatter":{"title":"编码规范","sidebar_position":60},"sidebar":"tutorialSidebar","previous":{"title":"Pika 主从同比","permalink":"/docs/设计与实现/Pika 传火计划/主从同步/"},"next":{"title":"编码规范","permalink":"/docs/开发文档/编码规范/"}},{"id":"设计与实现/副本一致性/index","title":"副本一致性","description":"目前线程模型","source":"@site/docs/设计与实现/副本一致性/index.md","sourceDirName":"设计与实现/副本一致性","slug":"/设计与实现/副本一致性/","permalink":"/docs/设计与实现/副本一致性/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/副本一致性/index.md","tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"title":"副本一致性","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"主从同步","permalink":"/docs/设计与实现/主从同步/"},"next":{"title":"Pika 与 Codis","permalink":"/docs/设计与实现/Pika 与 Codis/"}},{"id":"设计与实现/旧存储结构/index","title":"旧存储结构","description":"Blackwidow 本质上是基于 rocksdb 的封装,使本身只支持 kv 存储的 rocksdb 能够支持多种数据结构, 目前 Blackwidow 支持五种数据结构的存储:String 结构(实际上就是存储 key, value), Hash 结构,List 结构,Set 结构和 ZSet 结构, 因为 Rocksdb 的存储方式只有 kv 一种, 所以上述五种数据结构最终都要落盘到 Rocksdb 的 kv 存储方式上,下面我们展示 Blackwidow 和 rocksdb 的关系并且说明我们是如何用 kv 来模拟多数据结构的。","source":"@site/docs/设计与实现/旧存储结构/index.md","sourceDirName":"设计与实现/旧存储结构","slug":"/设计与实现/旧存储结构/","permalink":"/docs/设计与实现/旧存储结构/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/旧存储结构/index.md","tags":[],"version":"current","sidebarPosition":14,"frontMatter":{"title":"旧存储结构","sidebar_position":14},"sidebar":"tutorialSidebar","previous":{"title":"NoSQL 原理概述","permalink":"/docs/设计与实现/NoSQL 原理概述/"},"next":{"title":"新存储结构","permalink":"/docs/设计与实现/新存储结构/"}},{"id":"设计与实现/快照式备份/index","title":"快照式备份","description":"原理","source":"@site/docs/设计与实现/快照式备份/index.md","sourceDirName":"设计与实现/快照式备份","slug":"/设计与实现/快照式备份/","permalink":"/docs/设计与实现/快照式备份/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/快照式备份/index.md","tags":[],"version":"current","sidebarPosition":12,"frontMatter":{"title":"快照式备份","sidebar_position":12},"sidebar":"tutorialSidebar","previous":{"title":"Pika 与 Codis","permalink":"/docs/设计与实现/Pika 与 Codis/"},"next":{"title":"NoSQL 原理概述","permalink":"/docs/设计与实现/NoSQL 原理概述/"}},{"id":"设计与实现/全同步/index","title":"全同步","description":"背景","source":"@site/docs/设计与实现/全同步/index.md","sourceDirName":"设计与实现/全同步","slug":"/设计与实现/全同步/","permalink":"/docs/设计与实现/全同步/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/全同步/index.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"全同步","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"锁的应用","permalink":"/docs/设计与实现/锁的应用/"},"next":{"title":"增量同步","permalink":"/docs/设计与实现/增量同步/"}},{"id":"设计与实现/锁的应用/index","title":"锁的应用","description":"pika作为类redis的存储系统,为了弥补在性能上的不足,在整个系统中大量使用多线程的结构,涉及到多线程编程,势必需要为线程加锁来保证数据访问的一致性和有效性。其中主要用到了三种锁","source":"@site/docs/设计与实现/锁的应用/index.md","sourceDirName":"设计与实现/锁的应用","slug":"/设计与实现/锁的应用/","permalink":"/docs/设计与实现/锁的应用/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/锁的应用/index.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"锁的应用","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"线程模型","permalink":"/docs/设计与实现/线程模型/"},"next":{"title":"全同步","permalink":"/docs/设计与实现/全同步/"}},{"id":"设计与实现/线程模型/index","title":"线程模型","description":"pika使用的是多线程模型,使用多个工作线程来进行读写操作,由底层blackwidow引擎来保证线程安全,线程分为12种:","source":"@site/docs/设计与实现/线程模型/index.md","sourceDirName":"设计与实现/线程模型","slug":"/设计与实现/线程模型/","permalink":"/docs/设计与实现/线程模型/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/线程模型/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"线程模型","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"整体技术架构","permalink":"/docs/设计与实现/整体技术架构/"},"next":{"title":"锁的应用","permalink":"/docs/设计与实现/锁的应用/"}},{"id":"设计与实现/新存储方案:详细解析/index","title":"新存储结构:详细解析","description":"整体架构","source":"@site/docs/设计与实现/新存储方案:详细解析/index.md","sourceDirName":"设计与实现/新存储方案:详细解析","slug":"/设计与实现/新存储方案:详细解析/","permalink":"/docs/设计与实现/新存储方案:详细解析/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/新存储方案:详细解析/index.md","tags":[],"version":"current","sidebarPosition":16,"frontMatter":{"title":"新存储结构:详细解析","sidebar_position":16},"sidebar":"tutorialSidebar","previous":{"title":"新存储结构","permalink":"/docs/设计与实现/新存储结构/"},"next":{"title":"Pika 源码学习笔记","permalink":"/docs/设计与实现/Pika 源码学习笔记/"}},{"id":"设计与实现/新存储结构/index","title":"新存储结构","description":"整体架构","source":"@site/docs/设计与实现/新存储结构/index.md","sourceDirName":"设计与实现/新存储结构","slug":"/设计与实现/新存储结构/","permalink":"/docs/设计与实现/新存储结构/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/新存储结构/index.md","tags":[],"version":"current","sidebarPosition":15,"frontMatter":{"title":"新存储结构","sidebar_position":15},"sidebar":"tutorialSidebar","previous":{"title":"旧存储结构","permalink":"/docs/设计与实现/旧存储结构/"},"next":{"title":"新存储结构:详细解析","permalink":"/docs/设计与实现/新存储方案:详细解析/"}},{"id":"设计与实现/增量同步/index","title":"增量同步","description":"背景","source":"@site/docs/设计与实现/增量同步/index.md","sourceDirName":"设计与实现/增量同步","slug":"/设计与实现/增量同步/","permalink":"/docs/设计与实现/增量同步/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/增量同步/index.md","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"增量同步","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"全同步","permalink":"/docs/设计与实现/全同步/"},"next":{"title":"主从同步","permalink":"/docs/设计与实现/主从同步/"}},{"id":"设计与实现/整体技术架构/index","title":"整体技术架构","description":"概述","source":"@site/docs/设计与实现/整体技术架构/index.md","sourceDirName":"设计与实现/整体技术架构","slug":"/设计与实现/整体技术架构/","permalink":"/docs/设计与实现/整体技术架构/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/整体技术架构/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"整体技术架构","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"设计与实现","permalink":"/docs/设计与实现/"},"next":{"title":"线程模型","permalink":"/docs/设计与实现/线程模型/"}},{"id":"设计与实现/主从同步/index","title":"主从同步","description":"pika主从同步","source":"@site/docs/设计与实现/主从同步/index.md","sourceDirName":"设计与实现/主从同步","slug":"/设计与实现/主从同步/","permalink":"/docs/设计与实现/主从同步/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/主从同步/index.md","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"主从同步","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"增量同步","permalink":"/docs/设计与实现/增量同步/"},"next":{"title":"副本一致性","permalink":"/docs/设计与实现/副本一致性/"}},{"id":"设计与实现/index","title":"设计与实现","description":"","source":"@site/docs/设计与实现/index.md","sourceDirName":"设计与实现","slug":"/设计与实现/","permalink":"/docs/设计与实现/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/index.md","tags":[],"version":"current","sidebarPosition":40,"frontMatter":{"title":"设计与实现","sidebar_position":40},"sidebar":"tutorialSidebar","previous":{"title":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","permalink":"/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/"},"next":{"title":"整体技术架构","permalink":"/docs/设计与实现/整体技术架构/"}},{"id":"设计与实现/NoSQL 原理概述/index","title":"NoSQL 原理概述","description":"pika 设计","source":"@site/docs/设计与实现/NoSQL 原理概述/index.md","sourceDirName":"设计与实现/NoSQL 原理概述","slug":"/设计与实现/NoSQL 原理概述/","permalink":"/docs/设计与实现/NoSQL 原理概述/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/NoSQL 原理概述/index.md","tags":[],"version":"current","sidebarPosition":13,"frontMatter":{"title":"NoSQL 原理概述","sidebar_position":13},"sidebar":"tutorialSidebar","previous":{"title":"快照式备份","permalink":"/docs/设计与实现/快照式备份/"},"next":{"title":"旧存储结构","permalink":"/docs/设计与实现/旧存储结构/"}},{"id":"设计与实现/Pika 传火计划/读写流程/index","title":"Pika 读写流程简介","description":"alt text","source":"@site/docs/设计与实现/Pika 传火计划/读写流程/index.md","sourceDirName":"设计与实现/Pika 传火计划/读写流程","slug":"/设计与实现/Pika 传火计划/读写流程/","permalink":"/docs/设计与实现/Pika 传火计划/读写流程/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 传火计划/读写流程/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Pika 读写流程简介","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Pika 线程模型简介","permalink":"/docs/设计与实现/Pika 传火计划/线程模型/"},"next":{"title":"Pika 主从同比","permalink":"/docs/设计与实现/Pika 传火计划/主从同步/"}},{"id":"设计与实现/Pika 传火计划/线程模型/index","title":"Pika 线程模型简介","description":"alt text","source":"@site/docs/设计与实现/Pika 传火计划/线程模型/index.md","sourceDirName":"设计与实现/Pika 传火计划/线程模型","slug":"/设计与实现/Pika 传火计划/线程模型/","permalink":"/docs/设计与实现/Pika 传火计划/线程模型/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 传火计划/线程模型/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"Pika 线程模型简介","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"Pika 传火计划","permalink":"/docs/设计与实现/Pika 传火计划/"},"next":{"title":"Pika 读写流程简介","permalink":"/docs/设计与实现/Pika 传火计划/读写流程/"}},{"id":"设计与实现/Pika 传火计划/主从同步/index","title":"Pika 主从同比","description":"alt text","source":"@site/docs/设计与实现/Pika 传火计划/主从同步/index.md","sourceDirName":"设计与实现/Pika 传火计划/主从同步","slug":"/设计与实现/Pika 传火计划/主从同步/","permalink":"/docs/设计与实现/Pika 传火计划/主从同步/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 传火计划/主从同步/index.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Pika 主从同比","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Pika 读写流程简介","permalink":"/docs/设计与实现/Pika 传火计划/读写流程/"},"next":{"title":"编码规范","permalink":"/docs/开发文档/"}},{"id":"设计与实现/Pika 传火计划/index","title":"Pika 传火计划","description":"为方便刚接触Pika的同学能够更快的上手提交第一个Pika PR。基于v3.3.4代码,从代码层面对Pika进行了全方面的梳理。这个想法叫传火计划,希望Pika星星之火可以燎原。","source":"@site/docs/设计与实现/Pika 传火计划/index.md","sourceDirName":"设计与实现/Pika 传火计划","slug":"/设计与实现/Pika 传火计划/","permalink":"/docs/设计与实现/Pika 传火计划/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 传火计划/index.md","tags":[],"version":"current","sidebarPosition":18,"frontMatter":{"title":"Pika 传火计划","sidebar_position":18},"sidebar":"tutorialSidebar","previous":{"title":"Pika 和 RockSDB 的对接","permalink":"/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/"},"next":{"title":"Pika 线程模型简介","permalink":"/docs/设计与实现/Pika 传火计划/线程模型/"}},{"id":"设计与实现/Pika 与 Codis/index","title":"Pika 与 Codis","description":"背景","source":"@site/docs/设计与实现/Pika 与 Codis/index.md","sourceDirName":"设计与实现/Pika 与 Codis","slug":"/设计与实现/Pika 与 Codis/","permalink":"/docs/设计与实现/Pika 与 Codis/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 与 Codis/index.md","tags":[],"version":"current","sidebarPosition":11,"frontMatter":{"title":"Pika 与 Codis","sidebar_position":11},"sidebar":"tutorialSidebar","previous":{"title":"副本一致性","permalink":"/docs/设计与实现/副本一致性/"},"next":{"title":"快照式备份","permalink":"/docs/设计与实现/快照式备份/"}},{"id":"设计与实现/Pika 源码学习笔记/通信和线程模型/index","title":"通信和线程模型","description":"pika的线程模型有官方的wiki介绍,这里主要介绍了pika都有哪些线程,这些线程用来干嘛。本篇文章主要涉及监听线程DispatchThread、IO工作线程WorkerThread和工作线程池ThreadPool,结合代码介绍里面实现的一些细节。","source":"@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md","sourceDirName":"设计与实现/Pika 源码学习笔记/通信和线程模型","slug":"/设计与实现/Pika 源码学习笔记/通信和线程模型/","permalink":"/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"通信和线程模型","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"Pika 源码学习笔记","permalink":"/docs/设计与实现/Pika 源码学习笔记/"},"next":{"title":"Pubsub 机制","permalink":"/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/"}},{"id":"设计与实现/Pika 源码学习笔记/index","title":"Pika 源码学习笔记","description":"","source":"@site/docs/设计与实现/Pika 源码学习笔记/index.md","sourceDirName":"设计与实现/Pika 源码学习笔记","slug":"/设计与实现/Pika 源码学习笔记/","permalink":"/docs/设计与实现/Pika 源码学习笔记/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 源码学习笔记/index.md","tags":[],"version":"current","sidebarPosition":17,"frontMatter":{"title":"Pika 源码学习笔记","sidebar_position":17},"sidebar":"tutorialSidebar","previous":{"title":"新存储结构:详细解析","permalink":"/docs/设计与实现/新存储方案:详细解析/"},"next":{"title":"通信和线程模型","permalink":"/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/"}},{"id":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index","title":"Pika 的命令执行框架","description":"今天我们一起来看下pika收到一个命令后,是怎么处理这个命令的。","source":"@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md","sourceDirName":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架","slug":"/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/","permalink":"/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Pika 的命令执行框架","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Pubsub 机制","permalink":"/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/"},"next":{"title":"Pika 和 RockSDB 的对接","permalink":"/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/"}},{"id":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index","title":"Pika 和 RockSDB 的对接","description":"在《Pika源码学习--pika的命令执行框架》中我们了解了一个命令的执行流程,也知道了pika使用的是Blackwidow引擎,现在我们来看看pika是怎么和rocksdb对接的,Blackwidow具体怎么处理命令。","source":"@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md","sourceDirName":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接","slug":"/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/","permalink":"/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Pika 和 RockSDB 的对接","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Pika 的命令执行框架","permalink":"/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/"},"next":{"title":"Pika 传火计划","permalink":"/docs/设计与实现/Pika 传火计划/"}},{"id":"设计与实现/Pika 源码学习笔记/PubSub 机制/index","title":"Pubsub 机制","description":"前一篇《Pika源码学习--pika的通信和线程模型》里说到WorkerThread里面有两种处理命令的方式,一种是同步,一种是异步。那什么时候是同步处理,什么时候是异步处理呢?其实","source":"@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md","sourceDirName":"设计与实现/Pika 源码学习笔记/PubSub 机制","slug":"/设计与实现/Pika 源码学习笔记/PubSub 机制/","permalink":"/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Pubsub 机制","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"通信和线程模型","permalink":"/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/"},"next":{"title":"Pika 的命令执行框架","permalink":"/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/"}},{"id":"使用与运维/安装使用/index","title":"安装使用","description":"快速试用","source":"@site/docs/使用与运维/安装使用/index.md","sourceDirName":"使用与运维/安装使用","slug":"/使用与运维/安装使用/","permalink":"/docs/使用与运维/安装使用/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/安装使用/index.md","tags":[],"version":"current","sidebarPosition":100,"frontMatter":{"title":"安装使用","sidebar_position":100},"sidebar":"tutorialSidebar","previous":{"title":"副本一致性(使用文档)","permalink":"/docs/使用与运维/副本一致性(使用文档)/"},"next":{"title":"副本一致性(设计文档)","permalink":"/docs/使用与运维/副本一致性(设计文档)/"}},{"id":"使用与运维/差异化命令/index","title":"差异化命令","description":"config [get | set | rewrite]","source":"@site/docs/使用与运维/差异化命令/index.md","sourceDirName":"使用与运维/差异化命令","slug":"/使用与运维/差异化命令/","permalink":"/docs/使用与运维/差异化命令/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/差异化命令/index.md","tags":[],"version":"current","sidebarPosition":50,"frontMatter":{"title":"差异化命令","sidebar_position":50},"sidebar":"tutorialSidebar","previous":{"title":"管理指令","permalink":"/docs/使用与运维/管理指令/"},"next":{"title":"订阅","permalink":"/docs/使用与运维/订阅/"}},{"id":"使用与运维/订阅/index","title":"订阅","description":"可用版本: >= 2.3.0","source":"@site/docs/使用与运维/订阅/index.md","sourceDirName":"使用与运维/订阅","slug":"/使用与运维/订阅/","permalink":"/docs/使用与运维/订阅/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/订阅/index.md","tags":[],"version":"current","sidebarPosition":60,"frontMatter":{"title":"订阅","sidebar_position":60},"sidebar":"tutorialSidebar","previous":{"title":"差异化命令","permalink":"/docs/使用与运维/差异化命令/"},"next":{"title":"分布式模式简单教程","permalink":"/docs/使用与运维/分布式模式简单教程/"}},{"id":"使用与运维/多库版命令/index","title":"多库版命令","description":"Pika自版本3.1.0起开始支持多db,为了兼容多db部分命令、配置参数发生了变化,具体变化如下:","source":"@site/docs/使用与运维/多库版命令/index.md","sourceDirName":"使用与运维/多库版命令","slug":"/使用与运维/多库版命令/","permalink":"/docs/使用与运维/多库版命令/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/多库版命令/index.md","tags":[],"version":"current","sidebarPosition":80,"frontMatter":{"title":"多库版命令","sidebar_position":80},"sidebar":"tutorialSidebar","previous":{"title":"自动容灾","permalink":"/docs/使用与运维/自动容灾/"},"next":{"title":"服务器状态监控","permalink":"/docs/使用与运维/服务器状态监控/"}},{"id":"使用与运维/分布式模式简单教程/index","title":"分布式模式简单教程","description":"关于sharding mode,pika底层提供slot 的概念。Pika将key进行哈希取模之后散列到各个slot当中处理。sharding mode 根据线上的具体情况可以应用于单个pika,也可以应用到多个pika组成的pika cluster。这个tutorial主要介绍开启sharding mode 需要了解的一些概念,以及需要调整的一些配置参数。","source":"@site/docs/使用与运维/分布式模式简单教程/index.md","sourceDirName":"使用与运维/分布式模式简单教程","slug":"/使用与运维/分布式模式简单教程/","permalink":"/docs/使用与运维/分布式模式简单教程/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/分布式模式简单教程/index.md","tags":[],"version":"current","sidebarPosition":65,"frontMatter":{"title":"分布式模式简单教程","sidebar_position":65},"sidebar":"tutorialSidebar","previous":{"title":"订阅","permalink":"/docs/使用与运维/订阅/"},"next":{"title":"自动容灾","permalink":"/docs/使用与运维/自动容灾/"}},{"id":"使用与运维/分片教程/index","title":"分片教程(3.1.2 ‐ 3.3.6)","description":"Pika自版本3.1.2起开始对分片做了一系列支持,为此我们为分片模式添加了一系列的命令.","source":"@site/docs/使用与运维/分片教程/index.md","sourceDirName":"使用与运维/分片教程","slug":"/使用与运维/分片教程/","permalink":"/docs/使用与运维/分片教程/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/分片教程/index.md","tags":[],"version":"current","sidebarPosition":90,"frontMatter":{"title":"分片教程(3.1.2 ‐ 3.3.6)","sidebar_position":90},"sidebar":"tutorialSidebar","previous":{"title":"服务器状态监控","permalink":"/docs/使用与运维/服务器状态监控/"},"next":{"title":"副本一致性(使用文档)","permalink":"/docs/使用与运维/副本一致性(使用文档)/"}},{"id":"使用与运维/服务器状态监控/index","title":"服务器状态监控","description":"在pika的使用中,也为用户提供了丰富的info展示,用于监控服务器的运行状态。","source":"@site/docs/使用与运维/服务器状态监控/index.md","sourceDirName":"使用与运维/服务器状态监控","slug":"/使用与运维/服务器状态监控/","permalink":"/docs/使用与运维/服务器状态监控/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/服务器状态监控/index.md","tags":[],"version":"current","sidebarPosition":85,"frontMatter":{"title":"服务器状态监控","sidebar_position":85},"sidebar":"tutorialSidebar","previous":{"title":"多库版命令","permalink":"/docs/使用与运维/多库版命令/"},"next":{"title":"分片教程(3.1.2 ‐ 3.3.6)","permalink":"/docs/使用与运维/分片教程/"}},{"id":"使用与运维/副本一致性(设计文档)/index","title":"副本一致性(设计文档)","description":"目前线程模型","source":"@site/docs/使用与运维/副本一致性(设计文档)/index.md","sourceDirName":"使用与运维/副本一致性(设计文档)","slug":"/使用与运维/副本一致性(设计文档)/","permalink":"/docs/使用与运维/副本一致性(设计文档)/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/副本一致性(设计文档)/index.md","tags":[],"version":"current","sidebarPosition":105,"frontMatter":{"title":"副本一致性(设计文档)","sidebar_position":105},"sidebar":"tutorialSidebar","previous":{"title":"安装使用","permalink":"/docs/使用与运维/安装使用/"},"next":{"title":"Pika 最佳实践","permalink":"/docs/使用与运维/Pika 最佳实践/"}},{"id":"使用与运维/副本一致性(使用文档)/index","title":"副本一致性(使用文档)","description":"简介","source":"@site/docs/使用与运维/副本一致性(使用文档)/index.md","sourceDirName":"使用与运维/副本一致性(使用文档)","slug":"/使用与运维/副本一致性(使用文档)/","permalink":"/docs/使用与运维/副本一致性(使用文档)/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/副本一致性(使用文档)/index.md","tags":[],"version":"current","sidebarPosition":100,"frontMatter":{"title":"副本一致性(使用文档)","sidebar_position":100},"sidebar":"tutorialSidebar","previous":{"title":"分片教程(3.1.2 ‐ 3.3.6)","permalink":"/docs/使用与运维/分片教程/"},"next":{"title":"安装使用","permalink":"/docs/使用与运维/安装使用/"}},{"id":"使用与运维/管理指令/index","title":"管理指令","description":"client kill all","source":"@site/docs/使用与运维/管理指令/index.md","sourceDirName":"使用与运维/管理指令","slug":"/使用与运维/管理指令/","permalink":"/docs/使用与运维/管理指令/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/管理指令/index.md","tags":[],"version":"current","sidebarPosition":40,"frontMatter":{"title":"管理指令","sidebar_position":40},"sidebar":"tutorialSidebar","previous":{"title":"数据目录","permalink":"/docs/使用与运维/数据目录/"},"next":{"title":"差异化命令","permalink":"/docs/使用与运维/差异化命令/"}},{"id":"使用与运维/配置文件说明/index","title":"配置文件说明","description":"","source":"@site/docs/使用与运维/配置文件说明/index.md","sourceDirName":"使用与运维/配置文件说明","slug":"/使用与运维/配置文件说明/","permalink":"/docs/使用与运维/配置文件说明/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/配置文件说明/index.md","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"title":"配置文件说明","sidebar_position":20},"sidebar":"tutorialSidebar","previous":{"title":"使用与运维","permalink":"/docs/使用与运维/"},"next":{"title":"page info 信息说明","permalink":"/docs/使用与运维/page info 信息说明/"}},{"id":"使用与运维/数据目录/index","title":"数据目录","description":"db目录","source":"@site/docs/使用与运维/数据目录/index.md","sourceDirName":"使用与运维/数据目录","slug":"/使用与运维/数据目录/","permalink":"/docs/使用与运维/数据目录/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/数据目录/index.md","tags":[],"version":"current","sidebarPosition":30,"frontMatter":{"title":"数据目录","sidebar_position":30},"sidebar":"tutorialSidebar","previous":{"title":"page info 信息说明","permalink":"/docs/使用与运维/page info 信息说明/"},"next":{"title":"管理指令","permalink":"/docs/使用与运维/管理指令/"}},{"id":"使用与运维/自动容灾/index","title":"自动容灾","description":"pika能够配合Redis-sentinel(哨兵)实现自动容灾切主, 使用方式与redis完全一致","source":"@site/docs/使用与运维/自动容灾/index.md","sourceDirName":"使用与运维/自动容灾","slug":"/使用与运维/自动容灾/","permalink":"/docs/使用与运维/自动容灾/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/自动容灾/index.md","tags":[],"version":"current","sidebarPosition":70,"frontMatter":{"title":"自动容灾","sidebar_position":70},"sidebar":"tutorialSidebar","previous":{"title":"分布式模式简单教程","permalink":"/docs/使用与运维/分布式模式简单教程/"},"next":{"title":"多库版命令","permalink":"/docs/使用与运维/多库版命令/"}},{"id":"使用与运维/index","title":"使用与运维","description":"","source":"@site/docs/使用与运维/index.md","sourceDirName":"使用与运维","slug":"/使用与运维/","permalink":"/docs/使用与运维/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/index.md","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"title":"使用与运维","sidebar_position":20},"sidebar":"tutorialSidebar","previous":{"title":"FAQ","permalink":"/docs/序言/FAQ/"},"next":{"title":"配置文件说明","permalink":"/docs/使用与运维/配置文件说明/"}},{"id":"使用与运维/page info 信息说明/index","title":"page info 信息说明","description":"执行INFO命令","source":"@site/docs/使用与运维/page info 信息说明/index.md","sourceDirName":"使用与运维/page info 信息说明","slug":"/使用与运维/page info 信息说明/","permalink":"/docs/使用与运维/page info 信息说明/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/page info 信息说明/index.md","tags":[],"version":"current","sidebarPosition":30,"frontMatter":{"title":"page info 信息说明","sidebar_position":30},"sidebar":"tutorialSidebar","previous":{"title":"配置文件说明","permalink":"/docs/使用与运维/配置文件说明/"},"next":{"title":"数据目录","permalink":"/docs/使用与运维/数据目录/"}},{"id":"使用与运维/Pika 最佳实践/index","title":"Pika 最佳实践","description":"我们根据360内部的pika使用经验及社区用户的问题反馈,整理了如下文档并会不断更新","source":"@site/docs/使用与运维/Pika 最佳实践/index.md","sourceDirName":"使用与运维/Pika 最佳实践","slug":"/使用与运维/Pika 最佳实践/","permalink":"/docs/使用与运维/Pika 最佳实践/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/使用与运维/Pika 最佳实践/index.md","tags":[],"version":"current","sidebarPosition":110,"frontMatter":{"title":"Pika 最佳实践","sidebar_position":110},"sidebar":"tutorialSidebar","previous":{"title":"副本一致性(设计文档)","permalink":"/docs/使用与运维/副本一致性(设计文档)/"},"next":{"title":"性能与优化","permalink":"/docs/性能与优化/"}},{"id":"性能与优化/3.2.x 性能/index","title":"3.2.x 性能","description":"Performance:","source":"@site/docs/性能与优化/3.2.x 性能/index.md","sourceDirName":"性能与优化/3.2.x 性能","slug":"/性能与优化/3.2.x 性能/","permalink":"/docs/性能与优化/3.2.x 性能/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/3.2.x 性能/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"3.2.x 性能","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"性能与优化","permalink":"/docs/性能与优化/"},"next":{"title":"Pika 内存使用","permalink":"/docs/性能与优化/Pika 内存使用/"}},{"id":"性能与优化/index","title":"性能与优化","description":"","source":"@site/docs/性能与优化/index.md","sourceDirName":"性能与优化","slug":"/性能与优化/","permalink":"/docs/性能与优化/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/index.md","tags":[],"version":"current","sidebarPosition":30,"frontMatter":{"title":"性能与优化","sidebar_position":30},"sidebar":"tutorialSidebar","previous":{"title":"Pika 最佳实践","permalink":"/docs/使用与运维/Pika 最佳实践/"},"next":{"title":"3.2.x 性能","permalink":"/docs/性能与优化/3.2.x 性能/"}},{"id":"性能与优化/Pika 3.5 参数优化手册/index","title":"Pika 3.5 参数优化手册","description":"1970","source":"@site/docs/性能与优化/Pika 3.5 参数优化手册/index.md","sourceDirName":"性能与优化/Pika 3.5 参数优化手册","slug":"/性能与优化/Pika 3.5 参数优化手册/","permalink":"/docs/性能与优化/Pika 3.5 参数优化手册/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/Pika 3.5 参数优化手册/index.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Pika 3.5 参数优化手册","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Redis 与 Pika scan 性能对比","permalink":"/docs/性能与优化/Redis 与 Pika scan 性能对比/"},"next":{"title":"Pika 优化案例","permalink":"/docs/性能与优化/Pika 优化案例/"}},{"id":"性能与优化/Pika 内存使用/index","title":"Pika 内存使用","description":"Pika内存占用","source":"@site/docs/性能与优化/Pika 内存使用/index.md","sourceDirName":"性能与优化/Pika 内存使用","slug":"/性能与优化/Pika 内存使用/","permalink":"/docs/性能与优化/Pika 内存使用/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/Pika 内存使用/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Pika 内存使用","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"3.2.x 性能","permalink":"/docs/性能与优化/3.2.x 性能/"},"next":{"title":"Redis 与 Pika scan 性能对比","permalink":"/docs/性能与优化/Redis 与 Pika scan 性能对比/"}},{"id":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index","title":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","description":"现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。","source":"@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md","sourceDirName":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例","slug":"/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/","permalink":"/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"喜马拉雅 Redis 与 Pika 缓存使用军规","permalink":"/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/"},"next":{"title":"设计与实现","permalink":"/docs/设计与实现/"}},{"id":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index","title":"喜马拉雅 Redis 与 Pika 缓存使用军规","description":"宣言:缓存不是万金油,更不是垃圾桶!!!","source":"@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md","sourceDirName":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规","slug":"/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/","permalink":"/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"喜马拉雅 Redis 与 Pika 缓存使用军规","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"Pika 优化案例","permalink":"/docs/性能与优化/Pika 优化案例/"},"next":{"title":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","permalink":"/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/"}},{"id":"性能与优化/Pika 优化案例/index","title":"Pika 优化案例","description":"","source":"@site/docs/性能与优化/Pika 优化案例/index.md","sourceDirName":"性能与优化/Pika 优化案例","slug":"/性能与优化/Pika 优化案例/","permalink":"/docs/性能与优化/Pika 优化案例/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/Pika 优化案例/index.md","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"Pika 优化案例","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Pika 3.5 参数优化手册","permalink":"/docs/性能与优化/Pika 3.5 参数优化手册/"},"next":{"title":"喜马拉雅 Redis 与 Pika 缓存使用军规","permalink":"/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/"}},{"id":"性能与优化/Redis 与 Pika scan 性能对比/index","title":"Redis 与 Pika scan 性能对比","description":"Redis 是后端常用的键值数据库。Pika 是 360 出品的一款与 Redis 协议几乎兼容的数据库。与 Redis 不同的是,Pika 基于硬盘,使用 RocksDB 作为引擎,从容量上来说,比基于内存的 Redis 大了不少,而且在性能上也能满足一般需求。","source":"@site/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md","sourceDirName":"性能与优化/Redis 与 Pika scan 性能对比","slug":"/性能与优化/Redis 与 Pika scan 性能对比/","permalink":"/docs/性能与优化/Redis 与 Pika scan 性能对比/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Redis 与 Pika scan 性能对比","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Pika 内存使用","permalink":"/docs/性能与优化/Pika 内存使用/"},"next":{"title":"Pika 3.5 参数优化手册","permalink":"/docs/性能与优化/Pika 3.5 参数优化手册/"}},{"id":"序言/简介/index","title":"PikiwiDB(Pika) 简介","description":"PikiwiDB(Pika)-Logo-Logo.png)","source":"@site/docs/序言/简介/index.md","sourceDirName":"序言/简介","slug":"/序言/简介/","permalink":"/docs/序言/简介/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/序言/简介/index.md","tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"title":"PikiwiDB(Pika) 简介","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"序言","permalink":"/docs/序言/"},"next":{"title":"支持的 Redis 接口与兼容情况","permalink":"/docs/序言/支持的 Redis 接口与兼容情况/"}},{"id":"序言/支持的 Redis 接口与兼容情况/index","title":"支持的 Redis 接口与兼容情况","description":"pika支持redis五种类型(分别为string、hash、list、set、zset)的接口,先列出其对redis的五种数据结构兼容统计。","source":"@site/docs/序言/支持的 Redis 接口与兼容情况/index.md","sourceDirName":"序言/支持的 Redis 接口与兼容情况","slug":"/序言/支持的 Redis 接口与兼容情况/","permalink":"/docs/序言/支持的 Redis 接口与兼容情况/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/序言/支持的 Redis 接口与兼容情况/index.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"支持的 Redis 接口与兼容情况","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"PikiwiDB(Pika) 简介","permalink":"/docs/序言/简介/"},"next":{"title":"FAQ","permalink":"/docs/序言/FAQ/"}},{"id":"序言/FAQ/index","title":"FAQ","description":"1 编译安装","source":"@site/docs/序言/FAQ/index.md","sourceDirName":"序言/FAQ","slug":"/序言/FAQ/","permalink":"/docs/序言/FAQ/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/序言/FAQ/index.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"FAQ","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"支持的 Redis 接口与兼容情况","permalink":"/docs/序言/支持的 Redis 接口与兼容情况/"},"next":{"title":"使用与运维","permalink":"/docs/使用与运维/"}},{"id":"序言/index","title":"序言","description":"欢迎来到 PikiwiDB(Pika) 的世界。接下来的篇章旨在于帮助你建立对 PikiwiDB 数据库的基本了解,你将会阅读到:","source":"@site/docs/序言/index.md","sourceDirName":"序言","slug":"/序言/","permalink":"/docs/序言/","draft":false,"unlisted":false,"editUrl":"https://github.com/pikiwidb/website/tree/main/docs/序言/index.md","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"title":"序言","sidebar_position":10},"sidebar":"tutorialSidebar","next":{"title":"PikiwiDB(Pika) 简介","permalink":"/docs/序言/简介/"}}],"drafts":[],"sidebars":{"tutorialSidebar":[{"type":"category","label":"序言","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"PikiwiDB(Pika) 简介","id":"序言/简介/index"},{"type":"doc","label":"支持的 Redis 接口与兼容情况","id":"序言/支持的 Redis 接口与兼容情况/index"},{"type":"doc","label":"FAQ","id":"序言/FAQ/index"}],"link":{"type":"doc","id":"序言/index"}},{"type":"category","label":"使用与运维","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"配置文件说明","id":"使用与运维/配置文件说明/index"},{"type":"doc","label":"page info 信息说明","id":"使用与运维/page info 信息说明/index"},{"type":"doc","label":"数据目录","id":"使用与运维/数据目录/index"},{"type":"doc","label":"管理指令","id":"使用与运维/管理指令/index"},{"type":"doc","label":"差异化命令","id":"使用与运维/差异化命令/index"},{"type":"doc","label":"订阅","id":"使用与运维/订阅/index"},{"type":"doc","label":"分布式模式简单教程","id":"使用与运维/分布式模式简单教程/index"},{"type":"doc","label":"自动容灾","id":"使用与运维/自动容灾/index"},{"type":"doc","label":"多库版命令","id":"使用与运维/多库版命令/index"},{"type":"doc","label":"服务器状态监控","id":"使用与运维/服务器状态监控/index"},{"type":"doc","label":"分片教程(3.1.2 ‐ 3.3.6)","id":"使用与运维/分片教程/index"},{"type":"doc","label":"副本一致性(使用文档)","id":"使用与运维/副本一致性(使用文档)/index"},{"type":"doc","label":"安装使用","id":"使用与运维/安装使用/index"},{"type":"doc","label":"副本一致性(设计文档)","id":"使用与运维/副本一致性(设计文档)/index"},{"type":"doc","label":"Pika 最佳实践","id":"使用与运维/Pika 最佳实践/index"}],"link":{"type":"doc","id":"使用与运维/index"}},{"type":"category","label":"性能与优化","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"3.2.x 性能","id":"性能与优化/3.2.x 性能/index"},{"type":"doc","label":"Pika 内存使用","id":"性能与优化/Pika 内存使用/index"},{"type":"doc","label":"Redis 与 Pika scan 性能对比","id":"性能与优化/Redis 与 Pika scan 性能对比/index"},{"type":"doc","label":"Pika 3.5 参数优化手册","id":"性能与优化/Pika 3.5 参数优化手册/index"},{"type":"category","label":"Pika 优化案例","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"喜马拉雅 Redis 与 Pika 缓存使用军规","id":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index"},{"type":"doc","label":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","id":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index"}],"link":{"type":"doc","id":"性能与优化/Pika 优化案例/index"}}],"link":{"type":"doc","id":"性能与优化/index"}},{"type":"category","label":"设计与实现","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"整体技术架构","id":"设计与实现/整体技术架构/index"},{"type":"doc","label":"线程模型","id":"设计与实现/线程模型/index"},{"type":"doc","label":"锁的应用","id":"设计与实现/锁的应用/index"},{"type":"doc","label":"全同步","id":"设计与实现/全同步/index"},{"type":"doc","label":"增量同步","id":"设计与实现/增量同步/index"},{"type":"doc","label":"主从同步","id":"设计与实现/主从同步/index"},{"type":"doc","label":"副本一致性","id":"设计与实现/副本一致性/index"},{"type":"doc","label":"Pika 与 Codis","id":"设计与实现/Pika 与 Codis/index"},{"type":"doc","label":"快照式备份","id":"设计与实现/快照式备份/index"},{"type":"doc","label":"NoSQL 原理概述","id":"设计与实现/NoSQL 原理概述/index"},{"type":"doc","label":"旧存储结构","id":"设计与实现/旧存储结构/index"},{"type":"doc","label":"新存储结构","id":"设计与实现/新存储结构/index"},{"type":"doc","label":"新存储结构:详细解析","id":"设计与实现/新存储方案:详细解析/index"},{"type":"category","label":"Pika 源码学习笔记","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"通信和线程模型","id":"设计与实现/Pika 源码学习笔记/通信和线程模型/index"},{"type":"doc","label":"Pubsub 机制","id":"设计与实现/Pika 源码学习笔记/PubSub 机制/index"},{"type":"doc","label":"Pika 的命令执行框架","id":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index"},{"type":"doc","label":"Pika 和 RockSDB 的对接","id":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index"}],"link":{"type":"doc","id":"设计与实现/Pika 源码学习笔记/index"}},{"type":"category","label":"Pika 传火计划","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"Pika 线程模型简介","id":"设计与实现/Pika 传火计划/线程模型/index"},{"type":"doc","label":"Pika 读写流程简介","id":"设计与实现/Pika 传火计划/读写流程/index"},{"type":"doc","label":"Pika 主从同比","id":"设计与实现/Pika 传火计划/主从同步/index"}],"link":{"type":"doc","id":"设计与实现/Pika 传火计划/index"}}],"link":{"type":"doc","id":"设计与实现/index"}},{"type":"category","label":"编码规范","collapsible":true,"collapsed":true,"items":[{"type":"doc","label":"编码规范","id":"开发文档/编码规范/index"},{"type":"doc","label":"c++ coding style","id":"开发文档/coding-style/index"}],"link":{"type":"doc","id":"开发文档/index"}}]}}]}},"docusaurus-plugin-content-blog":{"default":{"blogSidebarTitle":"全部文章","blogPosts":[{"id":"PikiwiDB-Pika--4.0.0","metadata":{"permalink":"/blog/PikiwiDB-Pika--4.0.0","source":"@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md","title":"What's new in PikiwiDB(Pika) v4.0.0","description":"尊敬的社区成员及技术爱好者们:","date":"2024-07-08T00:00:00.000Z","tags":[],"readingTime":17.605,"hasTruncateMarker":false,"authors":[{"name":"360 车金鸽","title":"Pika 开源社区"}],"frontMatter":{"title":"What's new in PikiwiDB(Pika) v4.0.0","slug":"PikiwiDB-Pika--4.0.0","authors":[{"name":"360 车金鸽","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"What's new in PikiwiDB(Pika) v3.5.4","permalink":"/blog/Pika-3.5.4"}},"content":"尊敬的社区成员及技术爱好者们:\n\nPikiwiDB 社区荣耀地宣告 —— 经过 9 个月打磨并在生产环境稳定运行 5 个月的 PikiwiDB (Pika) v4.0.0 【下文简称 Pika】今天正式发布。希望基于第三代存储引擎 Floyd 的这个新版本能为社区用户们带来更卓越的体验。\n\n# **1 重大改进**\n\n## **1.1 第三代存储引擎 Floyd**\n\nFloyd 如同其前代 Blackwidow,基于 RocksDB,不仅支持基础的 String 结构,也原生支持了 Hash、List、Set、Stream 及 ZSet 等 KKV 形式的复合数据结构。\n\n- **RocksDB 实例数可配置**\n\n摒弃了 Blackwidow 按数据类型采用 RocksDB 实例的物理隔离模式,Floyd 采用了 RocksDB 的 Column-Family 虚拟隔离机制,在单个 RocksDB 实例下可存储所有类型的数据。\n\n用户可自由设定 Pika 实例中每个 DB【等同于 Redis DB】中 RocksDB 实例的数量,而数据的存储则依据 key 的 hash 值分配至相应的 RocksDB 实例,减小了数据的空间放大和读放大效应,实现了机器资源的高效利用。\n\n- **强类型 key**\n\n![](https://private-user-images.githubusercontent.com/73943232/333059521-afa8a2bf-cebf-481f-a370-deaf4386b46b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1MjU4NzYsIm5iZiI6MTcyMDUyNTU3NiwicGF0aCI6Ii83Mzk0MzIzMi8zMzMwNTk1MjEtYWZhOGEyYmYtY2ViZi00ODFmLWEzNzAtZGVhZjQzODZiNDZiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzA5VDExNDYxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTlkMzcyYWU4NzI4ZDkyYjliZTg3NjM1YTI4ZjhlMzUwMDlmYWJmYzMzZTJkMzY4ZTYwMzk2NGJiNDhkNDc0ZWImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.FHMEJbqfdxgE3asbq8neuN4SMyDpyZHlpRSNy7JH1Zo)\n\n基于 RocksDB 的 Column-Family 虚拟隔离机制,Floyd 把所有类型的 key 和 string 一起存储在 Column-Family 0。\n\n在此存储基础之上,不同于 Blackwidow,可明确禁止不同类型的 key 重复【强类型】,这一设计旨在杜绝潜在的数据冗余与不一致性,与 Redis 服务特性保持一致,进一步提升了系统的整体效率与数据质量。\n\nPika v2.x 系列版本基于存储引擎 Nemo,v3.x 系列版本基于 Blackwidow,它们因为采用了物理隔离机制,无法低成本实现强类型 key,所有在 Redis TYPE 命令的结果中可能返回多种类型,而 Floyd 则完全兼容 Redis 只返回一种类型。\n\n- **Floyd 详细说明**\n\n如果对 Floyd 存储引擎感兴趣,请详阅《Floyd 存储引擎》\n\n【链接:https://github.com/OpenAtomFoundation/pika/discussions/2052】\n\n由于 Floyd 前后进行了多个版本的迭代,所以阅读该 github discussion 文档时请注意前后时间,如有相关冲突性说法,以最新日期的文字为准。\n\n关键 PR:\nPikiwiDB(Pika) 支持 Floyd 存储引擎\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2413\n\n添加 Floyd 的 compaction-filter 的 Gtest\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\n\nPika 不支持不同类型的重复 key, 写入重复 key 返回非法类型\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2609\n\n对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操作与 String 操作明确区分开\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2720\n\n添加支持分区索引过滤的功能\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2601\n\n## **1.2 Mget 批量查询缓存**\n\nPika v3.5.2 的热数据缓存只实现了对热点 Key 的点查 (如 get/hget),在后续的 v3.5.3 和 v3.5.4 修复若干 bug 后,对热数据的点查目前已经非常稳定。然而并未支持批量查询 (如 mget etc)。\n\n内部业务侧反馈批量查询速度比较慢,在 40C/256GiB/2TiB SATA SSD 规格机器上数据量超过 100GiB 时,Pika v3.3.6 30% 批量查询延迟超过 35ms。但由于 Pika 热数据缓存尚未支持批量查询,性能并未改善。\n\n为了满足业务需求,Pika 团队开发了批量查询热数据缓存功能,显著提升了批量查询性能,降低了查询延迟和失败率。相关技术细节请阅读《PikiwiDB (Pika) 混合存储之批量查询》 \n\n【链接:https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ 】。\n\n\n\n关键 PR :\n\nMget 支持多 key 查询缓存,记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2675\n\n修复 Mget 没有使用解析 ttl 的函数导致出现部分 key 的 ttl 未被更新,数据不一致的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2730\n\n\n## **1.3 主从复制**\n\nPika v3.3.6 有很多主从复制的缺陷。v4.0.0 版本对 Pika 全量复制及增量复制进行了大量优化和 bug 修复,取得了非常好的效果。 \n\n并在 info 命令中输出了 \"repl_connect_status\" 指标 (PR 2638),以方便用户更加明确清晰的确定当前的主从复制状态。\n\n关键 PR :\n\n修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2746\n\n修复 Spop 在写 binlog 时可能会出现竞态问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2647\n\n修复多 DB 下全量同步超时后不重试的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2667\n\n修复多 DB 主从超时场景下,可能会出现窗口崩溃的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2666\n\n修复主从同步限速逻辑中重复解锁的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2657\n\n重构主从复制模式 slave 节点的主从同步线程模型,尽可能减少 binlog 消费阻塞问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2638\n\n## **1.4 Redis Stream**\n\nRedis Stream 类似于消息队列(MQ),以便更安全地传递消息。\n\n为了确保数据的安全性,底层引擎 BlackWidow 和 Floyd 中特别添加了对 Stream 数据类型的支持。\n\n关键 PR: \n\n修复 pkpatternmatchdel 命令使用错误导致的 stream 类型数据删除异常的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2726\n\n修复 Keyspace 命令未计算 Stream 类型数据的问题\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2705\n\n## **1.5 Compaction**\n\nPikiwiDB (Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB (Pika) 的读写性能。\n\n因此,控制好 compaction 是优化 Pika 读写性能的关键。\n\nFloyd 使用了 v8.7.3 版本的 RocksDB,开放了更多 RocksDB 参数,以方便用户优化 RocksDB 性能:\n\n1. enable-partitioned-index-filters: 支持加载分区索引过滤器,加快 RocksDB 查找速度。\n2. min-write-buffer-number-to-merge: 默认值为 1,如果将此值设置得更大,意味着需要更多的写缓冲区被填满后才进行 flush。这样可以减少 flush 的频率,增加数据在内存中的累积量,从而可能提高写入吞吐量。\n3. level0-stop-writes-trigger: 默认值为 36,定义了 L0 层中 sst 文件的最大数量,一旦达到这个数量,RocksDB 将会采取 **暂停写入、强制 compaction** 等措施来防止写入操作继续累积,以避免 L0 层变得过于庞大,进而可能导致写入放大、查询性能下降等问题。\n4. level0-slowdown-writes-trigger:默认值为 20,用于控制当 Level 0 的 SST 文件数量达到这个阈值时,触发写减速(write slowdown),防止 Level 0 的文件数量过多,导致后续 compaction 操作的压力过大。\n5. level0-file-num-compaction-trigger:默认值为 4,当 Level 0 的 SST 文件数量达到这个参数设定的阈值时,RocksDB 会开始执行 compaction 操作,将 Level 0 的文件合并到 Level 1,以减少 Level 0 的文件数量,降低读取延迟,并优化存储空间的利用率。\n6. max-subcompactions:默认值为 1,用于控制 RocksDB 中并发执行的 sub-compaction 任务数量,其值为 1 表示关闭 sub-compaction。如果系统资源充足,建议提升该参数以优化 compaction 效率。\n7. max-bytes-for-level-base:指定了 L1 SST 文件总的大小。这个大小是 RocksDB 进行数据分层管理和 compaction 决策的重要依据:如果 L1 层的大小设置得太小,可能会导致 L0 层的 compaction 过于频繁,进而影响写性能。反之,如果设置得太大,可能会占用较多的磁盘空间,并且影响读取性能,因为读取操作可能需要跨越更多的层级。Pika 没有在 pika.conf 中开放此参数给用户配置,而是使用其他参数(**level0-file-num-compaction-trigger** 和 **write-buffer-size**)计算后的结果。\n\n```\nstorage_options_.options.max_bytes_for_level_base = g_pika_conf->level0_file_num_compaction_trigger() * g_pika_conf->write_buffer_size()\n```\n\n关键 PR:\n添加 Floyd 的 compaction-filter 的 Gtest\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\n添加支持分区索引过滤的功能\nhttps://github.com/OpenAtomFoundation/pika/pull/2601\n新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗\nhttps://github.com/OpenAtomFoundation/pika/pull/2538\n\n## **1.6 可观测性**\n\nv3.5 版本增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标,但是在集群方面的可观测性是缺失的。v4.0.0 对 Codis-Proxy 的 P99、P999、延迟等监控指标进行采集和展示,可以直观地反映线上 Codis-proxy 的运行情况。\n\nv4.0.0 开始还提供新的工具:根据 pika benchmark 工具压测结果自动生成可视化的统计图表。\n\n关键 PR:\n\nCodis 支持 info 命令,可以通过该命令查询 Codis-proxy 的 info 信息\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2688\n\nCodis-proxy 新增 P99 P95 等监控耗时指标\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2668\n\n添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2663\n\n## **1.7 测试集**\n\nPikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。v4.0.0 中丰富了诸多特性的 go test 功能,并进一步完善了基本数据类型的 TCL 测试。\n\n关键 PR:\n\n添加 Floyd 的 compaction-filter 的 Gtest\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\n\nPika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2753\n\n## **1.8 跨平台** \n\nPikiwiDB(Pika) 以往仅支持 centos 和 ubuntu 等 linux 平台,v3.5 开始支持 Mac 等平台。v4.0.0 将对 Mac 平台的支持扩展至 FreeBSD 平台。\n\n关键 PR:\n\nPika 支持在 FreeBSD14 平台上进行编译\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2711\n\n# **2 改进列表**\n\n下面详细列出了本次发版的主要功能升级和改进。\n\n## **2.1 新特性**\n\n- Pika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷 \n https://github.com/OpenAtomFoundation/pika/pull/2753\n\n- Pika 支持在 FreeBSD14 平台上进行编译打包 \n https://github.com/OpenAtomFoundation/pika/pull/2711\n\n- Pika 线程整理,避免启动过多无用线程,对不同的线程进行命名,方便问题定位 \n https://github.com/OpenAtomFoundation/pika/pull/2697\n\n- Mget 支持多 key 查询缓存,记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能 \n https://github.com/OpenAtomFoundation/pika/pull/2675\n\n- Codis 支持 info 命令,可以通过该命令查询 Codis-proxy 的 info 信息 \n https://github.com/OpenAtomFoundation/pika/pull/2688\n\n- 添加 Floyd 的 compaction-filter 的 Gtest \n https://github.com/OpenAtomFoundation/pika/pull/2669\n\n- Codis-proxy 新增 P99 P95 等监控耗时指标 \n https://github.com/OpenAtomFoundation/pika/pull/2668\n\n- 添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表 \n https://github.com/OpenAtomFoundation/pika/pull/2663\n\n- Pika 主从复制新增监控指标 repl_connect_status, 可以更加明确清晰的确定当前的主从复制的状态 \n https://github.com/OpenAtomFoundation/pika/pull/2638\n\n- Pika 不支持不同类型的重复 key, 写入重复 key 返回非法类型 \n https://github.com/OpenAtomFoundation/pika/pull/2609\n\n- 添加支持分区索引过滤的功能 \n https://github.com/OpenAtomFoundation/pika/pull/2601\n\n- Pika 支持第三代存储引擎 Floyd, 通过支持多 rocksdb 实例、对 Blob 的使用进行优化、对过期数据的清理进行优化,提升了 Pika 实例的读写性能 \n https://github.com/OpenAtomFoundation/pika/pull/2413\n\n\n## **2.2 bug 修复**\n\n- 修复 iter 未被析构,导致 pkpatternmatchdel 在返回之前不会删除 iter,这可能会导致 rocksdb 永远引用一个版本,导致数据不符合预期的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2785\n\n- 修复 config 参数 min-blob-size 带单位时解析错误的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2767\n\n- 修复 zverank 返回值异常的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2673\n\n- 修复 Pika-port 传输数据过程中报错的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2758\n\n- 修复因为堆上分配的缓冲区越界导致 Dbsize 命令运行时崩溃的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2749\n\n- 修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2746\n\n- 修复参数未初始化导致 slotsscan 等命令不能和 bgsave 命令相互制衡的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2745\n\n- 修复 Slotmigrate 迁移数据的过程中,返回值设置错误,异常场景下会终止数据迁移的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2741\n\n- 修复 Mget 没有使用解析 ttl 的函数导致出现部分 key 的 ttl 未被更新,数据不一致的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2730\n\n- 修复 pkpatternmatchdel 命令使用错误导致的 stream 类型数据删除异常的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2726\n\n- 修复 pkpatternmatchdel 不能正确删除掉对应的 keys 的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2717\n\n- 修复 ACL 密码验证错误问题 \n https://github.com/OpenAtomFoundation/pika/pull/2714\n\n- 修复 Keyspace 命令未计算 Stream 类型数据的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2705\n\n- 对部分命令定制化处理逻辑,避免写 binlog 导致从节点的 binlog 解析失败的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2793\n\n- 修复 Pika cmdID 赋值在 Cmd 初始函数中,可能会导致并发构造的时候出现内存泄漏的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2692\n\n- 修复 ExpectedStale 未考虑 String 类型,如果存在已经过期的 String 类型的 key, ExpectedStale 会返回错误的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2682\n\n- 修复 Spop 在写 binlog 时可能会出现竞态问题 \n https://github.com/OpenAtomFoundation/pika/pull/2674\n\n- db instance 设置不合理时,给用户错误提示 \n https://github.com/OpenAtomFoundation/pika/pull/2672\n\n- 修复 server_stat 中的数据竞态问题 \n https://github.com/OpenAtomFoundation/pika/pull/2671\n\n- 修复多 DB 下全量同步超时后不重试的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2667\n\n- 修复多 DB 下全量同步超时后不重试的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2666\n\n- 修复主从同步限速逻辑中重复解锁的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2657\n\n- 发版支持自动打包 centos7 和 centos8 平台的二进制编译包 \n https://github.com/OpenAtomFoundation/pika/pull/2535\n\n- 修复 Codis 侧的 getrange 命令没有返回预期结果的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2510\n\n## **2.3 提升改进项**\n\n- 更新 Pika Docker Readme, 可以按照 Readme 在 Docker 中部署 Pika 服务 \n https://github.com/OpenAtomFoundation/pika/pull/2743\n\n- 优化重复查询 meta value 导致影响 Pika 服务读写性能的问题 \n https://github.com/OpenAtomFoundation/pika/pull/2735\n\n- 支持对更多的 RocksDB 参数进行动态调整,用户根据不同的业务使用场景调整参数提升 Pika 的读写性能 \n https://github.com/OpenAtomFoundation/pika/pull/2728\n\n- 对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操作与 String 操作明确区分开 \n https://github.com/OpenAtomFoundation/pika/pull/2720\n\n- 更新了 PR 标题验证,不允许在标题末尾出现中文字符 \n https://github.com/OpenAtomFoundation/pika/pull/2718\n\n- 重构主从复制模式 slave 节点的主从同步线程模型,尽可能减少 binlog 消费阻塞问题 \n https://github.com/OpenAtomFoundation/pika/pull/2638\n\n- 新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗 \n https://github.com/OpenAtomFoundation/pika/pull/2538\n\n## 2.4 发版 tag\n\n​ https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0\n\n# **3 社区**\n\n感谢所有为 v4.0.0 做出贡献的社区成员,包括 issue/PR 提交者、代码 reviewer 【排名不分先后,依据字母序列】:\n\n- AlexStocks\n- baerwang\n- chejinge\n- cheniujh\n- chienguo\n- guangkun123\n- gukj-spel\n- longfar-ncy\n- lqxhub\n- luky116\n- Mixficsol\n- saz97\n- wangshao1\n\nPikiwiDB (Pika) 开源社区热烈欢迎您的参与和支持。如果您有任何问题、意见或建议,请扫码添加 PikiwiDB 小助手【微信号: PikiwiDB】为好友,它会拉您加入官方微信群。"},{"id":"Pika-3.5.4","metadata":{"permalink":"/blog/Pika-3.5.4","source":"@site/blog/2024-05-16-Pika-3.5.4.md","title":"What's new in PikiwiDB(Pika) v3.5.4","description":"PikiwiDB (Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。","date":"2024-05-16T00:00:00.000Z","tags":[],"readingTime":6.53,"hasTruncateMarker":false,"authors":[{"name":"陈俊华","title":"360"}],"frontMatter":{"title":"What's new in PikiwiDB(Pika) v3.5.4","slug":"Pika-3.5.4","authors":[{"name":"陈俊华","title":"360"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in PikiwiDB(Pika) v4.0.0","permalink":"/blog/PikiwiDB-Pika--4.0.0"},"nextItem":{"title":"What's new in Pika v3.5.3 (英文版本)","permalink":"/blog/Pika-3.5.3-en"}},"content":"PikiwiDB (Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。\n\nv3.5.4 解决了历史遗留的 bug,对 PikiwiDB (Pika) 的一些遗留 bug 进行修复和优化,旨在打造出一个高稳定性的版本。本次的重点优化主要包括,PikiwiDB (Pika) 支持动态调整限速参数、增强 PikiwiDB (Pika) 的客观测性指标、 磁盘 IO 限速支持读限速及写限速等。\n\n## 1 新特性\n\n1. Pika 支持动态调整全量同步限速参数 rsync-timeout-ms 和 throttle-bytes-per-second。\n\n自 v3.5.0 版本开始,PikiwiDB (Pika) 服务摒弃了通过子进程内使用原来 rsync 工具进行主从全量同步的逻辑,在 PikiwiDB (Pika) 内部以线程方式【称作 rsync 线程】自行实现了新的全量同步逻辑,避免因为外部进程不可控引起的主从同步问题,根据 360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB (Pika) 主从进行全量同步的过程中,如果遇到某些不利的外部因素,如网络波动,硬件故障(如网卡降速导致的主从网卡速率不匹配)等,可能引起 rsync 线程请求持续超时(PikiwiDB (Pika) 内置 rsync 模块用于全量同步阶段的文件传输),且超时重试所发出的包可能引发更大的网络信道负担。此时对于运维人员来说,如果能动态调整 rsync 请求的超时时间和 rsync 传输的速率上限,不仅意味着对全量同步阶段控制粒度的进一步细化,更大大降低了在该场景下的运维处置难度。\n\n关键 PR:\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2633\n\n2. 将 info key space 1 的结果输出至 info all 并展示到监控界面中。\n\nPikiwiDB (Pika) 是通过 Info 命令采集数据至 Pika-Exporter,展示到 Grafana 界面上的,目前界面上部分数据是没有展示的,如 keys 的数量,本次将执行 info keyspace 的结果展示到监控界面,用户可以通过这个指标来查看存储的量级等。\n\n关键 PR:\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2603\n\n3.Pika 磁盘 IO 限速参数支持 OnlyRead、OnlyWrite、ReadAndWrite,默认支持 OnlyWrite。\n\n自 3.5.0 版本开始,PikiwiDB(Pika) 服务可以通过调整 rate-limit 参数实现写限速,防止在网卡质量不高的情况下磁盘 IO 过重导致服务不可用,或者 binlog 阻塞的情况发生。360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB (Pika) 实例的网卡较差情况下,也需要对读实例进行限速,本次修改支持读、写限速,默认是写限速,调整 config 配置中的 rate-limiter-mode 可以设置为读限速,或者同时读写限速。\n\n关键 PR:\n\n- https://github.com/OpenAtomFoundation/pika/pull/2599\n\n2 改进列表\n\n- slotmigrate 添加 go test。\n\n https://github.com/OpenAtomFoundation/pika/pull/2576\n\n- INFO 命令耗时优化,降低查磁盘频率,避免因为数据采集调用 info 命令时查磁盘太过频繁导致服务性能下降。\n\n https://github.com/OpenAtomFoundation/pika/pull/2554\n\n- 对五种基本数据类型命令增加 Redis tcl 测试。\n\n https://github.com/OpenAtomFoundation/pika/pull/2527\n\n3 Bug 修复\n\n- 修复使用 Pika Exporter 时可能会出现 slots 分配不均衡的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2651\n\n- 修复 Codis dashboard 不能正确更新 master 实例状态的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2650\n\n- 修复 Redis 事务 binlog 解析失败导致的主从同步异常问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2642\n\n- 修复 Pika Expoter 启动时不带参数导致启动失败问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2640\n\n- 修复使用 Pika Operater 拉起集群 Codis-proxy panic 的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2633\n\n- 修复 CI 编译出的二进制进行自动化测试时 cp 命令失败问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2614\n\n- 修复变量未初始化导致 cache 启动失败的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2613\n\n- 修复 userpass 和 userblacklist 动态修改参数功能异常问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2600\n\n- 修复 scard sscan 结果不一致的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2596\n\n- 修复当 max-rsync-parallel-num 大于 4,slave 会在主从复制时 coredump 的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2595\n\n- 调整不常用的线程池线程数,避免因为空跑导致性能损耗。\n\n https://github.com/OpenAtomFoundation/pika/pull/2590\n\n- 修复 Pika 事务边缘测试 case 不通过的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2586\n\n- 将 cache-model 修改成 cache-mode。\n\n https://github.com/OpenAtomFoundation/pika/pull/2585\n\n- 修复使用 info keyspace 后,info all 死锁的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2584\n\n- 修复因修改 zsetscorekey comparator impl 字典序比较熟顺序,导致 353 352 极端场景不兼容的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2583\n\n- 修复 compact 死锁的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2581\n\n- Slotmigrate 添加 go test。\n\n https://github.com/OpenAtomFoundation/pika/pull/2576\n\n- 更新 Pika Operater 使用的 pika 版本。\n\n https://github.com/OpenAtomFoundation/pika/pull/2572\n\n- 修复 config rewrite 后 blockcache 数值异常的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2561\n\n- 修复 slotmigrate 动态修复后值错误的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2548\n\n- 修复 spop 可能会出现主从数据不一致的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2541\n\n- 修复 CloseFd (it->second [i]) 出现越界的问题。\n\n https://github.com/OpenAtomFoundation/pika/pull/2539\n\n- 修复 Flushall 和 FlushDB 死锁的隐患,并删除 FlushSubDB 接口。\n\n https://github.com/OpenAtomFoundation/pika/pull/2533\n\n- 增加参数控制是否清理 tcl 测试后产生的数据文件,防止废弃数据占据磁盘。\n\n https://github.com/OpenAtomFoundation/pika/pull/2507\n\n4 社区\n\nPikiwiDB (Pika) 开源社区热烈欢迎您的参与和支持。如果您有任何问题、意见或建议,可通过以下渠道联系我们:\n\n![图片](data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='1px' height='1px' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' fill-opacity='0'%3E%3Cg transform='translate(-249.000000, -126.000000)' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)\n\n\n![img](https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=Mzg4MTY2ODA1MQ==&mid=2247483978&idx=1&sn=b56b42fb857f2ef6cc4c57b18f205e92&send_time=)\n\n微信扫一扫\n关注该公众号"},{"id":"Pika-3.5.3-en","metadata":{"permalink":"/blog/Pika-3.5.3-en","source":"@site/blog/2024-03-27-Pika-3.5.3-en.md","title":"What's new in Pika v3.5.3 (英文版本)","description":"As Redis announces the adoption of dual protocols to maintain its commercial interests, the PikiwiDB (Pika) community is pleased to announce the release of the v3.5.3 stable version for production use today.","date":"2024-03-27T00:00:00.000Z","tags":[],"readingTime":8.965,"hasTruncateMarker":false,"authors":[{"name":"360 中间件团队","title":"Pika 开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.3 (英文版本)","slug":"Pika-3.5.3-en","authors":[{"name":"360 中间件团队","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in PikiwiDB(Pika) v3.5.4","permalink":"/blog/Pika-3.5.4"},"nextItem":{"title":"What's new in Pika v3.5.3 ","permalink":"/blog/Pika-3.5.3"}},"content":"As Redis announces the adoption of dual protocols to maintain its commercial interests, the PikiwiDB (Pika) community is pleased to announce the release of the v3.5.3 stable version for production use today.\n\nThe v3.5.3 version addresses historical bugs and introduces a multitude of new features. These features primarily include Pika's support for ACL, the removal of residual Slot code from the Sharing mode, separation of fast and slow commands, Redis Stream support, large key analysis tools, and Pika's distributed cluster support for fully automated failover, among others. Additionally, we have enriched the automation test cases in version 3.5.3 to enhance the stability and robustness of the Pika service, providing users with a more efficient and stable experience. This article will mainly elaborate on the significant features, bug fixes, and performance improvements in this update.\n\nBefore diving into the main release content of version 3.5.3, please note the following statements:\n\n1. Due to trademark issues, the Pika project has been renamed to PikiwiDB. In this article, we will use PikiwiDB (Pika) to refer to the project at https://github.com/OpenAtomFoundation/pika.\n2. We have created a new project https://github.com/OpenAtomFoundation/pikiwidb, which is a large-capacity KV database compatible with the Redis protocol and based on the Raft protocol. It is mainly designed for scenarios requiring strong consistency, such as storing metadata at a scale of about 10TiB. PikiwiDB will be used to refer to this project specifically.\n\n## 1 Major Improvements\n\n### 1.1 PikiwiDB (Pika) Supports ACL\n\nPikiwiDB (Pika) 3.5.3 now fully supports Redis ACL, laying a solid foundation for future multi-tenant support in cloud-native Pika clusters. Before 3.5.3, Pika already supported Redis user authentication methods such as auth/userpass/requirepass, as well as its own command blacklist mode configured through userblacklist in pika.conf. This update maintains backward compatibility and supports these existing methods.\n\nMoreover, we have integrated all Redis ACL TCL test suites into PikiwiDB (Pika)'s test suite to ensure that PikiwiDB (Pika)'s ACL implementation is fully compatible with Redis ACL.\n\nKey PRs:\n\n- [PikiwiDB (Pika) Supports ACL](https://github.com/OpenAtomFoundation/pika/pull/2013)\n- [Fixes ACL User Authentication Issues](https://github.com/OpenAtomFoundation/pika/pull/2449)\n- [ACL Backward Compatibility with Userblacklist](https://github.com/OpenAtomFoundation/pika/pull/2459)\n- [Adds Redis ACL Test Suites](https://github.com/OpenAtomFoundation/pika/pull/2495)\n\n### 1.2 Hybrid Storage Model Supports Bitmap\n\nIn a single-node environment, it is impossible to simultaneously optimize PikiwiDB (Pika)'s read/write/compaction, which is known as the \"impossible triangle.\" In version v3.5.2, we supported hybrid storage consisting of cached Redis and RocksDB, which supported five data structures: string/list/set/zset/hashtable. In this release, we have added support for bitmap: https://github.com/OpenAtomFoundation/pika/pull/2253\n\nAdditionally, we now support dynamic tuning of Redis cache parameters in version 3.5.3: https://github.com/OpenAtomFoundation/pika/pull/2197\n\n### 1.3 Separation of Fast and Slow Commands\n\nTo prevent slow commands from blocking the execution of fast commands, we have implemented the separation of fast and slow commands at both the Codis-Proxy and PikiwiDB (Pika) levels.\n\nhttps://github.com/OpenAtomFoundation/pika/pull/2162\n\n### 1.4 Redis Stream\n\nWhile PikiwiDB (Pika) previously supported Redis pubsub, which only allowed for online message passing, in version 3.5.3, we have added limited support for Redis Stream, similar to a message queue (MQ), to facilitate safer message transmission. To ensure data safety, we have specifically added support for the Stream data type in our underlying engine, BlackWidow.\n\nKey PR:\n\n- [Pika Supports Redis Stream](https://github.com/OpenAtomFoundation/pika/pull/1955)\n\nPlease note that Pika Stream currently does not support consumer group consumption and will be available in future updates.\n\n### 1.5 Cloud-Native Cluster\n\nIn PikiwiDB (Pika) 3.5.0, we open-sourced a Pika-Operator that supports deploying a pair of Pika master and slave on K8s. In version 3.5.2, based on Kubeblocks, our Pika-Operator supported deploying a Pika Cluster in the form of Codis on K8s, but it did not support dynamic scaling at the time.\n\nIn version 3.5.3, the latest Pika-Operator now supports node scaling at the Codis Group level and data rebalance.\n\nKey PRs:\n\n- [PikiwiDB (Pika) Operator Supports Pika Cluster Auto-Scaling](https://github.com/OpenAtomFoundation/pika/pull/2121)\n- [Optimizes Codis Slot Migration Speed, Supports Dynamic Adjustment of Migration Threads and Speed](https://github.com/OpenAtomFoundation/pika/pull/2486)\n- [Pika-Operator Supports Namespaces, Allows Deploying Different Clusters in Different Namespaces](https://github.com/OpenAtomFoundation/pika/pull/2480)\n- [Pika-Operator Supports Monitoring Metric Collection, Automatically Launches Pika-Exporter](https://github.com/OpenAtomFoundation/pika/pull/2451)\n\n### 1.6 Compaction Improvements\n\nPikiwiDB (Pika)'s underlying disk storage engine, RocksDB, significantly impacts PikiwiDB (Pika)'s read and write performance during compaction, which appears as \"spikes\" in monitoring systems. Controlling compaction is key to optimizing Pika's read and write performance.\n\nKey PRs for compaction improvements:\n\n- [Adds CompactRange Command to Support Compaction of a Specific Range of Keys](https://github.com/OpenAtomFoundation/pika/pull/2163)\n- [Improves Compaction Speed and Reduces Compaction Time](https://github.com/OpenAtomFoundation/pika/pull/2172)\n- [Invokes Disable Compaction When Executing Shutdown Command, Enhances Exit Speed](https://github.com/OpenAtomFoundation/pika/pull/2345)\n\n### 1.7 Automatic Failover\n\nPikiwiDB (Pika) clusters are currently based on Codis. To enhance the usability of PikiwiDB (Pika) Clusters based on Codis, we have made many extensions to Codis.\n\nThe original Codis did not support failover within Groups, requiring the use of Redis Sentinel, which increases operational costs. We have implemented auto failover for Groups within Codis Dashboard by drawing on the functionality of sentinel.\n\nKey PR:\n\n- [PikiwiDB (Pika) Distributed Cluster Supports Automatic Failover](https://github.com/OpenAtomFoundation/pika/pull/2386)\n\n### 1.8 Observability Enhancements\n\nThe key component for PikiwiDB (Pika) observability is Pika-Exporter. Although Redis Cache was added to the 3.5.2 version, it lacked monitoring metrics. In version 3.5.3, we have added metrics such as hit rate, hits per second, Redis Cache memory usage, number of Redis Caches, and number of Redis Cache DBs.\n\nKey PRs:\n\n- [Pika Exporter Exposes Cache-Related Data Collection Metrics](https://github.com/OpenAtomFoundation/pika/pull/2318)\n- [PikiwiDB (Pika) Distributed Cluster Codis Proxy Adds Observable Metrics](https://github.com/OpenAtomFoundation/pika/pull/2199)\n- [Fixes dbsize Calculation Error](https://github.com/OpenAtomFoundation/pika/pull/2494)\n- [Fixes Inaccurate Network Monitoring Metric Statistics](https://github.com/OpenAtomFoundation/pika/pull/2234)\n\n### 1.9 Data Consistency\n\nVersion 3.5.3 fixes numerous PikiwiDB (Pika) master-slave synchronization issues, ensuring data consistency.\n\nKey PRs:\n\n- [Fixes the Logic for Slave Nodes Receiving Exceptional Reply Packets from Masters During Full-Quantity Replication](https://github.com/OpenAtomFoundation/pika/pull/2319)\n- [Fixes Inconsistency Issues Between Cache and DB Data in Certain Scenarios](https://github.com/OpenAtomFoundation/pika/pull/2225)\n- [Fixes Data Loss Issues After Full-Quantity Replication Failure](https://github.com/OpenAtomFoundation/pika/pull/2439)\n- [Adds Data Synchronization Status During Full-Quantity Replication, Clarifying Data Synchronization Progress](https://github.com/OpenAtomFoundation/pika/pull/2430)\n- [Fixes the Issue of No Proper Response to Slave Synchronization Requests During Master Instance bgsave Execution](https://github.com/OpenAtomFoundation/pika/pull/2437)\n- [Fixes Data Inconsistency Issues When Applying Binlog on Slave Instances Without Locking the Operated Key](https://github.com/OpenAtomFoundation/pika/pull/2409)\n- [Fixes Data Inconsistency Issues After Data Migration](https://github.com/OpenAtomFoundation/pika/pull/2485)\n\n### 1.10 Test Suite Additions\n\nThe PikiwiDB (Pika) test suite consists of gtest unit tests, Redis TCL test suites, and Go test suites. In 3.5.3, we have added Codis cluster e2e tests.\n\nKey PRs:\n\n- [Pika TCL Test Suite](https://github.com/OpenAtomFoundation/pika/pull/2497)\n- [Pika Gotest Test Suite](https://github.com/OpenAtomFoundation/pika/pull/2502)\n\n### 1.11 Toolkit Additions\n\nPikiwiDB (Pika) has always valued the construction of toolkits, and all related tools can be found at https://github.com/OpenAtomFoundation/pika/tree/unstable/tools. In 3.5.3, we have added a new tool:\n\n- [PikiwiDB (Pika) Supports Large Key Analysis Tools](https://github.com/OpenAtomFoundation/pika/pull/2195)\n\n### 1.12 Documentation Updates\n\nThe PikiwiDB (Pika) documentation mainly consists of wiki documentation. In 3.5.3, we have updated the documentation for the Redis commands supported by Pika.\n\nDocumentation link: https://github.com/OpenAtomFoundation/pika/wiki/Pika-Supports-Redis-Interface-and-Content-Situation\n\n## 2 Release Improvements\n\nIn the first chapter, we described the main feature upgrades and improvements of version 3.5.3. Below is a detailed list of the relevant PRs for this release.\n\n### 2.1 New Features\n\n- [Pika Supports ACL](https://github.com/OpenAtomFoundation/pika/pull/2013)\n- [During Full-Quantity Replication, Pika Slave Nodes Do Not Accept Read Requests](https://github.com/OpenAtomFoundation/pika/pull/2197)\n- [Removes Residual Slot Code from Sharing Mode, Returns to v3.0, Where One Pika Instance Has Multiple DBs, Each with Only One Blackwidow](https://github.com/OpenAtomFoundation/pika/pull/2251)\n- [Automatically Recovers Service When Codis Dashboard Coroutine Panics](https://github.com/OpenAtomFoundation/pika/pull/2349)\n- [Pika Cache Adds New Bitmap Data Type](https://github.com/OpenAtomFoundation/pika/pull/2253)\n- [Pika Supports Separation of Fast and Slow Commands](https://github.com/OpenAtomFoundation/pika/pull/2162)\n- [Pika Exporter Exposes Cache-Related Data Collection Metrics](https://github.com/OpenAtomFoundation/pika/pull/2318)\n- [Pika Keeps Unix Timepoint After Completing Bgsave](https://github.com/OpenAtomFoundation/pika/pull/2167)\n- [Pika Supports Dynamic Configuration of disable_auto_compations Parameter](https://github.com/OpenAtomFoundation/pika/pull/2257)\n- [Pika Supports Redis Stream](https://github.com/OpenAtomFoundation/pika/pull/1955)\n- [Pika Supports Large Key Analysis Tools](https://github.com/OpenAtomFoundation/pika/pull/2195)\n- [Pika Supports Dynamic Adjustment of Pika Cache Parameters](https://github.com/OpenAtomFoundation/pika/pull/2197)\n- [Updates Pika Benchmark Tool to Support More Interface Pressure Tests](https://github.com/OpenAtomFoundation/pika/pull/2222)\n- [Pika Operator Supports Pika Cluster Auto-Scaling](https://github.com/OpenAtomFoundation/pika/pull/2121)\n- [Adds CompactRange Command to Support Compaction of a Specific Range of Keys](https://github.com/OpenAtomFoundation/pika/pull/2163)\n- [Improves Compaction Speed and Reduces Compaction Time](https://github.com/OpenAtomFoundation/pika/pull/2172)\n- [Upgrades RocksDB Version to v8.7.3](https://github.com/OpenAtomFoundation/pika/pull/2157)\n- [PikiwiDB (Pika) Distributed Cluster Codis Proxy Adds Observable Metrics](https://github.com/OpenAtomFoundation/pika/pull/2199)\n- [PikiwiDB (Pika) Distributed Cluster Supports Automatic Failover](https://github.com/OpenAtomFoundation/pika/pull/2386)\n- [Pika Supports Redis rename-command Feature](https://github.com/OpenAtomFoundation/pika/pull/2455)\n- [Optimizes Codis Slot Migration Speed, Supports Dynamic Adjustment of Migration Threads and Speed](https://github.com/OpenAtomFoundation/pika/pull/2486)\n- [PikiwiDB (Pika) Supports Dynamic Adjustment of max-conn-rbuf-size Parameter](https://github.com/OpenAtomFoundation/pika/pull/2434)\n- [Pika-Operator Supports Namespaces, Allows Deploying Different Clusters in Different Namespaces](https://github.com/OpenAtomFoundation/pika/pull/2480)\n- [Pika-Operator Supports Monitoring Metric Collection, Automatically Launches Pika-Exporter](https://github.com/OpenAtomFoundation/pika/pull/2451)\n- [ACL Backward Compatibility with Userblacklist](https://github.com/OpenAtomFoundation/pika/pull/2459)\n- [Enriches Pika TCL Test Suite](https://github.com/OpenAtomFoundation/pika/pull/2497)\n- [Enriches Pika Gotest Test Suite](https://github.com/OpenAtomFoundation/pika/pull/2502)\n\n### 2.2 Bug Fixes\n\n- [Fixes Issue of Incorrect Deletion of Dump Files During Full-Quantity Replication by Pika Slave Nodes](https://github.com/OpenAtomFoundation/pika/pull/2377)\n- [Fixes the Logic for Slave Nodes Receiving Exceptional Reply Packets from Masters During Full-Quantity Replication](https://github.com/OpenAtomFoundation/pika/pull/2319)\n- [Invokes Disable Compaction When Executing Shutdown Command, Enhances Exit Speed](https://github.com/OpenAtomFoundation/pika/pull/2345)\n- [Fixes Inaccurate Redis Memory Values in Codis-Dashboard](https://github.com/OpenAtomFoundation/pika/pull/2337)\n- [Optimizes INFO Command Latency, Reduces Frequency of Checking Disk Usage](https://github.com/OpenAtomFoundation/pika/pull/2197)\n- [Fixes Issue of Rsync Deleting Temporary Files with Incorrect Path, Leading to Failure in Opening RocksDB](https://github.com/OpenAtomFoundation/pika/pull/2186)\n- [Fixes Issue of Commands Not Specifying DB Name, Leading to Coredump of Some Commands](https://github.com/OpenAtomFoundation/pika/pull/2194)\n- [Uses info replication Command in Codis Dashboard Instead of info Command to Query Master IP, Reducing Performance Impact on Pika](https://github.com/OpenAtomFoundation/pika/pull/2198)\n- [Fixes Inconsistency Issues Between Cache and DB Data in Certain Scenarios](https://github.com/OpenAtomFoundation/pika/pull/2225)\n- [Fixes Issue of Segmentation Fault When Dump Directory is Empty](https://github.com/OpenAtomFoundation/pika/pull/2265)\n- [Fixes Issue of Certain Commands' Cache Not Taking Effect Due to Incorrect Flag Calculation](https://github.com/OpenAtomFoundation/pika/pull/2217)\n- [Fixes Issue of Slave Instances Being Inaccessible Due to Deadlock After Master Instance flushdb in Master-Slave Replication Mode](https://github.com/OpenAtomFoundation/pika/pull/2249)\n- [Fixes Issue of Commands Not Judging the Return Value of RocksDB](https://github.com/OpenAtomFoundation/pika/pull/2187)\n- [Standardizes Function Return Values and Initial Values](https://github.com/OpenAtomFoundation/pika/pull/2176)\n- [Fixes Inaccurate Network Monitoring Metric Statistics](https://github.com/OpenAtomFoundation/pika/pull/2234)\n- [Fixes Issue of Abnormal Parameters When Loading Configuration File](https://github.com/OpenAtomFoundation/pika/pull/2218)\n- [Fixes 100% CPU Usage Issue in Codis Dashboard](https://github.com/OpenAtomFoundation/pika/pull/2393)\n- [Fixes Issue of Abnormal Display of Pika Master-Slave Roles in Codis Front End](https://github.com/OpenAtomFoundation/pika/pull/2387)\n- [Fixes Data Inconsistency Issues After Data Migration](https://github.com/OpenAtomFoundation/pika/pull/2485)\n- [Fixes Issue of Inaccurate Display in Codis-dashboard After Scaling or Pod Start/Stop](https://github.com/OpenAtomFoundation/pika/pull/2475)\n- [Fixes Issue of Repeated Locking at the DB Level](https://github.com/OpenAtomFoundation/pika/pull/2372)\n- [Fixes Issue of Data Loss After Full-Quantity Replication Failure](https://github.com/OpenAtomFoundation/pika/pull/2439)\n- [Fixes Issue of No Proper Response to Slave Synchronization Requests During Master Instance bgsave Execution](https://github.com/OpenAtomFoundation/pika/pull/2437)\n- [Adds Data Synchronization Status During Full-Quantity Replication, Clarifying Data Synchronization Progress](https://github.com/OpenAtomFoundation/pika/pull/2430)\n- [Fixes Issue of No Locking of Operated Key When Applying Binlog on Slave Instances, Leading to Data Inconsistency](https://github.com/OpenAtomFoundation/pika/pull/2409)\n- [Fixes Issue of Master Instance Coredump During Codis Slot Migration](https://github.com/OpenAtomFoundation/pika/pull/2415)\n- [Fixes Issue of Deleting Dump Files in Use During Master-Slave Replication](https://github.com/OpenAtomFoundation/pika/pull/2377)\n- [Fixes Issue of Rsync Response Errors from Slave Instances During Master-Slave Replication](https://github.com/OpenAtomFoundation/pika/pull/2319)\n\n### 2.3 Release Tag\n\n[PikiwiDB (Pika) v3.5.3 Release Tag](https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3)\n\n## 3 Community\n\nIf you have any questions, feel free to join our community discussion group. The PikiwiDB (Pika) open-source community appreciates your support and help.\n\n* telegram https://t.me/+gMlTzNacOF1iMTM1\n* WeChat Assistant \"PikiwiDB\""},{"id":"Pika-3.5.3","metadata":{"permalink":"/blog/Pika-3.5.3","source":"@site/blog/2024-03-27-Pika-3.5.3.md","title":"What's new in Pika v3.5.3 ","description":"随着 Redis 宣布采用双协议以维护其商业利益,PikiwiDB(Pika) 社区非常荣幸地宣布之际,我们的最新 v3.5.3 正式生产可用版本现已发布。","date":"2024-03-27T00:00:00.000Z","tags":[],"readingTime":14.775,"hasTruncateMarker":false,"authors":[{"name":"360 中间件团队","title":"Pika 开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.3 ","slug":"Pika-3.5.3","authors":[{"name":"360 中间件团队","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.3 (英文版本)","permalink":"/blog/Pika-3.5.3-en"},"nextItem":{"title":"What's new in Pika v3.5.2","permalink":"/blog/Pika-3.5.2"}},"content":"随着 Redis 宣布采用双协议以维护其商业利益,PikiwiDB(Pika) 社区非常荣幸地宣布之际,我们的最新 v3.5.3 正式生产可用版本现已发布。\n\nv3.5.3 版本不仅修复了长期存在的 Bug,还引入了一系列新特性。这些新特性包括 Pika 对 ACL 的支持、移除了 Sharing 模式的残留 Slot 代码、命令执行的快慢分离、Redis Stream 支持、大 key 分析工具、以及 Pika 分布式集群的全自动化 failover 等。此外,我们在 3.5.3 版本中增加了更多的自动化测试用例,以提高 Pika 服务的稳定性和健壮性,确保用户能够享受到更高效、更稳定的使用体验。本文将详细介绍本次更新的主要功能、Bug 修复和性能提升。\n\n在深入探讨 3.5.3 版本的更新内容之前,请注意以下几点声明:\n\n1. 由于商标问题,Pika 项目已更名为 PikiwiDB。在本文中,我们将使用 PikiwiDB(Pika) 来指代项目,项目地址为:https://github.com/OpenAtomFoundation/pika\n2. 我们创建了一个新项目 https://github.com/OpenAtomFoundation/pikiwidb,这是一个基于 Raft 协议实现的兼容 Redis 协议的大容量 KV 数据库,主要面向强一致性数据场景,例如存储约 10TiB 规模的元数据。PikiwiDB 将专门用于指代此项目。\n3. 我们为 PikiwiDB 设计了一个新的 logo,作为其商标,并已在相关政府机构注册。\n\n![](https://github.com/OpenAtomFoundation/pikiwidb/blob/unstable/docs/images/pikiwidb-logo.png)\n\n## 1 主要更新\n\n### 1.1 支持 ACL\n\nPikiwiDB(Pika) 3.5.3 版本正式全面支持 Redis ACL,为未来在云原生 Pika 集群中支持多租户场景奠定了基础。在此之前,Pika 已经支持了 Redis 的用户认证方式,如 auth/userpass/requirepass,以及通过 pika.conf 中的 userblacklist 配置命令黑名单模式。本次更新保持了向后兼容,并支持这些已有的使用方式。\n\n我们还确保 PikiwiDB(Pika) 的 ACL 实现与 Redis ACL 完全兼容,通过将 Redis 的所有 ACL TCL 测试集纳入 PikiwiDB(Pika) 的测试集中。\n\n关键 PR 链接:\n\n- [PikiwiDB(Pika) 支持 ACL](https://github.com/OpenAtomFoundation/pika/pull/2013)\n- [修正 ACL 用户认证错误问题](https://github.com/OpenAtomFoundation/pika/pull/2449)\n- [ACL 向前兼容 userblacklist](https://github.com/OpenAtomFoundation/pika/pull/2459)\n- [添加 Redis ACL 测试集](https://github.com/OpenAtomFoundation/pika/pull/2495)\n\n### 1.2 混合存储模型支持 bitmap\n\n在单体环境下,同时优化 PikiwiDB(Pika) 的读/写/compaction 是一项挑战。在 v3.5.2 版本中,我们引入了由缓存 Redis 和 RocksDB 构成的混合存储模型,并支持了 string/list/set/zset/hashtable 五种数据结构。在 3.5.3 版本中,我们增加了对 bitmap 的支持。\n\n此外,我们在 3.5.3 版本中支持对 Redis 缓存进行动态参数调整。\n\n关键 PR 链接:\n\n- [PikiwiDB(Pika) 支持 bitmap](https://github.com/OpenAtomFoundation/pika/pull/2253)\n- [支持对 Redis 缓存进行动态调参](https://github.com/OpenAtomFoundation/pika/pull/2197)\n\n### 1.3 快慢命令分离\n\n为了避免慢命令阻塞快命令的执行,我们在 Codis-Proxy 和 PikiwiDB(Pika) 两个层面实现了快慢命令分离。\n\n关键 PR 链接:\n\n- [实现快慢命令分离](https://github.com/OpenAtomFoundation/pika/pull/2162)\n\n### 1.4 Redis Stream 支持\n\n虽然 PikiwiDB(Pika) 之前支持了 Redis pubsub,但它只能进行在线消息传递。在 3.5.3 版本中,我们增加了对 Redis Stream 的有限支持,类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,我们在底层引擎 BlackWidow 中特别添加了对 Stream 数据类型的支持。\n\n关键 PR 链接:\n\n- [Pika 支持 Redis Stream](https://github.com/OpenAtomFoundation/pika/pull/1955)\n\n请注意,Pika Stream 目前还不支持消费组消费,这将在后续版本中实现。\n\n### 1.5 云原生集群\n\n在 PikiwiDB(Pika) 3.5.0 版本中,我们开源了 Pika-Operator,它支持在 K8s 上部署 Pika 主从对。在 3.5.2 版本中,我们基于 Kubeblocks 的 Pika-Operator 支持了在 K8s 上部署类似 Codis 的 Pika Cluster,但当时还不支持动态扩缩容。\n\n在 3.5.3 版本中,最新的 Pika-Operator 已经支持了 Codis Group 级别的节点扩缩容,并且支持数据的 Rebalance。\n\n关键 PR 链接:\n\n- [Pika-Operator 支持 Pika 集群自动扩容](https://github.com/OpenAtomFoundation/pika/pull/2121)\n- [优化 codis slot 迁移速度,支持动态修改迁移线程和速度](https://github.com/OpenAtomFoundation/pika/pull/2486)\n- [Pika-operator 支持 namespace,可在不同 namespace 下部署不同的集群](https://github.com/OpenAtomFoundation/pika/pull/2480)\n- [Pika-operator 支持监控指标采集,自动拉起 pika-expoter](https://github.com/OpenAtomFoundation/pika/pull/2451)\n\n### 1.6 Compaction 优化\n\nPikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。\n\n关键 PR 链接:\n\n- [添加 CompactRange 命令,支持对一定范围内的 key 进行 compact](https://github.com/OpenAtomFoundation/pika/pull/2163)\n- [提升 Compaction 速度,减少 Compaction 耗时](https://github.com/OpenAtomFoundation/pika/pull/2172)\n- [执行 shutdown 命令时调用 disable compaction,提升进程退出速度](https://github.com/OpenAtomFoundation/pika/pull/2345)\n\n### 1.7 自动 Failover\n\nPikiwiDB(Pika) 集群目前是基于 Codis 实现的。为了提高基于 Codis 的 PikiwiDB(Pika) Cluster 的易用性,我们对 Codis 进行了许多扩展。\n\n原始的 Codis 不支持 Group 内的 Failover,需要使用 Redis Sentinel,这会导致运维成本增加。我们在 Codis Dashboard 中加入了 sentinel 的功能,实现了对 Group 内主从的自动 failover。\n\n关键 PR 链接:\n\n- [PikiwiDB(Pika) 分布式集群支持自动 failover](https://github.com/OpenAtomFoundation/pika/pull/2386)\n\n### 1.8 可观测性提升\n\nPikiwiDB(Pika) 的可观测性关键组件是 Pika-Exporter。在 3.5.2 版本中,我们虽然添加了 Redis Cache 缓存热数据,但缺少监控指标。在 3.5.3 版本中,我们增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标。\n\n关键 PR 链接:\n\n- [Pika exporter 暴露 cache 相关的数据采集指标](https://github.com/OpenAtomFoundation/pika/pull/2318)\n- [PikiwiDB(Pika) 分布式集群 Codis proxy 新增可观测指标](https://github.com/OpenAtomFoundation/pika/pull/2199)\n- [修复 dbsize 计算错误问题](https://github.com/OpenAtomFoundation/pika/pull/2494)\n- [修复网络监控指标统计不准确的问题](https://github.com/OpenAtomFoundation/pika/pull/2234)\n\n### 1.9 数据一致性\n\n3.5.3 版本修复了许多 PikiwiDB(Pika) 主从同步问题,确保数据的一致性。\n\n关键 PR 链接:\n\n- [修复主从复制过程中,slave 节点收到 master 异常回包后的处理逻辑](https://github.com/OpenAtomFoundation/pika/pull/2319)\n- [修复 Pika cache 部分场景下 cache 和 DB 数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2225)\n- [修复全量复制失败后,未做处理导致数据丢失问题](https://github.com/OpenAtomFoundation/pika/pull/2439)\n- [修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求](https://github.com/OpenAtomFoundation/pika/pull/2437)\n- [全量复制过程中,添加数据同步状态,明确数据同步进度](https://github.com/OpenAtomFoundation/pika/pull/2430)\n- [修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2409)\n- [修复迁移数据后数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2485)\n\n### 1.10 测试集增加\n\nPikiwiDB(Pika) 的测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。在 3.5.3 版本中,我们增加了 Codis 集群 e2e 测试。\n\n关键 PR 链接:\n\n- [Pika TCL 测试集](https://github.com/OpenAtomFoundation/pika/pull/2497)\n- [Pika Gotest 测试集](https://github.com/OpenAtomFoundation/pika/pull/2502)\n\n### 1.11 工具集更新\n\nPikiwiDB(Pika) 一直重视工具集的建设,所有相关工具都可以在 https://github.com/OpenAtomFoundation/pika/tree/unstable/tools 中找到。在 3.5.3 版本中,我们新增了一个工具:\n\n- [PikiwiDB(Pika) 支持大 key 分析工具](https://github.com/OpenAtomFoundation/pika/pull/2195)\n\n### 1.12 文档更新\n\nPikiwiDB(Pika) 的文档主要是 wiki 文档。在 3.5.3 版本中,我们更新了 Pika 支持的 Redis 命令文档。\n\n文档链接:https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5\n\n## 2 发版详情\n\n在第一章节中,我们概述了 3.5.3 版本的主要功能升级和改进。下面详细列出了本次发版的相关 PR。\n\n### 2.1 新特性\n\n- [Pika 支持 ACL](https://github.com/OpenAtomFoundation/pika/pull/2013)\n- [在全量复制过程中,pika 服务的从节点不接收读请求](https://github.com/OpenAtomFoundation/pika/pull/2197)\n- [删除 Sharing 模式残留的 Slot 代码,回归 3.0,以后一个 Pika 下有多个 DB,每个 DB 只有一个 Blackwidow](https://github.com/OpenAtomFoundation/pika/pull/2251)\n- [在 Codis dashboard 协程 panic 时自动恢复服务](https://github.com/OpenAtomFoundation/pika/pull/2349)\n- [Pika cache 新增 bimap数据类型](https://github.com/OpenAtomFoundation/pika/pull/2253)\n- [Pika 支持快慢命令分离](https://github.com/OpenAtomFoundation/pika/pull/2162)\n- [Pika exporter 暴露 cache 相关的数据采集指标](https://github.com/OpenAtomFoundation/pika/pull/2318)\n- [Pika 执行完成 Bgsave 后, 保留 unix timepoint](https://github.com/OpenAtomFoundation/pika/pull/2167)\n- [Pika 支持动态配置 disable_auto_compations 参数](https://github.com/OpenAtomFoundation/pika/pull/2257)\n- [Pika 支持 Redis Stream](https://github.com/OpenAtomFoundation/pika/pull/1955)\n- [Pika 支持大 key 分析工具](https://github.com/OpenAtomFoundation/pika/pull/2195)\n- [Pika 支持动态调整 Pika cache 参数](https://github.com/OpenAtomFoundation/pika/pull/2197)\n- [更新 Pika benchmark 工具支持更多的接口压测](https://github.com/OpenAtomFoundation/pika/pull/2222)\n- [Pika Operator 支持 Pika 集群自动扩容](https://github.com/OpenAtomFoundation/pika/pull/2121)\n- [添加 CompactRange 命令支持对一定范围内的 key 进行 compact](https://github.com/OpenAtomFoundation/pika/pull/2163)\n- [提升 Compaction 速度减少 Compaction 耗时](https://github.com/OpenAtomFoundation/pika/pull/2172)\n- [升级 RocksDB 版本到 v8.7.3](https://github.com/OpenAtomFoundation/pika/pull/2157)\n- [Pika 分布式集群 Codis proxy 新增可观测指标](https://github.com/OpenAtomFoundation/pika/pull/2199)\n- [Pika 分布式集群支持自动 failover](https://github.com/OpenAtomFoundation/pika/pull/2386)\n- [Pika 支持 redis rename-command 功能](https://github.com/OpenAtomFoundation/pika/pull/2455)\n- [优化 codis slot 迁移速度,支持动态修改迁移线程和速度](https://github.com/OpenAtomFoundation/pika/pull/2486)\n- [Pika 支持动态调整 max-conn-rbuf-size 参数](https://github.com/OpenAtomFoundation/pika/pull/2434)\n- [Pika-operator 支持 namespace,可以在不同的 namespace 下部署不同的集群](https://github.com/OpenAtomFoundation/pika/pull/2480)\n- [Pika-operator 支持监控指标采集,自动拉起 pika-expoter](https://github.com/OpenAtomFoundation/pika/pull/2451)\n- [ACL 向前兼容 userblacklist](https://github.com/OpenAtomFoundation/pika/pull/2459)\n- [丰富了 Pika TCL 测试集](https://github.com/OpenAtomFoundation/pika/pull/2497)\n- [丰富了 Pika Gotest 测试集](https://github.com/OpenAtomFoundation/pika/pull/2502)\n\n### 2.2 Bug 修复\n\n- [修复 Pika 有从节点进行全量复制期间会误删除 dump 文件的问题](https://github.com/OpenAtomFoundation/pika/pull/2377)\n- [修复主从复制过程中, slave 节点收到 master 异常回包后的处理逻辑](https://github.com/OpenAtomFoundation/pika/pull/2319)\n- [在 Pika 执行 shutdown 命令时调用 disable compaction, 提升进程退出速度](https://github.com/OpenAtomFoundation/pika/pull/2345)\n- [修复 Codis-dashboard Redis Memory 值不准确的问题](https://github.com/OpenAtomFoundation/pika/pull/2337)\n- [INFO 命令耗时优化,降低查磁盘使用量的频率](https://github.com/OpenAtomFoundation/pika/pull/2197)\n- [修复 Rsync 删除临时文件路径不对,删除失败,导致rocksdb打开失败的问题](https://github.com/OpenAtomFoundation/pika/pull/2186)\n- [修复 Compact, Bgsave, Info keyspace 命令未指定db名称,导致部分命令 coredump 的问题](https://github.com/OpenAtomFoundation/pika/pull/2194)\n- [Codis dashboard 用 info replication 替代 info 命令查寻 master ip 降低对 Pika 的性能影响](https://github.com/OpenAtomFoundation/pika/pull/2198)\n- [修复 Pika cache 使用边缘case,解决部分场景下 cache 和 DB 数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2225)\n- [修复当 dump 文件夹为空时,会启动报错 Segmentation fault 的问题](https://github.com/OpenAtomFoundation/pika/pull/2265)\n- [修复因为 flag 计算错误,导致的部分命令缓存没有生效问题](https://github.com/OpenAtomFoundation/pika/pull/2217)\n- [修复主从复制模式下,主实例 flushdb 后,从实例因为死锁导致的不能访问的问题](https://github.com/OpenAtomFoundation/pika/pull/2249)\n- [修复部分命令未对 RocksDB 的返回值进行判断的问题](https://github.com/OpenAtomFoundation/pika/pull/2187)\n- [规范函数的返回值及初始值](https://github.com/OpenAtomFoundation/pika/pull/2176)\n- [修复网络监控指标统计不准确的问题](https://github.com/OpenAtomFoundation/pika/pull/2234)\n- [修复配置文件加载部分参数异常的问题](https://github.com/OpenAtomFoundation/pika/pull/2218)\n- [修复 Codis dashboard cpu 100% 的问题](https://github.com/OpenAtomFoundation/pika/pull/2393)\n- [修复 Codis fe pika 主从角色显示异常的问题](https://github.com/OpenAtomFoundation/pika/pull/2387)\n- [修复迁移数据后数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2485)\n- [修复 dbsize 计算错误问题](https://github.com/OpenAtomFoundation/pika/pull/2494)\n- [修复扩缩容或者 pod 起停后,Codis-dashboard 界面显示不准确的问题](https://github.com/OpenAtomFoundation/pika/pull/2475)\n- [修复 DB 层重复上锁的问题](https://github.com/OpenAtomFoundation/pika/pull/2372)\n- [修复全量复制失败后,未做处理导致数据丢失问题](https://github.com/OpenAtomFoundation/pika/pull/2439)\n- [修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求](https://github.com/OpenAtomFoundation/pika/pull/2437)\n- [全量复制过程中,添加数据同步状态,明确数据同步进度](https://github.com/OpenAtomFoundation/pika/pull/2430)\n- [修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2409)\n- [修复 codis slot 迁移过程中 master 实例 coredump 的问题](https://github.com/OpenAtomFoundation/pika/pull/2415)\n- [修复在主从复制过程中,删除正在使用的 dump 文件的问题](https://github.com/OpenAtomFoundation/pika/pull/2377)\n- [修复主从复制过程中从实例 rsync 响应错误的问题](https://github.com/OpenAtomFoundation/pika/pull/2319)\n\n### 2.3 发版标签\n\nhttps://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3\n\n## 3 社区\n\nPikiwiDB(Pika) 开源社区感谢您的支持,如果您有任何疑问或建议,欢迎加入我们的社区交流群:\n\n* 微信助手 PikiwiDB【请在微信中搜索 PikiwiDB】\n* telegram 群 https://t.me/+gMlTzNacOF1iMTM1"},{"id":"Pika-3.5.2","metadata":{"permalink":"/blog/Pika-3.5.2","source":"@site/blog/2023-12-03-Pika-3.5.2.md","title":"What's new in Pika v3.5.2","description":"Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。","date":"2023-12-03T00:00:00.000Z","tags":[],"readingTime":2.575,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.2","slug":"Pika-3.5.2","authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.3 ","permalink":"/blog/Pika-3.5.3"},"nextItem":{"title":"What's new in Pika v3.5.1","permalink":"/blog/Pika-3.5.1"}},"content":"Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。\n\n## 新特性\n\n+ Pika 支持 Redis 事务,使得 Pika 的数据够在一系列命令的执行中保持数据的一致性和可靠性。 https://github.com/OpenAtomFoundation/pika/pull/2124\n+ Pika 上层增加缓存层实现冷热数据分离,提升读性能。 https://github.com/OpenAtomFoundation/pika/pull/2171\n+ Codis-Proxy 支持动态修改配置参数,方便我们做参数调整。 https://github.com/OpenAtomFoundation/pika/pull/2110\n+ 补全 Go Test 测试用例。 https://github.com/OpenAtomFoundation/pika/pull/2082\n+ CI 增加 cache 提升编译速度。 https://github.com/OpenAtomFoundation/pika/pull/2093\n+ 增加 redis-copy 流量复制工具。 https://github.com/OpenAtomFoundation/pika/pull/2060\n\nbugfix\n\n+ 修复 pika 在使用 SETRANGE 命令出现 coredump 的问题。 https://github.com/OpenAtomFoundation/pika/pull/2141\n+ 修复因删除 Clearreplicationid 写进 binlog 导致的全量复制问题。 https://github.com/OpenAtomFoundation/pika/pull/2135\n+ 修改锁粒度,提升 pika 写 binlog 的性能。 https://github.com/OpenAtomFoundation/pika/pull/2129\n+ 修复复杂数据类型成员变量可能出现数据溢出。 https://github.com/OpenAtomFoundation/pika/pull/2106\n+ 修复 decr 命令返回值错误问题。 https://github.com/OpenAtomFoundation/pika/pull/2092\n+ 修复 setrange 和 setbit 命令没有保留原 key 的过期时间的问题。 https://github.com/OpenAtomFoundation/pika/pull/2095\n\n下期版本规划\n\n预计再过两个月左右,我们会在农历新年前发布 3.5.3 版本,相关关键特性有:\n\n+ Pika 通过快慢命令分离提升读写性能。 https://github.com/OpenAtomFoundation/pika/pull/2162\n+ 支持 Redis ACL,在 Pika 中引入用户概念,进行权限控制。 https://github.com/OpenAtomFoundation/pika/pull/2013\n+ 支持 Redis Stream,实现消息队列。 https://github.com/OpenAtomFoundation/pika/pull/1955\n+ 添加 Pika 特有命令 compactrange,对指定范围内的 key 进行 compact 以解决大 key 删除时读放大的问题。 https://github.com/OpenAtomFoundation/pika/pull/2163\n+ 支持 lastsave 指令。 https://github.com/OpenAtomFoundation/pika/pull/2167\n\n感谢大家对 Pika 开源公众号的关注 ,Pika 3.5 版本重大特性及使用规范我们会在稍后的文章中进行介绍,我们下期再见~\n\n![2023-09-28-Pika-3.5.2-connect](2023-12-03-Pika-3.5.2-connect.png)"},{"id":"Pika-3.5.1","metadata":{"permalink":"/blog/Pika-3.5.1","source":"@site/blog/2023-09-28-Pika-3.5.1.md","title":"What's new in Pika v3.5.1","description":"Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 。","date":"2023-09-28T00:00:00.000Z","tags":[],"readingTime":4.385,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"frontMatter":{"title":"What's new in Pika v3.5.1","slug":"Pika-3.5.1","authors":[{"name":"于雨","title":"dubbo-go开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.2","permalink":"/blog/Pika-3.5.2"},"nextItem":{"title":"What's new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"}},"content":"Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 。\n\n该版本不仅做了很多优化工作,还引入了多项新功能。这些新功能包括 动态关闭 WAL、ReplicationID 检测是否增量复制、在 K8s 环境上 Pika 服务的自动注册从而实现集群的自组织、以及 exporter 检测集群指标等等,无疑将会让用户享受到更为稳定和高效的 NoSQL 使用体验。\n\n## 新特性\n\n+ 1 Slow log 增加队列等待时间统计,在队列阻塞的时候方便我们进行问题定位。PR 1997, 作者 wangshao1。\n+ 2 主从复制使用 ReplicationID 判断是否进行增量同步,解决原主从同步方式切主后整个数据集会进行全量复制的问题,可以提升 Pika 性能。PR 1951, 作者 Mixficsol。\n+ 3 WAL 以 'disablewal' 命令方式支持动态关闭,在写性能遇到瓶颈的时候,可以通过命令关闭 WAL 缓解写性能下降的问题,关闭 WAL 有机器宕机后丢失数据的风险,用户需要根据自己的使用习惯权衡。PR 2015,作者 Mixficsol。\n+ 4 flush 线程数和 compaction 线程数合二为一,在 Compaction 性能瓶颈时,可以动态调整线程数,缓解 Comapction 损耗 Pika 性能的问题。PR 2014, 作者 Tianpingan。\n+ 5 升级了 RocksDB 版本到 v8.3.3。PR 2000, 作者 dingxiaoshuai123。\n+ 6 新增周期性打印工作队列的长度功能,在队列阻塞的时候可以快速定位问题。PR 1978, 作者 Tianpingan。\n+ 7 新增利用一个 pika_exporter 监测整个集群的指标,实现一个 Pika Exporter 实例监控整个集群,解决了 3.5.0 版本一个 Pika Exporter 监测一个 Pika 实例消耗资源的问题。PR 1953, 作者 chenbt-hz。\n+ 8 实现在 K8s 环境上 Pika 服务的自动注册,在启动时自动注册,从而实现集群的自组织 ,实现了通过命令拉起整个 Pika Cluster 集群。PR 1931, 作者 machinly。\n\n## 2 bug 修复\n\n+ 1 调整了 Rate_limit 参数,修复了压测时出现 RPS 为 0 的情况 。PR 2009, 作者 Mixficsol。\n+ 2 修复了 INFODATA 命令中对于遍历数据文件时出现空路径的逻辑判断。PR 1996, 作者 Mixficsol。\n+ 3 修复了 Codis 在线上出现大毛刺的问题。PR 2016, 作者 chejinge。\n+ 4 修复了 macOS 环境下编译使用 tools 导致编译不过的问题 。PR 2011, 作者 A2ureStone。\n+ 5 减少了 exporter 非必要日志的打印,降低 了资源利用率。PR 1945, 作者 Mixficsol。\n\n## 3 使用建议\n\n本次新增了几个配置参数,大家在使用过程中,需要根据使用情况按需调整:\n\n+ 1 max-rsync-parallel-num:主从全量复制线程数,需要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 2。\n+ 2 rate-limiter-bandwidth: 限制 RocksDB 数据库读写速度,限制数据库在一定时间内可以读写的数据量,默认 2000MiB/s,需要根据自己的机器性能和部署实例做调整。\n+ max-background-jobs: compaction 和 flushdb 线程数,要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 4。\n+ 3 throttle-bytes-per-second: 主从复制传输限速参数,默认为 200MiB/s,该参数可以根据机器网卡的配置及部署 pika 实例的个数进行调整。\n\n![2023-09-28-Pika-3.5.1-connect.png](2023-09-28-Pika-3.5.1-connect.png)"},{"id":"Pika-3.5.0","metadata":{"permalink":"/blog/Pika-3.5.0","source":"@site/blog/2023-08-25-Pika-3.5.0.md","title":"What's new in Pika v3.5.0","description":"时隔两年,Pika 社区正式发布经由社区 50 多人参与开发并在 360 生产环境验证可用的 v3.5.0 版本,新版本在提升性能的同时,也支持了 Codis 集群部署,BlobDB KV 分离,增加 Exporter 等新特性。","date":"2023-08-25T00:00:00.000Z","tags":[],"readingTime":9.825,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"dubbogo示土区"}],"frontMatter":{"title":"What's new in Pika v3.5.0","slug":"Pika-3.5.0","authors":[{"name":"于雨","title":"dubbogo示土区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.1","permalink":"/blog/Pika-3.5.1"},"nextItem":{"title":"Pika Blackwidow 引擎数据存储格式","permalink":"/blog/pika-blackwidow"}},"content":"时隔两年,Pika 社区正式发布经由社区 50 多人参与开发并在 360 生产环境验证可用的 v3.5.0 版本,新版本在提升性能的同时,也支持了 Codis 集群部署,BlobDB KV 分离,增加 Exporter 等新特性。\n\n我们将详细介绍该版本引入的重要新特性。\n\n## 1 去除 Rsync\n\n在 v3.5.0 版本之前,Pika 使用 Rsync 工具进行引擎中存量数据的同步,Pika 进程启动时创建 Rsync 子进程。这种同步方式在实际使用中出现了一些问题,包括Pika 进程 crash 后重新拉起无法正常同步以及同步过程中 Rsync 进程无故退出等。在今年发布的 v3.5.0 版本中,我们在全量同步方案方面进行了重要的改进,摒弃了以往使用的 Rsync,实现了全新的数据同步方案,支持了断点续传,动态调节传输限速等特性,以确保同步过程更加稳定、可控。这些改进不仅增强了同步的可靠性,还为用户提供了更好的使用体验。\n\n+ 去除 Rsync 进程,使用自研全量同步方式\n https://github.com/OpenAtomFoundation/pika/pull/1805\n\n+ 实现断点续传,传输限速功能\n https://github.com/OpenAtomFoundation/pika/pull/1926\n\n+ Pika 主从同步时,进行 master run_id 的检验\n https://github.com/OpenAtomFoundation/pika/pull/1805\n\n## 2 兼容更多 Redis 命令\n\n在 v3.5.0 版本中,我们迈出了更大的一步,提升了对 Redis 命令的兼容性,对 Redis 命令提供了更广泛的支持。这个版本的改进使得 Pika 在与 Redis 生态系统的集成中表现更加出色,为用户提供了更丰富的功能和更广阔的可能性。我们对命令支持的扩展,为用户提供了更多的灵活性,以满足不同场景下的需求。\n\n+ 支持 UNLINK 命令\n https://github.com/OpenAtomFoundation/pika/pull/1273\n+ 支持 INFO COMMANDSTATS 命令\n https://github.com/OpenAtomFoundation/pika/pull/1660\n+ 支持 HELLO、SETNAME 命令\n https://github.com/OpenAtomFoundation/pika/pull/1245\n+ 支持 BLPOP、BRPOP 命令\n https://github.com/OpenAtomFoundation/pika/pull/1548\n+ 新增 Pika 原创 DISKRECOVERY 命令\n https://github.com/OpenAtomFoundation/pika/pull/1843\n\n## 3 RocksDB 版本升级和分级压缩\n\n在 v3.5.0 版本中,我们进行了一项重要的升级,将 RocksDB 引擎升级至 v8.1.1 版本,并实现了分级压缩功能的整合。这一升级不仅是技术的飞跃,也是我们对系统性能和优化的持续关注的体现。通过这项升级,我们为 Pika 增加了更高级别的数据管理能力,同时也让系统更好地适应不同的压缩需求,为用户的数据存储和检索提供了更大的灵活性和效率。\n\n+ 升级 RocksDB 版本到 v8.1.1\n https://github.com/OpenAtomFoundation/pika/pull/1396\n+ 实现 RocksDB 分级压缩\n https://github.com/OpenAtomFoundation/pika/pull/1365\n+ 新增 RocksDB 缓存配置项 num-shard-bits 能够从配置文件中读取\n https://github.com/OpenAtomFoundation/pika/pull/1189\n\n## 4 支持 BlobDB\n\n在 v3.5.0 版本中,我们引入了引人瞩目的创新--对 BlobDB 和 KV 存储层进行了分离,为我们的系统注入了新的活力。这个版本的升级使得 Pika 在数据存储方面更加灵活和高效。我们通过支持 BlobDB KV 分离,提供了更优化的数据存储结构,为用户的数据管理和查询操作带来了更深层次的优势。这一重要改进将在更多应用场景下展现出其强大的潜力。\n\n+ 支持 BlobDB KV 分离\n https://github.com/OpenAtomFoundation/pika/pull/1456\n\n## 5 基于 Codis 的集群模式\n\n在 v3.5.0 版本中,我们积极引入了 Codis 集群模式,此外,我们不仅仅将 Codis 集群模式融入了系统中,还为其提供了迁移 slot 的命令支持,从而实现了更加智能化的集群管理。这一重大变革不仅扩展了 Pika 在大规模数据存储场景中的应用范围,还进一步提升了系统的可扩展性和高可用性。通过引入 Codis 集群模式,我们对用户的数据处理和管理提供了更优化的解决方案。\n\n+ 引入 Codis 到 Pika\n\n https://github.com/OpenAtomFoundation/pika/pull/1279\n\n+ 引入 Codis 的 CI\n\n https://github.com/OpenAtomFoundation/pika/pull/1311\n\n+ 支持 Codis 迁移 slot 命令\n\n https://github.com/OpenAtomFoundation/pika/pull/1632\n\n+ 新增是否在 reload 的 slotmigrate 状态\n\n https://github.com/OpenAtomFoundation/pika/pull/1700\n\n## 6 可观测性\n\n在 v3.5.0 版本中,我们引入了一个创新性的工具--pika_exporter,以提升对 Pika 数据库的可观测性。这一工具的加入不仅是对我们对系统监测能力的持续增强的反映。而在版本的后续更新中,我们进一步充实了指标,不断丰富了 Pika 的可观测性。为用户提供了更为全面和精准的数据洞察力。\n\n+ 新增 Pika 可观测系统 pika_exporter\n\n https://github.com/OpenAtomFoundation/pika/pull/1388\n\n+ 新增网络 I/O 流量监控指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1733\n\n+ 新增命令统计耗时指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1751\n\n+ 新增 estimate_pending_compaction_bytes 度量来分析碎片率指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1736\n\n+ 新增 RocksDB 指标\n\n https://github.com/OpenAtomFoundation/pika/pull/1560\n\n## 7 容器化部署\n\n在 v3.5.0 版本中,我们引入了一个具有创新意义的里程碑--pika-operator mvp 版本,这一版本在技术上实现了一个重要目标:将 Pika 单实例服务迁移到 Kubernetes(K8s)平台上的快速部署。这不仅是对我们持续关注行业发展的体现,也是我们不断提升用户体验的追求。通过 pika-operator,我们为用户提供了更便捷的部署方案,将 Pika 的高性能数据库引擎与 Kubernetes 的灵活性相融合,从而为用户的应用环境带来更高效、更弹性的支持。\n\n+ 实现 Pika 单例服务在 K8s 上快速部署\n https://github.com/OpenAtomFoundation/pika/pull/1243\n+ 实现了在 MiniKube 环境中部署 Pika\n https://github.com/OpenAtomFoundation/pika/pull/1330\n+ 给 pika-operator 添加 E2E 测试\n https://github.com/OpenAtomFoundation/pika/pull/1347\n\n## 8 跨平台编译\n\n在 v3.5.0 版本中,Pika 呈现出一种全面性的蓬勃发展态势,得以在不同操作系统平台上展现其优越性。此版本的突破性之处在于,Pika 实现了对 MacOS、CentOS 和 Ubuntu 这些主要平台的完整编译和使用支持。这个举措不仅仅体现了我们对多样化技术环境的关注,也是为了最大程度地拓展用户基础,为广泛的用户群体提供灵活、高效的数据库解决方案。这种跨平台兼容性的加强将 Pika 推向更广阔的技术生态。\n\n+ 支持 MacOS 平台\n https://github.com/OpenAtomFoundation/pika/pull/1372\n\n## 9 多平台集成测试及单元测试\n\n在 v3.5.0 版本中,我们迈出了一个令人瞩目的步伐,不仅在多个主要操作系统平台上实现了支持,还在测试领域实施了全面升级。我们为 Ubuntu、CentOS 和 MacOS 这三大平台搭建了持续集成(CI)环境,以确保系统的完整性和稳定性。在测试方面,我们引入了更为广泛的覆盖,包括 Go 语言的集成测试、TCL 的单元测试以及 Python 的端到端(E2E)测试。通过这些测试策略的升级,我们在确保系统性能和可靠性方面迈出了更大的一步。\n\n+ 新增 CentOS 环境下的 CI\n https://github.com/OpenAtomFoundation/pika/pull/1534\n+ 新增 MacOS 环境下的 CI\n https://github.com/OpenAtomFoundation/pika/pull/1769\n+ 新增 E2E 测试框架\n https://github.com/OpenAtomFoundation/pika/pull/1347\n+ 新增在 Github CI Workflow 中添加 CMake 编译环境\n https://github.com/OpenAtomFoundation/pika/pull/1268\n+ 新增在 TCL 脚本中 populate 方法模拟 Redis debug populate 方法,用以填充测试数据\n https://github.com/OpenAtomFoundation/pika/pull/1693\n+ 新增在 blackwidow 中添加 CMake 文件,添加对 blackwidow 的单元测试\n https://github.com/OpenAtomFoundation/pika/pull/1246\n+ 移植 Redis 测试脚本\n https://github.com/OpenAtomFoundation/pika/pull/1357\n\n## 10 Others\n\n若您有任何疑问,诚挚欢迎您扫描微信二维码,加入我们的交流群,与一众志同道合的成员展开深入的讨论,我们热切期待与您分享见解、交流心得,为共同的技术探索和创新之旅添砖加瓦。在这个群体中,我们将以卓越的智慧和互动的合作精神,构建出一个相互学习、不断进步的技术共同体。\n\n![2023-08-25-Pika-3.5.0](2023-08-25-Pika-3.5.0-connect.png)"},{"id":"pika-blackwidow","metadata":{"permalink":"/blog/pika-blackwidow","source":"@site/blog/2020-7-16-pika-blackwidow.md","title":"Pika Blackwidow 引擎数据存储格式","description":"Blackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。","date":"2020-07-16T00:00:00.000Z","tags":[],"readingTime":12.29,"hasTruncateMarker":false,"authors":[{"name":"Axlgrep","title":"Pika 开源社区"}],"frontMatter":{"title":"Pika Blackwidow 引擎数据存储格式","slug":"pika-blackwidow","authors":[{"name":"Axlgrep","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What's new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"},"nextItem":{"title":"pika_port 迁移工具","permalink":"/blog/Pika-Tools-Port-Bin"}},"content":"Blackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。\n\n![pika-blackwidow-1](pika-blackwidow-1.png)\n\n## 1. String结构的存储\nString本质上就是Key, Value, 我们知道Rocksdb本身就是支持kv存储的, 我们为了实现Redis中的expire功能,所以在value后面添加了4 Bytes用于存储timestamp, 作为最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n\n![pika-blackwidow-2](pika-blackwidow-2.png)\n\n如果我们没有对该String对象设置超时时间,则timestamp存储的值就是默认值0, 否则就是该对象过期时间的时间戳, 每次我们获取一个String对象的时候, 首先会解析Value部分的后四字节, 获取到timestamp做出判断之后再返回结果。\n\n## 2. Hash结构的存储\nblackwidow中的hash表由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是hash表的一些信息, 比如说当前hash表的域的数量以及当前hash表的版本号和过期时间(用做秒删功能), 而普通数据主要就是指的同一个hash表中一一对应的field和value,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n1. 每个hash表的meta_key和meta_value的落盘方式:\n![pika-blackwidow-3](pika-blackwidow-3.png)\n\nmeta_key实际上就是hash表的key, 而meta_value由三个部分构成: 4Bytes的Hash size(用于存储当前hash表的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Hash表设置的超时时间的时间戳, 默认为0)\n\n2. hash表中data_key和data_value的落盘方式:\n![pika-blackwidow-4](pika-blackwidow-4.png)\n\ndata_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + Field的内容, 而data_value就是hash表某个field对应的value。\n\n3. 如果我们需要查找一个hash表中的某一个field对应的value, 我们首先会获取到meta_value解析出其中的timestamp判断这个hash表是否过期, 如果没有过期, 我们可以拿到其中的version, 然后我们使用key, version,和field拼出data_key, 进而找到对应的data_value(如果存在的话)\n\n## 3. List结构的存储\nblackwidow中的list由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是list链表的一些信息, 比如说当前list链表结点的的数量以及当前list链表的版本号和过期时间(用做秒删功能), 还有当前list链表的左右边界(由于nemo实现的链表结构被吐槽lrange效率低下,所以这次blackwidow我们底层用数组来模拟链表,这样lrange速度会大大提升,因为结点存储都是有序的), 普通数据实际上就是指的list中每一个结点中的数据,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式\n1. 每个list链表的meta_key和meta_value的落盘方式:\n![pika-blackwidow-5](pika-blackwidow-5.png)\n\nmeta_key实际上就是list链表的key, 而meta_value由五个部分构成: 8Bytes的List size(用于存储当前链表中总共有多少个结点) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个List链表设置的超时时间的时间戳, 默认为0) + 8Bytes的Left Index(数组的左边界) + 8Bytes的Right Index(数组的右边界)\n\n2. list链表中data_key和data_value的落盘方式:\n![pika-blackwidow-6](pika-blackwidow-6.png)\n\ndata_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Index(这个记录的就是当前结点的在这个list链表中的索引), 而data_value就是list链表该node中存储的值\n\n## 4. Set结构的存储\nblackwidow中的set由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是set集合的一些信息, 比如说当前set集合member的数量以及当前set集合的版本号和过期时间(用做秒删功能), 普通数据实际上就是指的set集合中的member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n1. 每个set集合的meta_key和meta_value的落盘方式:\n![pika-blackwidow-7](pika-blackwidow-7.png)\n\nmeta_key实际上就是set集合的key, 而meta_value由三个部分构成: 4Bytes的Set size(用于存储当前Set集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个set集合设置的超时时间的时间戳, 默认为0)\n\n2. set集合中data_key和data_value的落盘方式:\n![pika-blackwidow-8](pika-blackwidow-8.png)\n\ndata_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, 由于set集合只需要存储member, 所以data_value实际上就是空串\n\n## 5. ZSet结构的存储\nblackwidow中的zset由两部部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是zset集合的一些信息, 比如说当前zset集合member的数量以及当前zset集合的版本号和过期时间(用做秒删功能), 而普通数据就是指的zset中每个member以及对应的score, 由于zset这种数据结构比较特殊,需要按照memer进行排序,也需要按照score进行排序, 所以我们对于每一个zset我们会按照不同的格式存储两份普通数据, 在这里我们称为member to score和score to member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:\n1. 每个zset集合的meta_key和meta_value的落盘方式:\n![](https://i.imgur.com/RhZ8KMw.png)\n\nmeta_key实际上就是zset集合的key, 而meta_value由三个部分构成: 4Bytes的ZSet size(用于存储当前zSet集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Zset集合设置的超时时间的时间戳, 默认为0)\n\n2. 每个zset集合的data_key和data_value的落盘方式(member to score):\n![](https://i.imgur.com/C85Ba5Z.png)\n\nmember to socre的data_key由四个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, data_value中存储的其member对应的score的值,大小为8个字节,由于rocksdb默认是按照字典序进行排列的,所以同一个zset中不同的member就是按照member的字典序来排列的(同一个zset的key size, key, 以及version,也就是前缀都是一致的,不同的只有末端的member).\n\n3. 每个zset集合的data_key和data_value的落盘方式(score to member):\n![](https://i.imgur.com/QV9XHEk.png)\n\nscore to member的data_key由五个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Score + member的内容, 由于score和member都已经放在data_key中进行存储了所以data_value就是一个空串,无需存储其他内容了,对于score to member中的data_key我们自己实现了rocksdb的comparator,同一个zset中score to member的data_key会首先按照score来排序, 在score相同的情况下再按照member来排序\n\n\n## Blackwidow相对于Nemo有哪些优势\n\n1. Blackwidow采用了rocksdb的column families的新特性,将元数据和实际数据分开存放(对应于上面的meta数据和data数据), 这种存储方式相对于Nemo将meta, data混在一起存放更加合理, 并且可以提升查找效率(比如info keyspace的效率会大大提升)\n2. Blackwidow中参数传递大量采用Slice而Nemo中采用的是std::string, 所以Nemo会有很多没有必要的string对象的构造函数以及析构函数的调用,造成额外的资源消耗,而Blackwidow则不会有这个问题\n3. Blackwidow对kv模拟多数据结构的存储格式上做了重新设计(具体可以参考Nemo引擎数据存储格式和本篇文章),使之前在Nemo上出现的一些无法解决的性能问题得以解决,所以Blackwidow的多数据结构在某些场景下性能远远优于Nemo\n4. 原来Nemo对多数据结构的Key的长度最大只能支持到256 Bytes,而Blackwidow经过重新设计,放开了多数据结构Key长度的这个限制\n5. Blackwidow相对于Nemo更加节省空间,Nemo由于需要nemo-rocksdb的支持,所以不管在meta还是data数据部分都追加了version和timestamp这些信息,并且为了区分meta_key和data_key, 在最前面加入s和S(拿Set数据结构打比方),Blackwidow在这方面做了优化,使同样的数据量下Blackwidow所占用的空间比Nemo要小(举个例子,Blackwidow中List结构中的一个Node就比Nemo中的一个Node节省了16 Bytes的空间)\n6. Blackwidow在锁的实现上参照了RocksDB事务里锁的实现方法,而弃用了之前Nemo的行锁,所以在多线程对同一把锁有抢占的情况下性能会有所提升"},{"id":"Pika-Tools-Port-Bin","metadata":{"permalink":"/blog/Pika-Tools-Port-Bin","source":"@site/blog/2020-04-26-Pika-Tools-Port-Bin.md","title":"pika_port 迁移工具","description":"项目作者:","date":"2020-04-26T00:00:00.000Z","tags":[],"readingTime":2.56,"hasTruncateMarker":false,"authors":[{"name":"于雨","title":"Pika 开源社区"}],"frontMatter":{"title":"pika_port 迁移工具","slug":"Pika-Tools-Port-Bin","authors":[{"name":"于雨","title":"Pika 开源社区"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Pika Blackwidow 引擎数据存储格式","permalink":"/blog/pika-blackwidow"}},"content":"## 项目作者:\n[AlexStocks](https://github.com/alexstocks)\n\n## 适用版本:\n3.1 和 2.x\n\n## 项目地址:\n[https://github.com/ipixiu/pika-tools](https://github.com/ipixiu/pika-tools)\n\n[https://github.com/Axlgrep/pika-tools 长期维护地址需自行编译](https://github.com/Axlgrep/pika-tools)\n\n## 二进制包:\n[https://github.com/ipixiu/pika-port-bin](https://github.com/ipixiu/pika-port-bin)\n\n## 功能:\n将Pika中的数据在线迁移到Pika、Redis(支持全量、增量同步)\n\n## 开发背景:\n之前Pika项目官方提供的pika_to_redis工具仅支持离线将Pika的DB中的数据迁移到Pika、Redis, 且无法增量同步,该工具可以直接伪装为一个Pika的从库,将主库数据通过同步获取并转发给Pika、Redis,同时并支持增量同步\n\n\n## 实现:\n### trysync线程\n1. 尝试与主库建立同步关系 \n2. 如果需要全同步,则在接收到master的db之后,启动migrator和sender线程将db里面的数据发送给Pika、Redis \n3. 启动Slaveping线程定期给主库发送心跳,完成建立主从关系\n\n### binlog_receiver线程\n1. 接收主库发送过来的binlog并且将其解析成redis命令\n2. 将redis命令转发给Pika、Redis\n\n### migrator线程\n1. 扫描不同数据类型的分库\n2. 将key进行解析成响应数据Pika、redis指令\n3. 将解析好的redis指令加载到sender的发送buf中\n\n### sender线程\n1. 从发送buf中读取数据,以非阻塞方式向Pika、redis发送数据\n2. 接收Pika、redis返回的结果并解析,如果出现错误则显示错误结果\n\n## 使用帮助:\n```\nUsage: \n pika_port [-h] [-t local_ip -p local_port -i master_ip -o master_port\n -m forward_ip -n forward_port -x forward_thread_num -y forward_passwd]\n -f filenum -s offset -w password -r rsync_dump_path -l log_path\n -h -- show this help\n -t -- local host ip(OPTIONAL default: 127.0.0.1)\n -p -- local port(OPTIONAL)\n -i -- master ip(OPTIONAL default: 127.0.0.1)\n -o -- master port(REQUIRED)\n -m -- forward ip(OPTIONAL default: 127.0.0.1)\n -n -- forward port(REQUIRED)\n -x -- forward thread num(OPTIONAL default: 1)\n -y -- forward password(OPTIONAL)\n -f -- binlog filenum(OPTIONAL default: local offset)\n -s -- binlog offset(OPTIONAL default: local offset)\n -w -- password for master(OPTIONAL)\n -r -- rsync dump data path(OPTIONAL default: ./rsync_dump)\n -l -- local log path(OPTIONAL default: ./log)\n -b -- max batch number when port rsync dump data (OPTIONAL default: 512)\n -d -- daemonize(OPTIONAL)\n example: ./pika_port -t 127.0.0.1 -p 12345 -i 127.0.0.1 -o 9221 -m 127.0.0.1 -n 6379 -x 7 -f 0 -s 0 -w abc -l ./log -r ./rsync_dump -b 512 -d\n```"}],"blogListPaginated":[{"items":["PikiwiDB-Pika--4.0.0","Pika-3.5.4","Pika-3.5.3-en","Pika-3.5.3","Pika-3.5.2","Pika-3.5.1","Pika-3.5.0","pika-blackwidow","Pika-Tools-Port-Bin"],"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":9,"blogDescription":"Blog","blogTitle":"Blog"}}],"blogTags":{},"blogTagsListPath":"/blog/tags"}},"docusaurus-plugin-content-pages":{"default":[{"type":"jsx","permalink":"/","source":"@site/src/pages/index.js"}]},"docusaurus-plugin-debug":{},"docusaurus-theme-classic":{},"docusaurus-bootstrap-plugin":{},"docusaurus-mdx-fallback-plugin":{}}} \ No newline at end of file diff --git a/.docusaurus/globalData.json b/.docusaurus/globalData.json index f47193a..e3a816f 100644 --- a/.docusaurus/globalData.json +++ b/.docusaurus/globalData.json @@ -11,273 +11,273 @@ "mainDocId": "序言/index", "docs": [ { - "id": "使用与运维/index", - "path": "/docs/使用与运维/", + "id": "开发文档/编码规范/index", + "path": "/docs/开发文档/编码规范/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/page info 信息说明/index", - "path": "/docs/使用与运维/page info 信息说明/", + "id": "开发文档/coding-style/index", + "path": "/docs/开发文档/coding-style/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/Pika 最佳实践/index", - "path": "/docs/使用与运维/Pika 最佳实践/", + "id": "开发文档/index", + "path": "/docs/开发文档/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/分布式模式简单教程/index", - "path": "/docs/使用与运维/分布式模式简单教程/", + "id": "设计与实现/副本一致性/index", + "path": "/docs/设计与实现/副本一致性/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/分片教程/index", - "path": "/docs/使用与运维/分片教程/", + "id": "设计与实现/旧存储结构/index", + "path": "/docs/设计与实现/旧存储结构/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/副本一致性(使用文档)/index", - "path": "/docs/使用与运维/副本一致性(使用文档)/", + "id": "设计与实现/快照式备份/index", + "path": "/docs/设计与实现/快照式备份/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/副本一致性(设计文档)/index", - "path": "/docs/使用与运维/副本一致性(设计文档)/", + "id": "设计与实现/全同步/index", + "path": "/docs/设计与实现/全同步/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/多库版命令/index", - "path": "/docs/使用与运维/多库版命令/", + "id": "设计与实现/锁的应用/index", + "path": "/docs/设计与实现/锁的应用/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/安装使用/index", - "path": "/docs/使用与运维/安装使用/", + "id": "设计与实现/线程模型/index", + "path": "/docs/设计与实现/线程模型/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/差异化命令/index", - "path": "/docs/使用与运维/差异化命令/", + "id": "设计与实现/新存储方案:详细解析/index", + "path": "/docs/设计与实现/新存储方案:详细解析/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/数据目录/index", - "path": "/docs/使用与运维/数据目录/", + "id": "设计与实现/新存储结构/index", + "path": "/docs/设计与实现/新存储结构/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/服务器状态监控/index", - "path": "/docs/使用与运维/服务器状态监控/", + "id": "设计与实现/增量同步/index", + "path": "/docs/设计与实现/增量同步/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/管理指令/index", - "path": "/docs/使用与运维/管理指令/", + "id": "设计与实现/整体技术架构/index", + "path": "/docs/设计与实现/整体技术架构/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/自动容灾/index", - "path": "/docs/使用与运维/自动容灾/", + "id": "设计与实现/主从同步/index", + "path": "/docs/设计与实现/主从同步/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/订阅/index", - "path": "/docs/使用与运维/订阅/", + "id": "设计与实现/index", + "path": "/docs/设计与实现/", "sidebar": "tutorialSidebar" }, { - "id": "使用与运维/配置文件说明/index", - "path": "/docs/使用与运维/配置文件说明/", + "id": "设计与实现/NoSQL 原理概述/index", + "path": "/docs/设计与实现/NoSQL 原理概述/", "sidebar": "tutorialSidebar" }, { - "id": "序言/FAQ/index", - "path": "/docs/序言/FAQ/", + "id": "设计与实现/Pika 传火计划/读写流程/index", + "path": "/docs/设计与实现/Pika 传火计划/读写流程/", "sidebar": "tutorialSidebar" }, { - "id": "序言/index", - "path": "/docs/序言/", + "id": "设计与实现/Pika 传火计划/线程模型/index", + "path": "/docs/设计与实现/Pika 传火计划/线程模型/", "sidebar": "tutorialSidebar" }, { - "id": "序言/支持的 Redis 接口与兼容情况/index", - "path": "/docs/序言/支持的 Redis 接口与兼容情况/", + "id": "设计与实现/Pika 传火计划/主从同步/index", + "path": "/docs/设计与实现/Pika 传火计划/主从同步/", "sidebar": "tutorialSidebar" }, { - "id": "序言/简介/index", - "path": "/docs/序言/简介/", + "id": "设计与实现/Pika 传火计划/index", + "path": "/docs/设计与实现/Pika 传火计划/", "sidebar": "tutorialSidebar" }, { - "id": "开发文档/coding-style/index", - "path": "/docs/开发文档/coding-style/", + "id": "设计与实现/Pika 与 Codis/index", + "path": "/docs/设计与实现/Pika 与 Codis/", "sidebar": "tutorialSidebar" }, { - "id": "开发文档/index", - "path": "/docs/开发文档/", + "id": "设计与实现/Pika 源码学习笔记/通信和线程模型/index", + "path": "/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/", "sidebar": "tutorialSidebar" }, { - "id": "开发文档/编码规范/index", - "path": "/docs/开发文档/编码规范/", + "id": "设计与实现/Pika 源码学习笔记/index", + "path": "/docs/设计与实现/Pika 源码学习笔记/", "sidebar": "tutorialSidebar" }, { - "id": "性能与优化/3.2.x 性能/index", - "path": "/docs/性能与优化/3.2.x 性能/", + "id": "设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index", + "path": "/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/", "sidebar": "tutorialSidebar" }, { - "id": "性能与优化/index", - "path": "/docs/性能与优化/", + "id": "设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index", + "path": "/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/", "sidebar": "tutorialSidebar" }, { - "id": "性能与优化/Pika 3.5 参数优化手册/index", - "path": "/docs/性能与优化/Pika 3.5 参数优化手册/", + "id": "设计与实现/Pika 源码学习笔记/PubSub 机制/index", + "path": "/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/", "sidebar": "tutorialSidebar" }, { - "id": "性能与优化/Pika 优化案例/index", - "path": "/docs/性能与优化/Pika 优化案例/", + "id": "使用与运维/安装使用/index", + "path": "/docs/使用与运维/安装使用/", "sidebar": "tutorialSidebar" }, { - "id": "性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index", - "path": "/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/", + "id": "使用与运维/差异化命令/index", + "path": "/docs/使用与运维/差异化命令/", "sidebar": "tutorialSidebar" }, { - "id": "性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index", - "path": "/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/", + "id": "使用与运维/订阅/index", + "path": "/docs/使用与运维/订阅/", "sidebar": "tutorialSidebar" }, { - "id": "性能与优化/Pika 内存使用/index", - "path": "/docs/性能与优化/Pika 内存使用/", + "id": "使用与运维/多库版命令/index", + "path": "/docs/使用与运维/多库版命令/", "sidebar": "tutorialSidebar" }, { - "id": "性能与优化/Redis 与 Pika scan 性能对比/index", - "path": "/docs/性能与优化/Redis 与 Pika scan 性能对比/", + "id": "使用与运维/分布式模式简单教程/index", + "path": "/docs/使用与运维/分布式模式简单教程/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/index", - "path": "/docs/设计与实现/", + "id": "使用与运维/分片教程/index", + "path": "/docs/使用与运维/分片教程/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/NoSQL 原理概述/index", - "path": "/docs/设计与实现/NoSQL 原理概述/", + "id": "使用与运维/服务器状态监控/index", + "path": "/docs/使用与运维/服务器状态监控/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/Pika 与 Codis/index", - "path": "/docs/设计与实现/Pika 与 Codis/", + "id": "使用与运维/副本一致性(设计文档)/index", + "path": "/docs/使用与运维/副本一致性(设计文档)/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/Pika 传火计划/index", - "path": "/docs/设计与实现/Pika 传火计划/", + "id": "使用与运维/副本一致性(使用文档)/index", + "path": "/docs/使用与运维/副本一致性(使用文档)/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/Pika 传火计划/主从同步/index", - "path": "/docs/设计与实现/Pika 传火计划/主从同步/", + "id": "使用与运维/管理指令/index", + "path": "/docs/使用与运维/管理指令/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/Pika 传火计划/线程模型/index", - "path": "/docs/设计与实现/Pika 传火计划/线程模型/", + "id": "使用与运维/配置文件说明/index", + "path": "/docs/使用与运维/配置文件说明/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/Pika 传火计划/读写流程/index", - "path": "/docs/设计与实现/Pika 传火计划/读写流程/", + "id": "使用与运维/数据目录/index", + "path": "/docs/使用与运维/数据目录/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/Pika 源码学习笔记/index", - "path": "/docs/设计与实现/Pika 源码学习笔记/", + "id": "使用与运维/自动容灾/index", + "path": "/docs/使用与运维/自动容灾/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index", - "path": "/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/", + "id": "使用与运维/index", + "path": "/docs/使用与运维/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index", - "path": "/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/", + "id": "使用与运维/page info 信息说明/index", + "path": "/docs/使用与运维/page info 信息说明/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/Pika 源码学习笔记/PubSub 机制/index", - "path": "/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/", + "id": "使用与运维/Pika 最佳实践/index", + "path": "/docs/使用与运维/Pika 最佳实践/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/Pika 源码学习笔记/通信和线程模型/index", - "path": "/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/", + "id": "性能与优化/3.2.x 性能/index", + "path": "/docs/性能与优化/3.2.x 性能/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/主从同步/index", - "path": "/docs/设计与实现/主从同步/", + "id": "性能与优化/index", + "path": "/docs/性能与优化/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/全同步/index", - "path": "/docs/设计与实现/全同步/", + "id": "性能与优化/Pika 3.5 参数优化手册/index", + "path": "/docs/性能与优化/Pika 3.5 参数优化手册/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/副本一致性/index", - "path": "/docs/设计与实现/副本一致性/", + "id": "性能与优化/Pika 内存使用/index", + "path": "/docs/性能与优化/Pika 内存使用/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/增量同步/index", - "path": "/docs/设计与实现/增量同步/", + "id": "性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index", + "path": "/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/快照式备份/index", - "path": "/docs/设计与实现/快照式备份/", + "id": "性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index", + "path": "/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/整体技术架构/index", - "path": "/docs/设计与实现/整体技术架构/", + "id": "性能与优化/Pika 优化案例/index", + "path": "/docs/性能与优化/Pika 优化案例/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/新存储方案:详细解析/index", - "path": "/docs/设计与实现/新存储方案:详细解析/", + "id": "性能与优化/Redis 与 Pika scan 性能对比/index", + "path": "/docs/性能与优化/Redis 与 Pika scan 性能对比/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/新存储结构/index", - "path": "/docs/设计与实现/新存储结构/", + "id": "序言/简介/index", + "path": "/docs/序言/简介/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/旧存储结构/index", - "path": "/docs/设计与实现/旧存储结构/", + "id": "序言/支持的 Redis 接口与兼容情况/index", + "path": "/docs/序言/支持的 Redis 接口与兼容情况/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/线程模型/index", - "path": "/docs/设计与实现/线程模型/", + "id": "序言/FAQ/index", + "path": "/docs/序言/FAQ/", "sidebar": "tutorialSidebar" }, { - "id": "设计与实现/锁的应用/index", - "path": "/docs/设计与实现/锁的应用/", + "id": "序言/index", + "path": "/docs/序言/", "sidebar": "tutorialSidebar" } ], diff --git a/.docusaurus/registry.js b/.docusaurus/registry.js index 3b5233a..c3e3493 100644 --- a/.docusaurus/registry.js +++ b/.docusaurus/registry.js @@ -22,9 +22,11 @@ export default { "content---blog-257-76c": [() => import(/* webpackChunkName: "content---blog-257-76c" */ "@site/blog/2023-08-25-Pika-3.5.0.md?truncated=true"), "@site/blog/2023-08-25-Pika-3.5.0.md?truncated=true", require.resolveWeak("@site/blog/2023-08-25-Pika-3.5.0.md?truncated=true")], "content---blog-56-a-a4f": [() => import(/* webpackChunkName: "content---blog-56-a-a4f" */ "@site/blog/2024-05-16-Pika-3.5.4.md?truncated=true"), "@site/blog/2024-05-16-Pika-3.5.4.md?truncated=true", require.resolveWeak("@site/blog/2024-05-16-Pika-3.5.4.md?truncated=true")], "content---blog-584-5d9": [() => import(/* webpackChunkName: "content---blog-584-5d9" */ "@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md?truncated=true"), "@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md?truncated=true", require.resolveWeak("@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md?truncated=true")], - "content---blog-pika-3-5-0-f-78-463": [() => import(/* webpackChunkName: "content---blog-pika-3-5-0-f-78-463" */ "@site/blog/2023-12-03-Pika-3.5.2.md"), "@site/blog/2023-12-03-Pika-3.5.2.md", require.resolveWeak("@site/blog/2023-12-03-Pika-3.5.2.md")], + "content---blog-661-0dc": [() => import(/* webpackChunkName: "content---blog-661-0dc" */ "@site/blog/2024-03-27-Pika-3.5.3-en.md?truncated=true"), "@site/blog/2024-03-27-Pika-3.5.3-en.md?truncated=true", require.resolveWeak("@site/blog/2024-03-27-Pika-3.5.3-en.md?truncated=true")], "content---blog-pika-3-5-0285-851": [() => import(/* webpackChunkName: "content---blog-pika-3-5-0285-851" */ "@site/blog/2023-08-25-Pika-3.5.0.md"), "@site/blog/2023-08-25-Pika-3.5.0.md", require.resolveWeak("@site/blog/2023-08-25-Pika-3.5.0.md")], "content---blog-pika-3-5-18-cf-c57": [() => import(/* webpackChunkName: "content---blog-pika-3-5-18-cf-c57" */ "@site/blog/2023-09-28-Pika-3.5.1.md"), "@site/blog/2023-09-28-Pika-3.5.1.md", require.resolveWeak("@site/blog/2023-09-28-Pika-3.5.1.md")], + "content---blog-pika-3-5-2-f-78-053": [() => import(/* webpackChunkName: "content---blog-pika-3-5-2-f-78-053" */ "@site/blog/2023-12-03-Pika-3.5.2.md"), "@site/blog/2023-12-03-Pika-3.5.2.md", require.resolveWeak("@site/blog/2023-12-03-Pika-3.5.2.md")], + "content---blog-pika-3-5-3-enc-0-e-18b": [() => import(/* webpackChunkName: "content---blog-pika-3-5-3-enc-0-e-18b" */ "@site/blog/2024-03-27-Pika-3.5.3-en.md"), "@site/blog/2024-03-27-Pika-3.5.3-en.md", require.resolveWeak("@site/blog/2024-03-27-Pika-3.5.3-en.md")], "content---blog-pika-3-5-32-c-2-37d": [() => import(/* webpackChunkName: "content---blog-pika-3-5-32-c-2-37d" */ "@site/blog/2024-03-27-Pika-3.5.3.md"), "@site/blog/2024-03-27-Pika-3.5.3.md", require.resolveWeak("@site/blog/2024-03-27-Pika-3.5.3.md")], "content---blog-pika-3-5-46-ed-a64": [() => import(/* webpackChunkName: "content---blog-pika-3-5-46-ed-a64" */ "@site/blog/2024-05-16-Pika-3.5.4.md"), "@site/blog/2024-05-16-Pika-3.5.4.md", require.resolveWeak("@site/blog/2024-05-16-Pika-3.5.4.md")], "content---blog-pika-blackwidow-569-00a": [() => import(/* webpackChunkName: "content---blog-pika-blackwidow-569-00a" */ "@site/blog/2020-7-16-pika-blackwidow.md"), "@site/blog/2020-7-16-pika-blackwidow.md", require.resolveWeak("@site/blog/2020-7-16-pika-blackwidow.md")], @@ -34,60 +36,61 @@ export default { "content---blogc-8-b-001": [() => import(/* webpackChunkName: "content---blogc-8-b-001" */ "@site/blog/2020-7-16-pika-blackwidow.md?truncated=true"), "@site/blog/2020-7-16-pika-blackwidow.md?truncated=true", require.resolveWeak("@site/blog/2020-7-16-pika-blackwidow.md?truncated=true")], "content---blogc-82-eb2": [() => import(/* webpackChunkName: "content---blogc-82-eb2" */ "@site/blog/2020-04-26-Pika-Tools-Port-Bin.md?truncated=true"), "@site/blog/2020-04-26-Pika-Tools-Port-Bin.md?truncated=true", require.resolveWeak("@site/blog/2020-04-26-Pika-Tools-Port-Bin.md?truncated=true")], "content---blogea-5-4d3": [() => import(/* webpackChunkName: "content---blogea-5-4d3" */ "@site/blog/2023-09-28-Pika-3.5.1.md?truncated=true"), "@site/blog/2023-09-28-Pika-3.5.1.md?truncated=true", require.resolveWeak("@site/blog/2023-09-28-Pika-3.5.1.md?truncated=true")], - "content---docs-使用与运维-ffc-db3": [() => import(/* webpackChunkName: "content---docs-使用与运维-ffc-db3" */ "@site/docs/使用与运维/index.md"), "@site/docs/使用与运维/index.md", require.resolveWeak("@site/docs/使用与运维/index.md")], - "content---docs-使用与运维-page-info-信息说明-29-b-211": [() => import(/* webpackChunkName: "content---docs-使用与运维-page-info-信息说明-29-b-211" */ "@site/docs/使用与运维/page info 信息说明/index.md"), "@site/docs/使用与运维/page info 信息说明/index.md", require.resolveWeak("@site/docs/使用与运维/page info 信息说明/index.md")], - "content---docs-使用与运维-pika-最佳实践-03-a-1d2": [() => import(/* webpackChunkName: "content---docs-使用与运维-pika-最佳实践-03-a-1d2" */ "@site/docs/使用与运维/Pika 最佳实践/index.md"), "@site/docs/使用与运维/Pika 最佳实践/index.md", require.resolveWeak("@site/docs/使用与运维/Pika 最佳实践/index.md")], - "content---docs-使用与运维-分布式模式简单教程-14-c-ccb": [() => import(/* webpackChunkName: "content---docs-使用与运维-分布式模式简单教程-14-c-ccb" */ "@site/docs/使用与运维/分布式模式简单教程/index.md"), "@site/docs/使用与运维/分布式模式简单教程/index.md", require.resolveWeak("@site/docs/使用与运维/分布式模式简单教程/index.md")], - "content---docs-使用与运维-分片教程-a-77-8a8": [() => import(/* webpackChunkName: "content---docs-使用与运维-分片教程-a-77-8a8" */ "@site/docs/使用与运维/分片教程/index.md"), "@site/docs/使用与运维/分片教程/index.md", require.resolveWeak("@site/docs/使用与运维/分片教程/index.md")], - "content---docs-使用与运维-副本一致性(使用文档)-069-951": [() => import(/* webpackChunkName: "content---docs-使用与运维-副本一致性(使用文档)-069-951" */ "@site/docs/使用与运维/副本一致性(使用文档)/index.md"), "@site/docs/使用与运维/副本一致性(使用文档)/index.md", require.resolveWeak("@site/docs/使用与运维/副本一致性(使用文档)/index.md")], - "content---docs-使用与运维-副本一致性(设计文档)-777-06f": [() => import(/* webpackChunkName: "content---docs-使用与运维-副本一致性(设计文档)-777-06f" */ "@site/docs/使用与运维/副本一致性(设计文档)/index.md"), "@site/docs/使用与运维/副本一致性(设计文档)/index.md", require.resolveWeak("@site/docs/使用与运维/副本一致性(设计文档)/index.md")], - "content---docs-使用与运维-多库版命令-82-b-abe": [() => import(/* webpackChunkName: "content---docs-使用与运维-多库版命令-82-b-abe" */ "@site/docs/使用与运维/多库版命令/index.md"), "@site/docs/使用与运维/多库版命令/index.md", require.resolveWeak("@site/docs/使用与运维/多库版命令/index.md")], + "content---blogef-3-eef": [() => import(/* webpackChunkName: "content---blogef-3-eef" */ "@site/blog/2023-12-03-Pika-3.5.2.md?truncated=true"), "@site/blog/2023-12-03-Pika-3.5.2.md?truncated=true", require.resolveWeak("@site/blog/2023-12-03-Pika-3.5.2.md?truncated=true")], + "content---docs-开发文档-编码规范-e-60-647": [() => import(/* webpackChunkName: "content---docs-开发文档-编码规范-e-60-647" */ "@site/docs/开发文档/编码规范/index.md"), "@site/docs/开发文档/编码规范/index.md", require.resolveWeak("@site/docs/开发文档/编码规范/index.md")], + "content---docs-开发文档-coding-style-aff-bb3": [() => import(/* webpackChunkName: "content---docs-开发文档-coding-style-aff-bb3" */ "@site/docs/开发文档/coding-style/index.md"), "@site/docs/开发文档/coding-style/index.md", require.resolveWeak("@site/docs/开发文档/coding-style/index.md")], + "content---docs-开发文档-fac-613": [() => import(/* webpackChunkName: "content---docs-开发文档-fac-613" */ "@site/docs/开发文档/index.md"), "@site/docs/开发文档/index.md", require.resolveWeak("@site/docs/开发文档/index.md")], + "content---docs-设计与实现-999-d65": [() => import(/* webpackChunkName: "content---docs-设计与实现-999-d65" */ "@site/docs/设计与实现/index.md"), "@site/docs/设计与实现/index.md", require.resolveWeak("@site/docs/设计与实现/index.md")], + "content---docs-设计与实现-副本一致性-653-c24": [() => import(/* webpackChunkName: "content---docs-设计与实现-副本一致性-653-c24" */ "@site/docs/设计与实现/副本一致性/index.md"), "@site/docs/设计与实现/副本一致性/index.md", require.resolveWeak("@site/docs/设计与实现/副本一致性/index.md")], + "content---docs-设计与实现-旧存储结构-ab-9-b18": [() => import(/* webpackChunkName: "content---docs-设计与实现-旧存储结构-ab-9-b18" */ "@site/docs/设计与实现/旧存储结构/index.md"), "@site/docs/设计与实现/旧存储结构/index.md", require.resolveWeak("@site/docs/设计与实现/旧存储结构/index.md")], + "content---docs-设计与实现-快照式备份-937-ea0": [() => import(/* webpackChunkName: "content---docs-设计与实现-快照式备份-937-ea0" */ "@site/docs/设计与实现/快照式备份/index.md"), "@site/docs/设计与实现/快照式备份/index.md", require.resolveWeak("@site/docs/设计与实现/快照式备份/index.md")], + "content---docs-设计与实现-全同步-43-f-30a": [() => import(/* webpackChunkName: "content---docs-设计与实现-全同步-43-f-30a" */ "@site/docs/设计与实现/全同步/index.md"), "@site/docs/设计与实现/全同步/index.md", require.resolveWeak("@site/docs/设计与实现/全同步/index.md")], + "content---docs-设计与实现-锁的应用-b-50-0ea": [() => import(/* webpackChunkName: "content---docs-设计与实现-锁的应用-b-50-0ea" */ "@site/docs/设计与实现/锁的应用/index.md"), "@site/docs/设计与实现/锁的应用/index.md", require.resolveWeak("@site/docs/设计与实现/锁的应用/index.md")], + "content---docs-设计与实现-线程模型-e-85-bf0": [() => import(/* webpackChunkName: "content---docs-设计与实现-线程模型-e-85-bf0" */ "@site/docs/设计与实现/线程模型/index.md"), "@site/docs/设计与实现/线程模型/index.md", require.resolveWeak("@site/docs/设计与实现/线程模型/index.md")], + "content---docs-设计与实现-新存储方案:详细解析-d-04-e36": [() => import(/* webpackChunkName: "content---docs-设计与实现-新存储方案:详细解析-d-04-e36" */ "@site/docs/设计与实现/新存储方案:详细解析/index.md"), "@site/docs/设计与实现/新存储方案:详细解析/index.md", require.resolveWeak("@site/docs/设计与实现/新存储方案:详细解析/index.md")], + "content---docs-设计与实现-新存储结构-8-ad-f6a": [() => import(/* webpackChunkName: "content---docs-设计与实现-新存储结构-8-ad-f6a" */ "@site/docs/设计与实现/新存储结构/index.md"), "@site/docs/设计与实现/新存储结构/index.md", require.resolveWeak("@site/docs/设计与实现/新存储结构/index.md")], + "content---docs-设计与实现-增量同步-15-d-dd0": [() => import(/* webpackChunkName: "content---docs-设计与实现-增量同步-15-d-dd0" */ "@site/docs/设计与实现/增量同步/index.md"), "@site/docs/设计与实现/增量同步/index.md", require.resolveWeak("@site/docs/设计与实现/增量同步/index.md")], + "content---docs-设计与实现-整体技术架构-184-c0e": [() => import(/* webpackChunkName: "content---docs-设计与实现-整体技术架构-184-c0e" */ "@site/docs/设计与实现/整体技术架构/index.md"), "@site/docs/设计与实现/整体技术架构/index.md", require.resolveWeak("@site/docs/设计与实现/整体技术架构/index.md")], + "content---docs-设计与实现-主从同步-65-e-b7a": [() => import(/* webpackChunkName: "content---docs-设计与实现-主从同步-65-e-b7a" */ "@site/docs/设计与实现/主从同步/index.md"), "@site/docs/设计与实现/主从同步/index.md", require.resolveWeak("@site/docs/设计与实现/主从同步/index.md")], + "content---docs-设计与实现-no-sql-原理概述-c-3-d-c60": [() => import(/* webpackChunkName: "content---docs-设计与实现-no-sql-原理概述-c-3-d-c60" */ "@site/docs/设计与实现/NoSQL 原理概述/index.md"), "@site/docs/设计与实现/NoSQL 原理概述/index.md", require.resolveWeak("@site/docs/设计与实现/NoSQL 原理概述/index.md")], + "content---docs-设计与实现-pika-传火计划-9-b-4-152": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-传火计划-9-b-4-152" */ "@site/docs/设计与实现/Pika 传火计划/index.md"), "@site/docs/设计与实现/Pika 传火计划/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/index.md")], + "content---docs-设计与实现-pika-传火计划-读写流程-a-95-da7": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-传火计划-读写流程-a-95-da7" */ "@site/docs/设计与实现/Pika 传火计划/读写流程/index.md"), "@site/docs/设计与实现/Pika 传火计划/读写流程/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/读写流程/index.md")], + "content---docs-设计与实现-pika-传火计划-线程模型-a-38-416": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-传火计划-线程模型-a-38-416" */ "@site/docs/设计与实现/Pika 传火计划/线程模型/index.md"), "@site/docs/设计与实现/Pika 传火计划/线程模型/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/线程模型/index.md")], + "content---docs-设计与实现-pika-传火计划-主从同步-2-fc-1f3": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-传火计划-主从同步-2-fc-1f3" */ "@site/docs/设计与实现/Pika 传火计划/主从同步/index.md"), "@site/docs/设计与实现/Pika 传火计划/主从同步/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/主从同步/index.md")], + "content---docs-设计与实现-pika-与-codis-107-91d": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-与-codis-107-91d" */ "@site/docs/设计与实现/Pika 与 Codis/index.md"), "@site/docs/设计与实现/Pika 与 Codis/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 与 Codis/index.md")], + "content---docs-设计与实现-pika-源码学习笔记-8-d-7-499": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-8-d-7-499" */ "@site/docs/设计与实现/Pika 源码学习笔记/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/index.md")], + "content---docs-设计与实现-pika-源码学习笔记-通信和线程模型-70-e-612": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-通信和线程模型-70-e-612" */ "@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md")], + "content---docs-设计与实现-pika-源码学习笔记-pika-的命令执行框架-872-9d4": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-pika-的命令执行框架-872-9d4" */ "@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md")], + "content---docs-设计与实现-pika-源码学习笔记-pika-和-rock-sdb-的对接-406-8c8": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-pika-和-rock-sdb-的对接-406-8c8" */ "@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md")], + "content---docs-设计与实现-pika-源码学习笔记-pub-sub-机制-a-60-6d4": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-pub-sub-机制-a-60-6d4" */ "@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md")], "content---docs-使用与运维-安装使用-d-12-a8f": [() => import(/* webpackChunkName: "content---docs-使用与运维-安装使用-d-12-a8f" */ "@site/docs/使用与运维/安装使用/index.md"), "@site/docs/使用与运维/安装使用/index.md", require.resolveWeak("@site/docs/使用与运维/安装使用/index.md")], "content---docs-使用与运维-差异化命令-ae-7-c24": [() => import(/* webpackChunkName: "content---docs-使用与运维-差异化命令-ae-7-c24" */ "@site/docs/使用与运维/差异化命令/index.md"), "@site/docs/使用与运维/差异化命令/index.md", require.resolveWeak("@site/docs/使用与运维/差异化命令/index.md")], - "content---docs-使用与运维-数据目录-1-b-3-f3a": [() => import(/* webpackChunkName: "content---docs-使用与运维-数据目录-1-b-3-f3a" */ "@site/docs/使用与运维/数据目录/index.md"), "@site/docs/使用与运维/数据目录/index.md", require.resolveWeak("@site/docs/使用与运维/数据目录/index.md")], + "content---docs-使用与运维-订阅-49-f-59e": [() => import(/* webpackChunkName: "content---docs-使用与运维-订阅-49-f-59e" */ "@site/docs/使用与运维/订阅/index.md"), "@site/docs/使用与运维/订阅/index.md", require.resolveWeak("@site/docs/使用与运维/订阅/index.md")], + "content---docs-使用与运维-多库版命令-82-b-abe": [() => import(/* webpackChunkName: "content---docs-使用与运维-多库版命令-82-b-abe" */ "@site/docs/使用与运维/多库版命令/index.md"), "@site/docs/使用与运维/多库版命令/index.md", require.resolveWeak("@site/docs/使用与运维/多库版命令/index.md")], + "content---docs-使用与运维-分布式模式简单教程-14-c-ccb": [() => import(/* webpackChunkName: "content---docs-使用与运维-分布式模式简单教程-14-c-ccb" */ "@site/docs/使用与运维/分布式模式简单教程/index.md"), "@site/docs/使用与运维/分布式模式简单教程/index.md", require.resolveWeak("@site/docs/使用与运维/分布式模式简单教程/index.md")], + "content---docs-使用与运维-分片教程-a-77-8a8": [() => import(/* webpackChunkName: "content---docs-使用与运维-分片教程-a-77-8a8" */ "@site/docs/使用与运维/分片教程/index.md"), "@site/docs/使用与运维/分片教程/index.md", require.resolveWeak("@site/docs/使用与运维/分片教程/index.md")], "content---docs-使用与运维-服务器状态监控-fdc-11a": [() => import(/* webpackChunkName: "content---docs-使用与运维-服务器状态监控-fdc-11a" */ "@site/docs/使用与运维/服务器状态监控/index.md"), "@site/docs/使用与运维/服务器状态监控/index.md", require.resolveWeak("@site/docs/使用与运维/服务器状态监控/index.md")], + "content---docs-使用与运维-副本一致性(设计文档)-777-06f": [() => import(/* webpackChunkName: "content---docs-使用与运维-副本一致性(设计文档)-777-06f" */ "@site/docs/使用与运维/副本一致性(设计文档)/index.md"), "@site/docs/使用与运维/副本一致性(设计文档)/index.md", require.resolveWeak("@site/docs/使用与运维/副本一致性(设计文档)/index.md")], + "content---docs-使用与运维-副本一致性(使用文档)-069-951": [() => import(/* webpackChunkName: "content---docs-使用与运维-副本一致性(使用文档)-069-951" */ "@site/docs/使用与运维/副本一致性(使用文档)/index.md"), "@site/docs/使用与运维/副本一致性(使用文档)/index.md", require.resolveWeak("@site/docs/使用与运维/副本一致性(使用文档)/index.md")], "content---docs-使用与运维-管理指令-e-13-386": [() => import(/* webpackChunkName: "content---docs-使用与运维-管理指令-e-13-386" */ "@site/docs/使用与运维/管理指令/index.md"), "@site/docs/使用与运维/管理指令/index.md", require.resolveWeak("@site/docs/使用与运维/管理指令/index.md")], - "content---docs-使用与运维-自动容灾-063-450": [() => import(/* webpackChunkName: "content---docs-使用与运维-自动容灾-063-450" */ "@site/docs/使用与运维/自动容灾/index.md"), "@site/docs/使用与运维/自动容灾/index.md", require.resolveWeak("@site/docs/使用与运维/自动容灾/index.md")], - "content---docs-使用与运维-订阅-49-f-59e": [() => import(/* webpackChunkName: "content---docs-使用与运维-订阅-49-f-59e" */ "@site/docs/使用与运维/订阅/index.md"), "@site/docs/使用与运维/订阅/index.md", require.resolveWeak("@site/docs/使用与运维/订阅/index.md")], "content---docs-使用与运维-配置文件说明-c-6-b-bc2": [() => import(/* webpackChunkName: "content---docs-使用与运维-配置文件说明-c-6-b-bc2" */ "@site/docs/使用与运维/配置文件说明/index.md"), "@site/docs/使用与运维/配置文件说明/index.md", require.resolveWeak("@site/docs/使用与运维/配置文件说明/index.md")], - "content---docs-序言-980-c58": [() => import(/* webpackChunkName: "content---docs-序言-980-c58" */ "@site/docs/序言/index.md"), "@site/docs/序言/index.md", require.resolveWeak("@site/docs/序言/index.md")], - "content---docs-序言-faq-947-fab": [() => import(/* webpackChunkName: "content---docs-序言-faq-947-fab" */ "@site/docs/序言/FAQ/index.md"), "@site/docs/序言/FAQ/index.md", require.resolveWeak("@site/docs/序言/FAQ/index.md")], - "content---docs-序言-支持的-redis-接口与兼容情况-07-f-422": [() => import(/* webpackChunkName: "content---docs-序言-支持的-redis-接口与兼容情况-07-f-422" */ "@site/docs/序言/支持的 Redis 接口与兼容情况/index.md"), "@site/docs/序言/支持的 Redis 接口与兼容情况/index.md", require.resolveWeak("@site/docs/序言/支持的 Redis 接口与兼容情况/index.md")], - "content---docs-序言-简介-382-f9d": [() => import(/* webpackChunkName: "content---docs-序言-简介-382-f9d" */ "@site/docs/序言/简介/index.md"), "@site/docs/序言/简介/index.md", require.resolveWeak("@site/docs/序言/简介/index.md")], - "content---docs-开发文档-coding-style-aff-bb3": [() => import(/* webpackChunkName: "content---docs-开发文档-coding-style-aff-bb3" */ "@site/docs/开发文档/coding-style/index.md"), "@site/docs/开发文档/coding-style/index.md", require.resolveWeak("@site/docs/开发文档/coding-style/index.md")], - "content---docs-开发文档-fac-613": [() => import(/* webpackChunkName: "content---docs-开发文档-fac-613" */ "@site/docs/开发文档/index.md"), "@site/docs/开发文档/index.md", require.resolveWeak("@site/docs/开发文档/index.md")], - "content---docs-开发文档-编码规范-e-60-647": [() => import(/* webpackChunkName: "content---docs-开发文档-编码规范-e-60-647" */ "@site/docs/开发文档/编码规范/index.md"), "@site/docs/开发文档/编码规范/index.md", require.resolveWeak("@site/docs/开发文档/编码规范/index.md")], + "content---docs-使用与运维-数据目录-1-b-3-f3a": [() => import(/* webpackChunkName: "content---docs-使用与运维-数据目录-1-b-3-f3a" */ "@site/docs/使用与运维/数据目录/index.md"), "@site/docs/使用与运维/数据目录/index.md", require.resolveWeak("@site/docs/使用与运维/数据目录/index.md")], + "content---docs-使用与运维-自动容灾-063-450": [() => import(/* webpackChunkName: "content---docs-使用与运维-自动容灾-063-450" */ "@site/docs/使用与运维/自动容灾/index.md"), "@site/docs/使用与运维/自动容灾/index.md", require.resolveWeak("@site/docs/使用与运维/自动容灾/index.md")], + "content---docs-使用与运维-ffc-db3": [() => import(/* webpackChunkName: "content---docs-使用与运维-ffc-db3" */ "@site/docs/使用与运维/index.md"), "@site/docs/使用与运维/index.md", require.resolveWeak("@site/docs/使用与运维/index.md")], + "content---docs-使用与运维-page-info-信息说明-29-b-211": [() => import(/* webpackChunkName: "content---docs-使用与运维-page-info-信息说明-29-b-211" */ "@site/docs/使用与运维/page info 信息说明/index.md"), "@site/docs/使用与运维/page info 信息说明/index.md", require.resolveWeak("@site/docs/使用与运维/page info 信息说明/index.md")], + "content---docs-使用与运维-pika-最佳实践-03-a-1d2": [() => import(/* webpackChunkName: "content---docs-使用与运维-pika-最佳实践-03-a-1d2" */ "@site/docs/使用与运维/Pika 最佳实践/index.md"), "@site/docs/使用与运维/Pika 最佳实践/index.md", require.resolveWeak("@site/docs/使用与运维/Pika 最佳实践/index.md")], "content---docs-性能与优化-3-2-x-性能-adc-35c": [() => import(/* webpackChunkName: "content---docs-性能与优化-3-2-x-性能-adc-35c" */ "@site/docs/性能与优化/3.2.x 性能/index.md"), "@site/docs/性能与优化/3.2.x 性能/index.md", require.resolveWeak("@site/docs/性能与优化/3.2.x 性能/index.md")], "content---docs-性能与优化-a-74-686": [() => import(/* webpackChunkName: "content---docs-性能与优化-a-74-686" */ "@site/docs/性能与优化/index.md"), "@site/docs/性能与优化/index.md", require.resolveWeak("@site/docs/性能与优化/index.md")], "content---docs-性能与优化-pika-3-5-参数优化手册-30-d-264": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-3-5-参数优化手册-30-d-264" */ "@site/docs/性能与优化/Pika 3.5 参数优化手册/index.md"), "@site/docs/性能与优化/Pika 3.5 参数优化手册/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 3.5 参数优化手册/index.md")], - "content---docs-性能与优化-pika-优化案例-bb-6-de3": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-优化案例-bb-6-de3" */ "@site/docs/性能与优化/Pika 优化案例/index.md"), "@site/docs/性能与优化/Pika 优化案例/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 优化案例/index.md")], - "content---docs-性能与优化-pika-优化案例-喜马拉雅-redis-与-pika-缓存使用军规-117-154": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-优化案例-喜马拉雅-redis-与-pika-缓存使用军规-117-154" */ "@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md"), "@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md")], - "content---docs-性能与优化-pika-优化案例-调整-max-write-buffer-size-优化-pika-性能-10-倍的案例-707-20c": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-优化案例-调整-max-write-buffer-size-优化-pika-性能-10-倍的案例-707-20c" */ "@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md"), "@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md")], "content---docs-性能与优化-pika-内存使用-bbb-e56": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-内存使用-bbb-e56" */ "@site/docs/性能与优化/Pika 内存使用/index.md"), "@site/docs/性能与优化/Pika 内存使用/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 内存使用/index.md")], + "content---docs-性能与优化-pika-优化案例-调整-max-write-buffer-size-优化-pika-性能-10-倍的案例-707-20c": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-优化案例-调整-max-write-buffer-size-优化-pika-性能-10-倍的案例-707-20c" */ "@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md"), "@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md")], + "content---docs-性能与优化-pika-优化案例-喜马拉雅-redis-与-pika-缓存使用军规-117-154": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-优化案例-喜马拉雅-redis-与-pika-缓存使用军规-117-154" */ "@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md"), "@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md")], + "content---docs-性能与优化-pika-优化案例-bb-6-de3": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-优化案例-bb-6-de3" */ "@site/docs/性能与优化/Pika 优化案例/index.md"), "@site/docs/性能与优化/Pika 优化案例/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 优化案例/index.md")], "content---docs-性能与优化-redis-与-pika-scan-性能对比-eb-8-cb9": [() => import(/* webpackChunkName: "content---docs-性能与优化-redis-与-pika-scan-性能对比-eb-8-cb9" */ "@site/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md"), "@site/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md", require.resolveWeak("@site/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md")], - "content---docs-设计与实现-999-d65": [() => import(/* webpackChunkName: "content---docs-设计与实现-999-d65" */ "@site/docs/设计与实现/index.md"), "@site/docs/设计与实现/index.md", require.resolveWeak("@site/docs/设计与实现/index.md")], - "content---docs-设计与实现-no-sql-原理概述-c-3-d-c60": [() => import(/* webpackChunkName: "content---docs-设计与实现-no-sql-原理概述-c-3-d-c60" */ "@site/docs/设计与实现/NoSQL 原理概述/index.md"), "@site/docs/设计与实现/NoSQL 原理概述/index.md", require.resolveWeak("@site/docs/设计与实现/NoSQL 原理概述/index.md")], - "content---docs-设计与实现-pika-与-codis-107-91d": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-与-codis-107-91d" */ "@site/docs/设计与实现/Pika 与 Codis/index.md"), "@site/docs/设计与实现/Pika 与 Codis/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 与 Codis/index.md")], - "content---docs-设计与实现-pika-传火计划-9-b-4-152": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-传火计划-9-b-4-152" */ "@site/docs/设计与实现/Pika 传火计划/index.md"), "@site/docs/设计与实现/Pika 传火计划/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/index.md")], - "content---docs-设计与实现-pika-传火计划-主从同步-2-fc-1f3": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-传火计划-主从同步-2-fc-1f3" */ "@site/docs/设计与实现/Pika 传火计划/主从同步/index.md"), "@site/docs/设计与实现/Pika 传火计划/主从同步/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/主从同步/index.md")], - "content---docs-设计与实现-pika-传火计划-线程模型-a-38-416": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-传火计划-线程模型-a-38-416" */ "@site/docs/设计与实现/Pika 传火计划/线程模型/index.md"), "@site/docs/设计与实现/Pika 传火计划/线程模型/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/线程模型/index.md")], - "content---docs-设计与实现-pika-传火计划-读写流程-a-95-da7": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-传火计划-读写流程-a-95-da7" */ "@site/docs/设计与实现/Pika 传火计划/读写流程/index.md"), "@site/docs/设计与实现/Pika 传火计划/读写流程/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/读写流程/index.md")], - "content---docs-设计与实现-pika-源码学习笔记-8-d-7-499": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-8-d-7-499" */ "@site/docs/设计与实现/Pika 源码学习笔记/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/index.md")], - "content---docs-设计与实现-pika-源码学习笔记-pika-和-rock-sdb-的对接-406-8c8": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-pika-和-rock-sdb-的对接-406-8c8" */ "@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md")], - "content---docs-设计与实现-pika-源码学习笔记-pika-的命令执行框架-872-9d4": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-pika-的命令执行框架-872-9d4" */ "@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md")], - "content---docs-设计与实现-pika-源码学习笔记-pub-sub-机制-a-60-6d4": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-pub-sub-机制-a-60-6d4" */ "@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md")], - "content---docs-设计与实现-pika-源码学习笔记-通信和线程模型-70-e-612": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-通信和线程模型-70-e-612" */ "@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md")], - "content---docs-设计与实现-主从同步-65-e-b7a": [() => import(/* webpackChunkName: "content---docs-设计与实现-主从同步-65-e-b7a" */ "@site/docs/设计与实现/主从同步/index.md"), "@site/docs/设计与实现/主从同步/index.md", require.resolveWeak("@site/docs/设计与实现/主从同步/index.md")], - "content---docs-设计与实现-全同步-43-f-30a": [() => import(/* webpackChunkName: "content---docs-设计与实现-全同步-43-f-30a" */ "@site/docs/设计与实现/全同步/index.md"), "@site/docs/设计与实现/全同步/index.md", require.resolveWeak("@site/docs/设计与实现/全同步/index.md")], - "content---docs-设计与实现-副本一致性-653-c24": [() => import(/* webpackChunkName: "content---docs-设计与实现-副本一致性-653-c24" */ "@site/docs/设计与实现/副本一致性/index.md"), "@site/docs/设计与实现/副本一致性/index.md", require.resolveWeak("@site/docs/设计与实现/副本一致性/index.md")], - "content---docs-设计与实现-增量同步-15-d-dd0": [() => import(/* webpackChunkName: "content---docs-设计与实现-增量同步-15-d-dd0" */ "@site/docs/设计与实现/增量同步/index.md"), "@site/docs/设计与实现/增量同步/index.md", require.resolveWeak("@site/docs/设计与实现/增量同步/index.md")], - "content---docs-设计与实现-快照式备份-937-ea0": [() => import(/* webpackChunkName: "content---docs-设计与实现-快照式备份-937-ea0" */ "@site/docs/设计与实现/快照式备份/index.md"), "@site/docs/设计与实现/快照式备份/index.md", require.resolveWeak("@site/docs/设计与实现/快照式备份/index.md")], - "content---docs-设计与实现-整体技术架构-184-c0e": [() => import(/* webpackChunkName: "content---docs-设计与实现-整体技术架构-184-c0e" */ "@site/docs/设计与实现/整体技术架构/index.md"), "@site/docs/设计与实现/整体技术架构/index.md", require.resolveWeak("@site/docs/设计与实现/整体技术架构/index.md")], - "content---docs-设计与实现-新存储方案:详细解析-d-04-e36": [() => import(/* webpackChunkName: "content---docs-设计与实现-新存储方案:详细解析-d-04-e36" */ "@site/docs/设计与实现/新存储方案:详细解析/index.md"), "@site/docs/设计与实现/新存储方案:详细解析/index.md", require.resolveWeak("@site/docs/设计与实现/新存储方案:详细解析/index.md")], - "content---docs-设计与实现-新存储结构-8-ad-f6a": [() => import(/* webpackChunkName: "content---docs-设计与实现-新存储结构-8-ad-f6a" */ "@site/docs/设计与实现/新存储结构/index.md"), "@site/docs/设计与实现/新存储结构/index.md", require.resolveWeak("@site/docs/设计与实现/新存储结构/index.md")], - "content---docs-设计与实现-旧存储结构-ab-9-b18": [() => import(/* webpackChunkName: "content---docs-设计与实现-旧存储结构-ab-9-b18" */ "@site/docs/设计与实现/旧存储结构/index.md"), "@site/docs/设计与实现/旧存储结构/index.md", require.resolveWeak("@site/docs/设计与实现/旧存储结构/index.md")], - "content---docs-设计与实现-线程模型-e-85-bf0": [() => import(/* webpackChunkName: "content---docs-设计与实现-线程模型-e-85-bf0" */ "@site/docs/设计与实现/线程模型/index.md"), "@site/docs/设计与实现/线程模型/index.md", require.resolveWeak("@site/docs/设计与实现/线程模型/index.md")], - "content---docs-设计与实现-锁的应用-b-50-0ea": [() => import(/* webpackChunkName: "content---docs-设计与实现-锁的应用-b-50-0ea" */ "@site/docs/设计与实现/锁的应用/index.md"), "@site/docs/设计与实现/锁的应用/index.md", require.resolveWeak("@site/docs/设计与实现/锁的应用/index.md")], + "content---docs-序言-980-c58": [() => import(/* webpackChunkName: "content---docs-序言-980-c58" */ "@site/docs/序言/index.md"), "@site/docs/序言/index.md", require.resolveWeak("@site/docs/序言/index.md")], + "content---docs-序言-简介-382-f9d": [() => import(/* webpackChunkName: "content---docs-序言-简介-382-f9d" */ "@site/docs/序言/简介/index.md"), "@site/docs/序言/简介/index.md", require.resolveWeak("@site/docs/序言/简介/index.md")], + "content---docs-序言-支持的-redis-接口与兼容情况-07-f-422": [() => import(/* webpackChunkName: "content---docs-序言-支持的-redis-接口与兼容情况-07-f-422" */ "@site/docs/序言/支持的 Redis 接口与兼容情况/index.md"), "@site/docs/序言/支持的 Redis 接口与兼容情况/index.md", require.resolveWeak("@site/docs/序言/支持的 Redis 接口与兼容情况/index.md")], + "content---docs-序言-faq-947-fab": [() => import(/* webpackChunkName: "content---docs-序言-faq-947-fab" */ "@site/docs/序言/FAQ/index.md"), "@site/docs/序言/FAQ/index.md", require.resolveWeak("@site/docs/序言/FAQ/index.md")], "plugin---a-74-9d6": [() => import(/* webpackChunkName: "plugin---a-74-9d6" */ "@generated/docusaurus-plugin-content-pages/default/__plugin.json"), "@generated/docusaurus-plugin-content-pages/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-pages/default/__plugin.json")], "plugin---blog-369-22e": [() => import(/* webpackChunkName: "plugin---blog-369-22e" */ "@generated/docusaurus-plugin-content-blog/default/__plugin.json"), "@generated/docusaurus-plugin-content-blog/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-blog/default/__plugin.json")], "plugin---docsaba-d7c": [() => import(/* webpackChunkName: "plugin---docsaba-d7c" */ "@generated/docusaurus-plugin-content-docs/default/__plugin.json"), "@generated/docusaurus-plugin-content-docs/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/__plugin.json")], diff --git a/.docusaurus/routes.js b/.docusaurus/routes.js index abde410..6b97733 100644 --- a/.docusaurus/routes.js +++ b/.docusaurus/routes.js @@ -39,7 +39,7 @@ export default [ }, { path: '/blog', - component: ComponentCreator('/blog', 'b7e'), + component: ComponentCreator('/blog', '9a1'), exact: true }, { @@ -47,11 +47,6 @@ export default [ component: ComponentCreator('/blog/archive', '182'), exact: true }, - { - path: '/blog/Pika-3.5.0', - component: ComponentCreator('/blog/Pika-3.5.0', 'eeb'), - exact: true - }, { path: '/blog/Pika-3.5.0', component: ComponentCreator('/blog/Pika-3.5.0', '104'), @@ -62,11 +57,21 @@ export default [ component: ComponentCreator('/blog/Pika-3.5.1', '780'), exact: true }, + { + path: '/blog/Pika-3.5.2', + component: ComponentCreator('/blog/Pika-3.5.2', '853'), + exact: true + }, { path: '/blog/Pika-3.5.3', component: ComponentCreator('/blog/Pika-3.5.3', 'f4a'), exact: true }, + { + path: '/blog/Pika-3.5.3-en', + component: ComponentCreator('/blog/Pika-3.5.3-en', '510'), + exact: true + }, { path: '/blog/Pika-3.5.4', component: ComponentCreator('/blog/Pika-3.5.4', '7a0'), @@ -89,337 +94,337 @@ export default [ }, { path: '/docs', - component: ComponentCreator('/docs', 'c12'), + component: ComponentCreator('/docs', '346'), routes: [ { path: '/docs', - component: ComponentCreator('/docs', 'fcc'), + component: ComponentCreator('/docs', '560'), routes: [ { path: '/docs', - component: ComponentCreator('/docs', '6ad'), + component: ComponentCreator('/docs', '299'), routes: [ { - path: '/docs/使用与运维/', - component: ComponentCreator('/docs/使用与运维/', '5f5'), + path: '/docs/开发文档/', + component: ComponentCreator('/docs/开发文档/', '7cf'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/page info 信息说明/', - component: ComponentCreator('/docs/使用与运维/page info 信息说明/', 'eef'), + path: '/docs/开发文档/编码规范/', + component: ComponentCreator('/docs/开发文档/编码规范/', 'f7c'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/Pika 最佳实践/', - component: ComponentCreator('/docs/使用与运维/Pika 最佳实践/', '5e2'), + path: '/docs/开发文档/coding-style/', + component: ComponentCreator('/docs/开发文档/coding-style/', '329'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/分布式模式简单教程/', - component: ComponentCreator('/docs/使用与运维/分布式模式简单教程/', '3df'), + path: '/docs/设计与实现/', + component: ComponentCreator('/docs/设计与实现/', '9ca'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/分片教程/', - component: ComponentCreator('/docs/使用与运维/分片教程/', 'c6b'), + path: '/docs/设计与实现/副本一致性/', + component: ComponentCreator('/docs/设计与实现/副本一致性/', '97a'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/副本一致性(使用文档)/', - component: ComponentCreator('/docs/使用与运维/副本一致性(使用文档)/', 'e86'), + path: '/docs/设计与实现/旧存储结构/', + component: ComponentCreator('/docs/设计与实现/旧存储结构/', 'f6e'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/副本一致性(设计文档)/', - component: ComponentCreator('/docs/使用与运维/副本一致性(设计文档)/', 'b1e'), + path: '/docs/设计与实现/快照式备份/', + component: ComponentCreator('/docs/设计与实现/快照式备份/', '1e5'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/多库版命令/', - component: ComponentCreator('/docs/使用与运维/多库版命令/', '3c5'), + path: '/docs/设计与实现/全同步/', + component: ComponentCreator('/docs/设计与实现/全同步/', '248'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/安装使用/', - component: ComponentCreator('/docs/使用与运维/安装使用/', '3a0'), + path: '/docs/设计与实现/锁的应用/', + component: ComponentCreator('/docs/设计与实现/锁的应用/', '581'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/差异化命令/', - component: ComponentCreator('/docs/使用与运维/差异化命令/', 'fcf'), + path: '/docs/设计与实现/线程模型/', + component: ComponentCreator('/docs/设计与实现/线程模型/', '334'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/数据目录/', - component: ComponentCreator('/docs/使用与运维/数据目录/', 'd15'), + path: '/docs/设计与实现/新存储方案:详细解析/', + component: ComponentCreator('/docs/设计与实现/新存储方案:详细解析/', '948'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/服务器状态监控/', - component: ComponentCreator('/docs/使用与运维/服务器状态监控/', 'a79'), + path: '/docs/设计与实现/新存储结构/', + component: ComponentCreator('/docs/设计与实现/新存储结构/', '571'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/管理指令/', - component: ComponentCreator('/docs/使用与运维/管理指令/', '0bc'), + path: '/docs/设计与实现/增量同步/', + component: ComponentCreator('/docs/设计与实现/增量同步/', 'ea1'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/自动容灾/', - component: ComponentCreator('/docs/使用与运维/自动容灾/', '1d2'), + path: '/docs/设计与实现/整体技术架构/', + component: ComponentCreator('/docs/设计与实现/整体技术架构/', 'ccd'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/订阅/', - component: ComponentCreator('/docs/使用与运维/订阅/', '18e'), + path: '/docs/设计与实现/主从同步/', + component: ComponentCreator('/docs/设计与实现/主从同步/', '4d3'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/使用与运维/配置文件说明/', - component: ComponentCreator('/docs/使用与运维/配置文件说明/', '17b'), + path: '/docs/设计与实现/NoSQL 原理概述/', + component: ComponentCreator('/docs/设计与实现/NoSQL 原理概述/', '472'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/序言/', - component: ComponentCreator('/docs/序言/', 'db5'), + path: '/docs/设计与实现/Pika 传火计划/', + component: ComponentCreator('/docs/设计与实现/Pika 传火计划/', '2f6'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/序言/FAQ/', - component: ComponentCreator('/docs/序言/FAQ/', 'b59'), + path: '/docs/设计与实现/Pika 传火计划/读写流程/', + component: ComponentCreator('/docs/设计与实现/Pika 传火计划/读写流程/', '5dc'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/序言/支持的 Redis 接口与兼容情况/', - component: ComponentCreator('/docs/序言/支持的 Redis 接口与兼容情况/', '10f'), + path: '/docs/设计与实现/Pika 传火计划/线程模型/', + component: ComponentCreator('/docs/设计与实现/Pika 传火计划/线程模型/', '6ce'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/序言/简介/', - component: ComponentCreator('/docs/序言/简介/', '70a'), + path: '/docs/设计与实现/Pika 传火计划/主从同步/', + component: ComponentCreator('/docs/设计与实现/Pika 传火计划/主从同步/', '911'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/开发文档/', - component: ComponentCreator('/docs/开发文档/', '7cf'), + path: '/docs/设计与实现/Pika 与 Codis/', + component: ComponentCreator('/docs/设计与实现/Pika 与 Codis/', 'f53'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/开发文档/coding-style/', - component: ComponentCreator('/docs/开发文档/coding-style/', '329'), + path: '/docs/设计与实现/Pika 源码学习笔记/', + component: ComponentCreator('/docs/设计与实现/Pika 源码学习笔记/', '48f'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/开发文档/编码规范/', - component: ComponentCreator('/docs/开发文档/编码规范/', 'f7c'), + path: '/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/', + component: ComponentCreator('/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/', 'a01'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/性能与优化/', - component: ComponentCreator('/docs/性能与优化/', 'fd2'), + path: '/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/', + component: ComponentCreator('/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/', '26a'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/性能与优化/3.2.x 性能/', - component: ComponentCreator('/docs/性能与优化/3.2.x 性能/', 'b31'), + path: '/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/', + component: ComponentCreator('/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/', '9cf'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/性能与优化/Pika 3.5 参数优化手册/', - component: ComponentCreator('/docs/性能与优化/Pika 3.5 参数优化手册/', 'e0f'), + path: '/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/', + component: ComponentCreator('/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/', 'e15'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/性能与优化/Pika 优化案例/', - component: ComponentCreator('/docs/性能与优化/Pika 优化案例/', '088'), + path: '/docs/使用与运维/', + component: ComponentCreator('/docs/使用与运维/', '5f5'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/', - component: ComponentCreator('/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/', '51b'), + path: '/docs/使用与运维/安装使用/', + component: ComponentCreator('/docs/使用与运维/安装使用/', '3a0'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/', - component: ComponentCreator('/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/', 'd3e'), + path: '/docs/使用与运维/差异化命令/', + component: ComponentCreator('/docs/使用与运维/差异化命令/', 'fcf'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/性能与优化/Pika 内存使用/', - component: ComponentCreator('/docs/性能与优化/Pika 内存使用/', 'c7d'), + path: '/docs/使用与运维/订阅/', + component: ComponentCreator('/docs/使用与运维/订阅/', '18e'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/性能与优化/Redis 与 Pika scan 性能对比/', - component: ComponentCreator('/docs/性能与优化/Redis 与 Pika scan 性能对比/', '601'), + path: '/docs/使用与运维/多库版命令/', + component: ComponentCreator('/docs/使用与运维/多库版命令/', '3c5'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/', - component: ComponentCreator('/docs/设计与实现/', '9ca'), + path: '/docs/使用与运维/分布式模式简单教程/', + component: ComponentCreator('/docs/使用与运维/分布式模式简单教程/', '3df'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/NoSQL 原理概述/', - component: ComponentCreator('/docs/设计与实现/NoSQL 原理概述/', '472'), + path: '/docs/使用与运维/分片教程/', + component: ComponentCreator('/docs/使用与运维/分片教程/', 'c6b'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/Pika 与 Codis/', - component: ComponentCreator('/docs/设计与实现/Pika 与 Codis/', 'f53'), + path: '/docs/使用与运维/服务器状态监控/', + component: ComponentCreator('/docs/使用与运维/服务器状态监控/', 'a79'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/Pika 传火计划/', - component: ComponentCreator('/docs/设计与实现/Pika 传火计划/', '2f6'), + path: '/docs/使用与运维/副本一致性(设计文档)/', + component: ComponentCreator('/docs/使用与运维/副本一致性(设计文档)/', 'b1e'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/Pika 传火计划/主从同步/', - component: ComponentCreator('/docs/设计与实现/Pika 传火计划/主从同步/', '911'), + path: '/docs/使用与运维/副本一致性(使用文档)/', + component: ComponentCreator('/docs/使用与运维/副本一致性(使用文档)/', 'e86'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/Pika 传火计划/线程模型/', - component: ComponentCreator('/docs/设计与实现/Pika 传火计划/线程模型/', '6ce'), + path: '/docs/使用与运维/管理指令/', + component: ComponentCreator('/docs/使用与运维/管理指令/', '0bc'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/Pika 传火计划/读写流程/', - component: ComponentCreator('/docs/设计与实现/Pika 传火计划/读写流程/', '5dc'), + path: '/docs/使用与运维/配置文件说明/', + component: ComponentCreator('/docs/使用与运维/配置文件说明/', '17b'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/Pika 源码学习笔记/', - component: ComponentCreator('/docs/设计与实现/Pika 源码学习笔记/', '48f'), + path: '/docs/使用与运维/数据目录/', + component: ComponentCreator('/docs/使用与运维/数据目录/', 'd15'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/', - component: ComponentCreator('/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/', '9cf'), + path: '/docs/使用与运维/自动容灾/', + component: ComponentCreator('/docs/使用与运维/自动容灾/', '1d2'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/', - component: ComponentCreator('/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/', '26a'), + path: '/docs/使用与运维/page info 信息说明/', + component: ComponentCreator('/docs/使用与运维/page info 信息说明/', 'eef'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/', - component: ComponentCreator('/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/', 'e15'), + path: '/docs/使用与运维/Pika 最佳实践/', + component: ComponentCreator('/docs/使用与运维/Pika 最佳实践/', '5e2'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/', - component: ComponentCreator('/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/', 'a01'), + path: '/docs/性能与优化/', + component: ComponentCreator('/docs/性能与优化/', 'fd2'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/主从同步/', - component: ComponentCreator('/docs/设计与实现/主从同步/', '4d3'), + path: '/docs/性能与优化/3.2.x 性能/', + component: ComponentCreator('/docs/性能与优化/3.2.x 性能/', 'b31'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/全同步/', - component: ComponentCreator('/docs/设计与实现/全同步/', '248'), + path: '/docs/性能与优化/Pika 3.5 参数优化手册/', + component: ComponentCreator('/docs/性能与优化/Pika 3.5 参数优化手册/', 'e0f'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/副本一致性/', - component: ComponentCreator('/docs/设计与实现/副本一致性/', '97a'), + path: '/docs/性能与优化/Pika 内存使用/', + component: ComponentCreator('/docs/性能与优化/Pika 内存使用/', 'c7d'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/增量同步/', - component: ComponentCreator('/docs/设计与实现/增量同步/', 'ea1'), + path: '/docs/性能与优化/Pika 优化案例/', + component: ComponentCreator('/docs/性能与优化/Pika 优化案例/', '088'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/快照式备份/', - component: ComponentCreator('/docs/设计与实现/快照式备份/', '1e5'), + path: '/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/', + component: ComponentCreator('/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/', 'd3e'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/整体技术架构/', - component: ComponentCreator('/docs/设计与实现/整体技术架构/', 'ccd'), + path: '/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/', + component: ComponentCreator('/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/', '51b'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/新存储方案:详细解析/', - component: ComponentCreator('/docs/设计与实现/新存储方案:详细解析/', '948'), + path: '/docs/性能与优化/Redis 与 Pika scan 性能对比/', + component: ComponentCreator('/docs/性能与优化/Redis 与 Pika scan 性能对比/', '601'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/新存储结构/', - component: ComponentCreator('/docs/设计与实现/新存储结构/', '571'), + path: '/docs/序言/', + component: ComponentCreator('/docs/序言/', 'db5'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/旧存储结构/', - component: ComponentCreator('/docs/设计与实现/旧存储结构/', 'f6e'), + path: '/docs/序言/简介/', + component: ComponentCreator('/docs/序言/简介/', '70a'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/线程模型/', - component: ComponentCreator('/docs/设计与实现/线程模型/', '334'), + path: '/docs/序言/支持的 Redis 接口与兼容情况/', + component: ComponentCreator('/docs/序言/支持的 Redis 接口与兼容情况/', '10f'), exact: true, sidebar: "tutorialSidebar" }, { - path: '/docs/设计与实现/锁的应用/', - component: ComponentCreator('/docs/设计与实现/锁的应用/', '581'), + path: '/docs/序言/FAQ/', + component: ComponentCreator('/docs/序言/FAQ/', 'b59'), exact: true, sidebar: "tutorialSidebar" } diff --git a/.docusaurus/routesChunkNames.json b/.docusaurus/routesChunkNames.json index 3b03d3f..a3672bd 100644 --- a/.docusaurus/routesChunkNames.json +++ b/.docusaurus/routesChunkNames.json @@ -42,7 +42,7 @@ "plugin": "plugin---docusaurus-debugb-38-ad3" } }, - "/blog-b7e": { + "/blog-9a1": { "__comp": "__comp---theme-blog-list-pagea-6-a-7ba", "__context": { "plugin": "plugin---blog-369-22e" @@ -55,11 +55,14 @@ { "content": "content---blog-56-a-a4f" }, + { + "content": "content---blog-661-0dc" + }, { "content": "content---bloga-5-d-ef5" }, { - "content": "content---blog-257-76c" + "content": "content---blogef-3-eef" }, { "content": "content---blogea-5-4d3" @@ -83,7 +86,7 @@ }, "__props": "__props---blog-archivef-81-229" }, - "/blog/Pika-3.5.0-eeb": { + "/blog/Pika-3.5.0-104": { "__comp": "__comp---theme-blog-post-pageccc-cab", "__context": { "data": { @@ -92,9 +95,9 @@ "plugin": "plugin---blog-369-22e" }, "sidebar": "sidebar---blog-814-8ac", - "content": "content---blog-pika-3-5-0-f-78-463" + "content": "content---blog-pika-3-5-0285-851" }, - "/blog/Pika-3.5.0-104": { + "/blog/Pika-3.5.1-780": { "__comp": "__comp---theme-blog-post-pageccc-cab", "__context": { "data": { @@ -103,9 +106,9 @@ "plugin": "plugin---blog-369-22e" }, "sidebar": "sidebar---blog-814-8ac", - "content": "content---blog-pika-3-5-0285-851" + "content": "content---blog-pika-3-5-18-cf-c57" }, - "/blog/Pika-3.5.1-780": { + "/blog/Pika-3.5.2-853": { "__comp": "__comp---theme-blog-post-pageccc-cab", "__context": { "data": { @@ -114,7 +117,7 @@ "plugin": "plugin---blog-369-22e" }, "sidebar": "sidebar---blog-814-8ac", - "content": "content---blog-pika-3-5-18-cf-c57" + "content": "content---blog-pika-3-5-2-f-78-053" }, "/blog/Pika-3.5.3-f4a": { "__comp": "__comp---theme-blog-post-pageccc-cab", @@ -127,6 +130,17 @@ "sidebar": "sidebar---blog-814-8ac", "content": "content---blog-pika-3-5-32-c-2-37d" }, + "/blog/Pika-3.5.3-en-510": { + "__comp": "__comp---theme-blog-post-pageccc-cab", + "__context": { + "data": { + "blogMetadata": "blogMetadata---blog-pika-3-5-0-ace-104" + }, + "plugin": "plugin---blog-369-22e" + }, + "sidebar": "sidebar---blog-814-8ac", + "content": "content---blog-pika-3-5-3-enc-0-e-18b" + }, "/blog/Pika-3.5.4-7a0": { "__comp": "__comp---theme-blog-post-pageccc-cab", "__context": { @@ -171,234 +185,234 @@ "sidebar": "sidebar---blog-814-8ac", "content": "content---blog-pikiwi-db-pika-4-0-0878-7df" }, - "/docs-c12": { + "/docs-346": { "__comp": "__comp---theme-docs-root-5-e-9-0b6", "__context": { "plugin": "plugin---docsaba-d7c" } }, - "/docs-fcc": { + "/docs-560": { "__comp": "__comp---theme-doc-version-roota-7-b-5de", "__props": "__props---docs-005-788" }, - "/docs-6ad": { + "/docs-299": { "__comp": "__comp---theme-doc-roota-94-67a" }, - "/docs/使用与运维/-5f5": { + "/docs/开发文档/-7cf": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-ffc-db3" + "content": "content---docs-开发文档-fac-613" }, - "/docs/使用与运维/page info 信息说明/-eef": { + "/docs/开发文档/编码规范/-f7c": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-page-info-信息说明-29-b-211" + "content": "content---docs-开发文档-编码规范-e-60-647" }, - "/docs/使用与运维/Pika 最佳实践/-5e2": { + "/docs/开发文档/coding-style/-329": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-pika-最佳实践-03-a-1d2" + "content": "content---docs-开发文档-coding-style-aff-bb3" }, - "/docs/使用与运维/分布式模式简单教程/-3df": { + "/docs/设计与实现/-9ca": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-分布式模式简单教程-14-c-ccb" + "content": "content---docs-设计与实现-999-d65" }, - "/docs/使用与运维/分片教程/-c6b": { + "/docs/设计与实现/副本一致性/-97a": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-分片教程-a-77-8a8" + "content": "content---docs-设计与实现-副本一致性-653-c24" }, - "/docs/使用与运维/副本一致性(使用文档)/-e86": { + "/docs/设计与实现/旧存储结构/-f6e": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-副本一致性(使用文档)-069-951" + "content": "content---docs-设计与实现-旧存储结构-ab-9-b18" }, - "/docs/使用与运维/副本一致性(设计文档)/-b1e": { + "/docs/设计与实现/快照式备份/-1e5": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-副本一致性(设计文档)-777-06f" + "content": "content---docs-设计与实现-快照式备份-937-ea0" }, - "/docs/使用与运维/多库版命令/-3c5": { + "/docs/设计与实现/全同步/-248": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-多库版命令-82-b-abe" + "content": "content---docs-设计与实现-全同步-43-f-30a" }, - "/docs/使用与运维/安装使用/-3a0": { + "/docs/设计与实现/锁的应用/-581": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-安装使用-d-12-a8f" + "content": "content---docs-设计与实现-锁的应用-b-50-0ea" }, - "/docs/使用与运维/差异化命令/-fcf": { + "/docs/设计与实现/线程模型/-334": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-差异化命令-ae-7-c24" + "content": "content---docs-设计与实现-线程模型-e-85-bf0" }, - "/docs/使用与运维/数据目录/-d15": { + "/docs/设计与实现/新存储方案:详细解析/-948": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-数据目录-1-b-3-f3a" + "content": "content---docs-设计与实现-新存储方案:详细解析-d-04-e36" }, - "/docs/使用与运维/服务器状态监控/-a79": { + "/docs/设计与实现/新存储结构/-571": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-服务器状态监控-fdc-11a" + "content": "content---docs-设计与实现-新存储结构-8-ad-f6a" }, - "/docs/使用与运维/管理指令/-0bc": { + "/docs/设计与实现/增量同步/-ea1": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-管理指令-e-13-386" + "content": "content---docs-设计与实现-增量同步-15-d-dd0" }, - "/docs/使用与运维/自动容灾/-1d2": { + "/docs/设计与实现/整体技术架构/-ccd": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-自动容灾-063-450" + "content": "content---docs-设计与实现-整体技术架构-184-c0e" }, - "/docs/使用与运维/订阅/-18e": { + "/docs/设计与实现/主从同步/-4d3": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-订阅-49-f-59e" + "content": "content---docs-设计与实现-主从同步-65-e-b7a" }, - "/docs/使用与运维/配置文件说明/-17b": { + "/docs/设计与实现/NoSQL 原理概述/-472": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-配置文件说明-c-6-b-bc2" + "content": "content---docs-设计与实现-no-sql-原理概述-c-3-d-c60" }, - "/docs/序言/-db5": { + "/docs/设计与实现/Pika 传火计划/-2f6": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-序言-980-c58" + "content": "content---docs-设计与实现-pika-传火计划-9-b-4-152" }, - "/docs/序言/FAQ/-b59": { + "/docs/设计与实现/Pika 传火计划/读写流程/-5dc": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-序言-faq-947-fab" + "content": "content---docs-设计与实现-pika-传火计划-读写流程-a-95-da7" }, - "/docs/序言/支持的 Redis 接口与兼容情况/-10f": { + "/docs/设计与实现/Pika 传火计划/线程模型/-6ce": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-序言-支持的-redis-接口与兼容情况-07-f-422" + "content": "content---docs-设计与实现-pika-传火计划-线程模型-a-38-416" }, - "/docs/序言/简介/-70a": { + "/docs/设计与实现/Pika 传火计划/主从同步/-911": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-序言-简介-382-f9d" + "content": "content---docs-设计与实现-pika-传火计划-主从同步-2-fc-1f3" }, - "/docs/开发文档/-7cf": { + "/docs/设计与实现/Pika 与 Codis/-f53": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-开发文档-fac-613" + "content": "content---docs-设计与实现-pika-与-codis-107-91d" }, - "/docs/开发文档/coding-style/-329": { + "/docs/设计与实现/Pika 源码学习笔记/-48f": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-开发文档-coding-style-aff-bb3" + "content": "content---docs-设计与实现-pika-源码学习笔记-8-d-7-499" }, - "/docs/开发文档/编码规范/-f7c": { + "/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/-a01": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-开发文档-编码规范-e-60-647" + "content": "content---docs-设计与实现-pika-源码学习笔记-通信和线程模型-70-e-612" }, - "/docs/性能与优化/-fd2": { + "/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/-26a": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-a-74-686" + "content": "content---docs-设计与实现-pika-源码学习笔记-pika-的命令执行框架-872-9d4" }, - "/docs/性能与优化/3.2.x 性能/-b31": { + "/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/-9cf": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-3-2-x-性能-adc-35c" + "content": "content---docs-设计与实现-pika-源码学习笔记-pika-和-rock-sdb-的对接-406-8c8" }, - "/docs/性能与优化/Pika 3.5 参数优化手册/-e0f": { + "/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/-e15": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-pika-3-5-参数优化手册-30-d-264" + "content": "content---docs-设计与实现-pika-源码学习笔记-pub-sub-机制-a-60-6d4" }, - "/docs/性能与优化/Pika 优化案例/-088": { + "/docs/使用与运维/-5f5": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-pika-优化案例-bb-6-de3" + "content": "content---docs-使用与运维-ffc-db3" }, - "/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/-51b": { + "/docs/使用与运维/安装使用/-3a0": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-pika-优化案例-喜马拉雅-redis-与-pika-缓存使用军规-117-154" + "content": "content---docs-使用与运维-安装使用-d-12-a8f" }, - "/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/-d3e": { + "/docs/使用与运维/差异化命令/-fcf": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-pika-优化案例-调整-max-write-buffer-size-优化-pika-性能-10-倍的案例-707-20c" + "content": "content---docs-使用与运维-差异化命令-ae-7-c24" }, - "/docs/性能与优化/Pika 内存使用/-c7d": { + "/docs/使用与运维/订阅/-18e": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-pika-内存使用-bbb-e56" + "content": "content---docs-使用与运维-订阅-49-f-59e" }, - "/docs/性能与优化/Redis 与 Pika scan 性能对比/-601": { + "/docs/使用与运维/多库版命令/-3c5": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-redis-与-pika-scan-性能对比-eb-8-cb9" + "content": "content---docs-使用与运维-多库版命令-82-b-abe" }, - "/docs/设计与实现/-9ca": { + "/docs/使用与运维/分布式模式简单教程/-3df": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-999-d65" + "content": "content---docs-使用与运维-分布式模式简单教程-14-c-ccb" }, - "/docs/设计与实现/NoSQL 原理概述/-472": { + "/docs/使用与运维/分片教程/-c6b": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-no-sql-原理概述-c-3-d-c60" + "content": "content---docs-使用与运维-分片教程-a-77-8a8" }, - "/docs/设计与实现/Pika 与 Codis/-f53": { + "/docs/使用与运维/服务器状态监控/-a79": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-与-codis-107-91d" + "content": "content---docs-使用与运维-服务器状态监控-fdc-11a" }, - "/docs/设计与实现/Pika 传火计划/-2f6": { + "/docs/使用与运维/副本一致性(设计文档)/-b1e": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-传火计划-9-b-4-152" + "content": "content---docs-使用与运维-副本一致性(设计文档)-777-06f" }, - "/docs/设计与实现/Pika 传火计划/主从同步/-911": { + "/docs/使用与运维/副本一致性(使用文档)/-e86": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-传火计划-主从同步-2-fc-1f3" + "content": "content---docs-使用与运维-副本一致性(使用文档)-069-951" }, - "/docs/设计与实现/Pika 传火计划/线程模型/-6ce": { + "/docs/使用与运维/管理指令/-0bc": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-传火计划-线程模型-a-38-416" + "content": "content---docs-使用与运维-管理指令-e-13-386" }, - "/docs/设计与实现/Pika 传火计划/读写流程/-5dc": { + "/docs/使用与运维/配置文件说明/-17b": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-传火计划-读写流程-a-95-da7" + "content": "content---docs-使用与运维-配置文件说明-c-6-b-bc2" }, - "/docs/设计与实现/Pika 源码学习笔记/-48f": { + "/docs/使用与运维/数据目录/-d15": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-源码学习笔记-8-d-7-499" + "content": "content---docs-使用与运维-数据目录-1-b-3-f3a" }, - "/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/-9cf": { + "/docs/使用与运维/自动容灾/-1d2": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-源码学习笔记-pika-和-rock-sdb-的对接-406-8c8" + "content": "content---docs-使用与运维-自动容灾-063-450" }, - "/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/-26a": { + "/docs/使用与运维/page info 信息说明/-eef": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-源码学习笔记-pika-的命令执行框架-872-9d4" + "content": "content---docs-使用与运维-page-info-信息说明-29-b-211" }, - "/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/-e15": { + "/docs/使用与运维/Pika 最佳实践/-5e2": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-源码学习笔记-pub-sub-机制-a-60-6d4" + "content": "content---docs-使用与运维-pika-最佳实践-03-a-1d2" }, - "/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/-a01": { + "/docs/性能与优化/-fd2": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-源码学习笔记-通信和线程模型-70-e-612" + "content": "content---docs-性能与优化-a-74-686" }, - "/docs/设计与实现/主从同步/-4d3": { + "/docs/性能与优化/3.2.x 性能/-b31": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-主从同步-65-e-b7a" + "content": "content---docs-性能与优化-3-2-x-性能-adc-35c" }, - "/docs/设计与实现/全同步/-248": { + "/docs/性能与优化/Pika 3.5 参数优化手册/-e0f": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-全同步-43-f-30a" + "content": "content---docs-性能与优化-pika-3-5-参数优化手册-30-d-264" }, - "/docs/设计与实现/副本一致性/-97a": { + "/docs/性能与优化/Pika 内存使用/-c7d": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-副本一致性-653-c24" + "content": "content---docs-性能与优化-pika-内存使用-bbb-e56" }, - "/docs/设计与实现/增量同步/-ea1": { + "/docs/性能与优化/Pika 优化案例/-088": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-增量同步-15-d-dd0" + "content": "content---docs-性能与优化-pika-优化案例-bb-6-de3" }, - "/docs/设计与实现/快照式备份/-1e5": { + "/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/-d3e": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-快照式备份-937-ea0" + "content": "content---docs-性能与优化-pika-优化案例-调整-max-write-buffer-size-优化-pika-性能-10-倍的案例-707-20c" }, - "/docs/设计与实现/整体技术架构/-ccd": { + "/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/-51b": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-整体技术架构-184-c0e" + "content": "content---docs-性能与优化-pika-优化案例-喜马拉雅-redis-与-pika-缓存使用军规-117-154" }, - "/docs/设计与实现/新存储方案:详细解析/-948": { + "/docs/性能与优化/Redis 与 Pika scan 性能对比/-601": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-新存储方案:详细解析-d-04-e36" + "content": "content---docs-性能与优化-redis-与-pika-scan-性能对比-eb-8-cb9" }, - "/docs/设计与实现/新存储结构/-571": { + "/docs/序言/-db5": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-新存储结构-8-ad-f6a" + "content": "content---docs-序言-980-c58" }, - "/docs/设计与实现/旧存储结构/-f6e": { + "/docs/序言/简介/-70a": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-旧存储结构-ab-9-b18" + "content": "content---docs-序言-简介-382-f9d" }, - "/docs/设计与实现/线程模型/-334": { + "/docs/序言/支持的 Redis 接口与兼容情况/-10f": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-线程模型-e-85-bf0" + "content": "content---docs-序言-支持的-redis-接口与兼容情况-07-f-422" }, - "/docs/设计与实现/锁的应用/-581": { + "/docs/序言/FAQ/-b59": { "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-锁的应用-b-50-0ea" + "content": "content---docs-序言-faq-947-fab" }, "/-2e1": { "__comp": "__comp---site-src-pages-index-jsc-4-f-f99", diff --git a/README.md b/README.md index 9d5f5b7..2fcfd72 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ## 文档的主要内容与参与贡献的方式 -PikiwiDB(Pika) 的文档网站同 [PikiwiDB(Pika) Wiki](https://github.com/OpenAtomFoundation/Pika/wiki) 的内容保持一致,因此希望参与到 PikiwiDB 文档维护工作的话,欢迎在 Wiki 或者这里提交你的反馈意见。 +PikiwiDB(Pika) 的文档网站同 [PikiwiDB(Pika) Wiki](https:/w/github.com/OpenAtomFoundation/Pika/wiki) 的内容保持一致,因此希望参与到 PikiwiDB 文档维护工作的话,欢迎在 Wiki 或者这里提交你的反馈意见。 ## 如何构建文档网站? diff --git a/blog/2020-7-16-pika-blackwidow.md b/blog/2020-7-16-pika-blackwidow.md index 1625e54..5e62ac9 100644 --- a/blog/2020-7-16-pika-blackwidow.md +++ b/blog/2020-7-16-pika-blackwidow.md @@ -8,7 +8,7 @@ authors: hide_table_of_contents: false --- -Blackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。 +Blackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。 ![pika-blackwidow-1](pika-blackwidow-1.png) diff --git a/blog/2024-03-27-Pika-3.5.3-en.md b/blog/2024-03-27-Pika-3.5.3-en.md new file mode 100644 index 0000000..0e9bd2b --- /dev/null +++ b/blog/2024-03-27-Pika-3.5.3-en.md @@ -0,0 +1,212 @@ +--- +title: "What's new in Pika v3.5.3 (英文版本)" +slug: Pika-3.5.3-en + +authors: + - name: 360 中间件团队 + title: Pika 开源社区 +hide_table_of_contents: false +--- + +# What's New in PikiwiDB (Pika) v3.5.3 (Stable Release) + +As Redis announces the adoption of dual protocols to maintain its commercial interests, the PikiwiDB (Pika) community is pleased to announce the release of the v3.5.3 stable version for production use today. + +The v3.5.3 version addresses historical bugs and introduces a multitude of new features. These features primarily include Pika's support for ACL, the removal of residual Slot code from the Sharing mode, separation of fast and slow commands, Redis Stream support, large key analysis tools, and Pika's distributed cluster support for fully automated failover, among others. Additionally, we have enriched the automation test cases in version 3.5.3 to enhance the stability and robustness of the Pika service, providing users with a more efficient and stable experience. This article will mainly elaborate on the significant features, bug fixes, and performance improvements in this update. + +Before diving into the main release content of version 3.5.3, please note the following statements: + +1. Due to trademark issues, the Pika project has been renamed to PikiwiDB. In this article, we will use PikiwiDB (Pika) to refer to the project at https://github.com/OpenAtomFoundation/pika. +2. We have created a new project https://github.com/OpenAtomFoundation/pikiwidb, which is a large-capacity KV database compatible with the Redis protocol and based on the Raft protocol. It is mainly designed for scenarios requiring strong consistency, such as storing metadata at a scale of about 10TiB. PikiwiDB will be used to refer to this project specifically. + +## 1 Major Improvements + +### 1.1 PikiwiDB (Pika) Supports ACL + +PikiwiDB (Pika) 3.5.3 now fully supports Redis ACL, laying a solid foundation for future multi-tenant support in cloud-native Pika clusters. Before 3.5.3, Pika already supported Redis user authentication methods such as auth/userpass/requirepass, as well as its own command blacklist mode configured through userblacklist in pika.conf. This update maintains backward compatibility and supports these existing methods. + +Moreover, we have integrated all Redis ACL TCL test suites into PikiwiDB (Pika)'s test suite to ensure that PikiwiDB (Pika)'s ACL implementation is fully compatible with Redis ACL. + +Key PRs: + +- [PikiwiDB (Pika) Supports ACL](https://github.com/OpenAtomFoundation/pika/pull/2013) +- [Fixes ACL User Authentication Issues](https://github.com/OpenAtomFoundation/pika/pull/2449) +- [ACL Backward Compatibility with Userblacklist](https://github.com/OpenAtomFoundation/pika/pull/2459) +- [Adds Redis ACL Test Suites](https://github.com/OpenAtomFoundation/pika/pull/2495) + +### 1.2 Hybrid Storage Model Supports Bitmap + +In a single-node environment, it is impossible to simultaneously optimize PikiwiDB (Pika)'s read/write/compaction, which is known as the "impossible triangle." In version v3.5.2, we supported hybrid storage consisting of cached Redis and RocksDB, which supported five data structures: string/list/set/zset/hashtable. In this release, we have added support for bitmap: https://github.com/OpenAtomFoundation/pika/pull/2253 + +Additionally, we now support dynamic tuning of Redis cache parameters in version 3.5.3: https://github.com/OpenAtomFoundation/pika/pull/2197 + +### 1.3 Separation of Fast and Slow Commands + +To prevent slow commands from blocking the execution of fast commands, we have implemented the separation of fast and slow commands at both the Codis-Proxy and PikiwiDB (Pika) levels. + +https://github.com/OpenAtomFoundation/pika/pull/2162 + +### 1.4 Redis Stream + +While PikiwiDB (Pika) previously supported Redis pubsub, which only allowed for online message passing, in version 3.5.3, we have added limited support for Redis Stream, similar to a message queue (MQ), to facilitate safer message transmission. To ensure data safety, we have specifically added support for the Stream data type in our underlying engine, BlackWidow. + +Key PR: + +- [Pika Supports Redis Stream](https://github.com/OpenAtomFoundation/pika/pull/1955) + +Please note that Pika Stream currently does not support consumer group consumption and will be available in future updates. + +### 1.5 Cloud-Native Cluster + +In PikiwiDB (Pika) 3.5.0, we open-sourced a Pika-Operator that supports deploying a pair of Pika master and slave on K8s. In version 3.5.2, based on Kubeblocks, our Pika-Operator supported deploying a Pika Cluster in the form of Codis on K8s, but it did not support dynamic scaling at the time. + +In version 3.5.3, the latest Pika-Operator now supports node scaling at the Codis Group level and data rebalance. + +Key PRs: + +- [PikiwiDB (Pika) Operator Supports Pika Cluster Auto-Scaling](https://github.com/OpenAtomFoundation/pika/pull/2121) +- [Optimizes Codis Slot Migration Speed, Supports Dynamic Adjustment of Migration Threads and Speed](https://github.com/OpenAtomFoundation/pika/pull/2486) +- [Pika-Operator Supports Namespaces, Allows Deploying Different Clusters in Different Namespaces](https://github.com/OpenAtomFoundation/pika/pull/2480) +- [Pika-Operator Supports Monitoring Metric Collection, Automatically Launches Pika-Exporter](https://github.com/OpenAtomFoundation/pika/pull/2451) + +### 1.6 Compaction Improvements + +PikiwiDB (Pika)'s underlying disk storage engine, RocksDB, significantly impacts PikiwiDB (Pika)'s read and write performance during compaction, which appears as "spikes" in monitoring systems. Controlling compaction is key to optimizing Pika's read and write performance. + +Key PRs for compaction improvements: + +- [Adds CompactRange Command to Support Compaction of a Specific Range of Keys](https://github.com/OpenAtomFoundation/pika/pull/2163) +- [Improves Compaction Speed and Reduces Compaction Time](https://github.com/OpenAtomFoundation/pika/pull/2172) +- [Invokes Disable Compaction When Executing Shutdown Command, Enhances Exit Speed](https://github.com/OpenAtomFoundation/pika/pull/2345) + +### 1.7 Automatic Failover + +PikiwiDB (Pika) clusters are currently based on Codis. To enhance the usability of PikiwiDB (Pika) Clusters based on Codis, we have made many extensions to Codis. + +The original Codis did not support failover within Groups, requiring the use of Redis Sentinel, which increases operational costs. We have implemented auto failover for Groups within Codis Dashboard by drawing on the functionality of sentinel. + +Key PR: + +- [PikiwiDB (Pika) Distributed Cluster Supports Automatic Failover](https://github.com/OpenAtomFoundation/pika/pull/2386) + +### 1.8 Observability Enhancements + +The key component for PikiwiDB (Pika) observability is Pika-Exporter. Although Redis Cache was added to the 3.5.2 version, it lacked monitoring metrics. In version 3.5.3, we have added metrics such as hit rate, hits per second, Redis Cache memory usage, number of Redis Caches, and number of Redis Cache DBs. + +Key PRs: + +- [Pika Exporter Exposes Cache-Related Data Collection Metrics](https://github.com/OpenAtomFoundation/pika/pull/2318) +- [PikiwiDB (Pika) Distributed Cluster Codis Proxy Adds Observable Metrics](https://github.com/OpenAtomFoundation/pika/pull/2199) +- [Fixes dbsize Calculation Error](https://github.com/OpenAtomFoundation/pika/pull/2494) +- [Fixes Inaccurate Network Monitoring Metric Statistics](https://github.com/OpenAtomFoundation/pika/pull/2234) + +### 1.9 Data Consistency + +Version 3.5.3 fixes numerous PikiwiDB (Pika) master-slave synchronization issues, ensuring data consistency. + +Key PRs: + +- [Fixes the Logic for Slave Nodes Receiving Exceptional Reply Packets from Masters During Full-Quantity Replication](https://github.com/OpenAtomFoundation/pika/pull/2319) +- [Fixes Inconsistency Issues Between Cache and DB Data in Certain Scenarios](https://github.com/OpenAtomFoundation/pika/pull/2225) +- [Fixes Data Loss Issues After Full-Quantity Replication Failure](https://github.com/OpenAtomFoundation/pika/pull/2439) +- [Adds Data Synchronization Status During Full-Quantity Replication, Clarifying Data Synchronization Progress](https://github.com/OpenAtomFoundation/pika/pull/2430) +- [Fixes the Issue of No Proper Response to Slave Synchronization Requests During Master Instance bgsave Execution](https://github.com/OpenAtomFoundation/pika/pull/2437) +- [Fixes Data Inconsistency Issues When Applying Binlog on Slave Instances Without Locking the Operated Key](https://github.com/OpenAtomFoundation/pika/pull/2409) +- [Fixes Data Inconsistency Issues After Data Migration](https://github.com/OpenAtomFoundation/pika/pull/2485) + +### 1.10 Test Suite Additions + +The PikiwiDB (Pika) test suite consists of gtest unit tests, Redis TCL test suites, and Go test suites. In 3.5.3, we have added Codis cluster e2e tests. + +Key PRs: + +- [Pika TCL Test Suite](https://github.com/OpenAtomFoundation/pika/pull/2497) +- [Pika Gotest Test Suite](https://github.com/OpenAtomFoundation/pika/pull/2502) + +### 1.11 Toolkit Additions + +PikiwiDB (Pika) has always valued the construction of toolkits, and all related tools can be found at https://github.com/OpenAtomFoundation/pika/tree/unstable/tools. In 3.5.3, we have added a new tool: + +- [PikiwiDB (Pika) Supports Large Key Analysis Tools](https://github.com/OpenAtomFoundation/pika/pull/2195) + +### 1.12 Documentation Updates + +The PikiwiDB (Pika) documentation mainly consists of wiki documentation. In 3.5.3, we have updated the documentation for the Redis commands supported by Pika. + +Documentation link: https://github.com/OpenAtomFoundation/pika/wiki/Pika-Supports-Redis-Interface-and-Content-Situation + +## 2 Release Improvements + +In the first chapter, we described the main feature upgrades and improvements of version 3.5.3. Below is a detailed list of the relevant PRs for this release. + +### 2.1 New Features + +- [Pika Supports ACL](https://github.com/OpenAtomFoundation/pika/pull/2013) +- [During Full-Quantity Replication, Pika Slave Nodes Do Not Accept Read Requests](https://github.com/OpenAtomFoundation/pika/pull/2197) +- [Removes Residual Slot Code from Sharing Mode, Returns to v3.0, Where One Pika Instance Has Multiple DBs, Each with Only One Blackwidow](https://github.com/OpenAtomFoundation/pika/pull/2251) +- [Automatically Recovers Service When Codis Dashboard Coroutine Panics](https://github.com/OpenAtomFoundation/pika/pull/2349) +- [Pika Cache Adds New Bitmap Data Type](https://github.com/OpenAtomFoundation/pika/pull/2253) +- [Pika Supports Separation of Fast and Slow Commands](https://github.com/OpenAtomFoundation/pika/pull/2162) +- [Pika Exporter Exposes Cache-Related Data Collection Metrics](https://github.com/OpenAtomFoundation/pika/pull/2318) +- [Pika Keeps Unix Timepoint After Completing Bgsave](https://github.com/OpenAtomFoundation/pika/pull/2167) +- [Pika Supports Dynamic Configuration of disable_auto_compations Parameter](https://github.com/OpenAtomFoundation/pika/pull/2257) +- [Pika Supports Redis Stream](https://github.com/OpenAtomFoundation/pika/pull/1955) +- [Pika Supports Large Key Analysis Tools](https://github.com/OpenAtomFoundation/pika/pull/2195) +- [Pika Supports Dynamic Adjustment of Pika Cache Parameters](https://github.com/OpenAtomFoundation/pika/pull/2197) +- [Updates Pika Benchmark Tool to Support More Interface Pressure Tests](https://github.com/OpenAtomFoundation/pika/pull/2222) +- [Pika Operator Supports Pika Cluster Auto-Scaling](https://github.com/OpenAtomFoundation/pika/pull/2121) +- [Adds CompactRange Command to Support Compaction of a Specific Range of Keys](https://github.com/OpenAtomFoundation/pika/pull/2163) +- [Improves Compaction Speed and Reduces Compaction Time](https://github.com/OpenAtomFoundation/pika/pull/2172) +- [Upgrades RocksDB Version to v8.7.3](https://github.com/OpenAtomFoundation/pika/pull/2157) +- [PikiwiDB (Pika) Distributed Cluster Codis Proxy Adds Observable Metrics](https://github.com/OpenAtomFoundation/pika/pull/2199) +- [PikiwiDB (Pika) Distributed Cluster Supports Automatic Failover](https://github.com/OpenAtomFoundation/pika/pull/2386) +- [Pika Supports Redis rename-command Feature](https://github.com/OpenAtomFoundation/pika/pull/2455) +- [Optimizes Codis Slot Migration Speed, Supports Dynamic Adjustment of Migration Threads and Speed](https://github.com/OpenAtomFoundation/pika/pull/2486) +- [PikiwiDB (Pika) Supports Dynamic Adjustment of max-conn-rbuf-size Parameter](https://github.com/OpenAtomFoundation/pika/pull/2434) +- [Pika-Operator Supports Namespaces, Allows Deploying Different Clusters in Different Namespaces](https://github.com/OpenAtomFoundation/pika/pull/2480) +- [Pika-Operator Supports Monitoring Metric Collection, Automatically Launches Pika-Exporter](https://github.com/OpenAtomFoundation/pika/pull/2451) +- [ACL Backward Compatibility with Userblacklist](https://github.com/OpenAtomFoundation/pika/pull/2459) +- [Enriches Pika TCL Test Suite](https://github.com/OpenAtomFoundation/pika/pull/2497) +- [Enriches Pika Gotest Test Suite](https://github.com/OpenAtomFoundation/pika/pull/2502) + +### 2.2 Bug Fixes + +- [Fixes Issue of Incorrect Deletion of Dump Files During Full-Quantity Replication by Pika Slave Nodes](https://github.com/OpenAtomFoundation/pika/pull/2377) +- [Fixes the Logic for Slave Nodes Receiving Exceptional Reply Packets from Masters During Full-Quantity Replication](https://github.com/OpenAtomFoundation/pika/pull/2319) +- [Invokes Disable Compaction When Executing Shutdown Command, Enhances Exit Speed](https://github.com/OpenAtomFoundation/pika/pull/2345) +- [Fixes Inaccurate Redis Memory Values in Codis-Dashboard](https://github.com/OpenAtomFoundation/pika/pull/2337) +- [Optimizes INFO Command Latency, Reduces Frequency of Checking Disk Usage](https://github.com/OpenAtomFoundation/pika/pull/2197) +- [Fixes Issue of Rsync Deleting Temporary Files with Incorrect Path, Leading to Failure in Opening RocksDB](https://github.com/OpenAtomFoundation/pika/pull/2186) +- [Fixes Issue of Commands Not Specifying DB Name, Leading to Coredump of Some Commands](https://github.com/OpenAtomFoundation/pika/pull/2194) +- [Uses info replication Command in Codis Dashboard Instead of info Command to Query Master IP, Reducing Performance Impact on Pika](https://github.com/OpenAtomFoundation/pika/pull/2198) +- [Fixes Inconsistency Issues Between Cache and DB Data in Certain Scenarios](https://github.com/OpenAtomFoundation/pika/pull/2225) +- [Fixes Issue of Segmentation Fault When Dump Directory is Empty](https://github.com/OpenAtomFoundation/pika/pull/2265) +- [Fixes Issue of Certain Commands' Cache Not Taking Effect Due to Incorrect Flag Calculation](https://github.com/OpenAtomFoundation/pika/pull/2217) +- [Fixes Issue of Slave Instances Being Inaccessible Due to Deadlock After Master Instance flushdb in Master-Slave Replication Mode](https://github.com/OpenAtomFoundation/pika/pull/2249) +- [Fixes Issue of Commands Not Judging the Return Value of RocksDB](https://github.com/OpenAtomFoundation/pika/pull/2187) +- [Standardizes Function Return Values and Initial Values](https://github.com/OpenAtomFoundation/pika/pull/2176) +- [Fixes Inaccurate Network Monitoring Metric Statistics](https://github.com/OpenAtomFoundation/pika/pull/2234) +- [Fixes Issue of Abnormal Parameters When Loading Configuration File](https://github.com/OpenAtomFoundation/pika/pull/2218) +- [Fixes 100% CPU Usage Issue in Codis Dashboard](https://github.com/OpenAtomFoundation/pika/pull/2393) +- [Fixes Issue of Abnormal Display of Pika Master-Slave Roles in Codis Front End](https://github.com/OpenAtomFoundation/pika/pull/2387) +- [Fixes Data Inconsistency Issues After Data Migration](https://github.com/OpenAtomFoundation/pika/pull/2485) +- [Fixes Issue of Inaccurate Display in Codis-dashboard After Scaling or Pod Start/Stop](https://github.com/OpenAtomFoundation/pika/pull/2475) +- [Fixes Issue of Repeated Locking at the DB Level](https://github.com/OpenAtomFoundation/pika/pull/2372) +- [Fixes Issue of Data Loss After Full-Quantity Replication Failure](https://github.com/OpenAtomFoundation/pika/pull/2439) +- [Fixes Issue of No Proper Response to Slave Synchronization Requests During Master Instance bgsave Execution](https://github.com/OpenAtomFoundation/pika/pull/2437) +- [Adds Data Synchronization Status During Full-Quantity Replication, Clarifying Data Synchronization Progress](https://github.com/OpenAtomFoundation/pika/pull/2430) +- [Fixes Issue of No Locking of Operated Key When Applying Binlog on Slave Instances, Leading to Data Inconsistency](https://github.com/OpenAtomFoundation/pika/pull/2409) +- [Fixes Issue of Master Instance Coredump During Codis Slot Migration](https://github.com/OpenAtomFoundation/pika/pull/2415) +- [Fixes Issue of Deleting Dump Files in Use During Master-Slave Replication](https://github.com/OpenAtomFoundation/pika/pull/2377) +- [Fixes Issue of Rsync Response Errors from Slave Instances During Master-Slave Replication](https://github.com/OpenAtomFoundation/pika/pull/2319) + +### 2.3 Release Tag + +[PikiwiDB (Pika) v3.5.3 Release Tag](https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3) + +## 3 Community + +If you have any questions, feel free to join our community discussion group. The PikiwiDB (Pika) open-source community appreciates your support and help. + +* telegram https://t.me/+gMlTzNacOF1iMTM1 +* WeChat Assistant "PikiwiDB" diff --git a/blog/2024-03-27-Pika-3.5.3.md b/blog/2024-03-27-Pika-3.5.3.md index 6b41361..f7ad3f5 100644 --- a/blog/2024-03-27-Pika-3.5.3.md +++ b/blog/2024-03-27-Pika-3.5.3.md @@ -8,40 +8,34 @@ authors: hide_table_of_contents: false --- -随着 Redis 宣布采用双协议以维护其商业利益之际,PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.3 正式生产可用版本现已发布。 +随着 Redis 宣布采用双协议以维护其商业利益,PikiwiDB(Pika) 社区非常荣幸地宣布之际,我们的最新 v3.5.3 正式生产可用版本现已发布。 -v3.5.3 解决了历史遗留的 Bug,引入了多项新特性。这些特性主要包括 Pika 支持 ACL、删除 Sharing 模式残留的 Slot 代码、快慢命令分离、 Redis Stream、大 key 分析工具、Pika 分布式集群支持全自动化 failover 等功能,同时,我们在 3.5.3 版本丰富了更多的自动化测试 case,提升 Pika 服务的稳定性和健壮性,会让用户感受到更为高效和稳定的使用体验,本文主要阐述本次改动的相关重大 feature、bugfix 性能提升项。 +v3.5.3 版本不仅修复了长期存在的 Bug,还引入了一系列新特性。这些新特性包括 Pika 对 ACL 的支持、移除了 Sharing 模式的残留 Slot 代码、命令执行的快慢分离、Redis Stream 支持、大 key 分析工具、以及 Pika 分布式集群的全自动化 failover 等。此外,我们在 3.5.3 版本中增加了更多的自动化测试用例,以提高 Pika 服务的稳定性和健壮性,确保用户能够享受到更高效、更稳定的使用体验。本文将详细介绍本次更新的主要功能、Bug 修复和性能提升。 在深入探讨 3.5.3 版本的更新内容之前,请注意以下几点声明: -1. 由于商标问题,Pika 项目已更名为 PikiwiDB。文中以 PikiwiDB(Pika) 指代项目 - https://github.com/OpenAtomFoundation/pika -2. 我们新创建了一个项目 - https://github.com/OpenAtomFoundation/pikiwidb - 这是一个基于 Raft 协议实现的兼容 Redis 协议的大容量 KV 数据库,主要面向强一致性数据场景,例如存储约 10TiB 规模的元数据。PikiwiDB 将专门用于指代此项目。 +1. 由于商标问题,Pika 项目已更名为 PikiwiDB。在本文中,我们将使用 PikiwiDB(Pika) 来指代项目,项目地址为:https://github.com/OpenAtomFoundation/pika +2. 我们创建了一个新项目 https://github.com/OpenAtomFoundation/pikiwidb,这是一个基于 Raft 协议实现的兼容 Redis 协议的大容量 KV 数据库,主要面向强一致性数据场景,例如存储约 10TiB 规模的元数据。PikiwiDB 将专门用于指代此项目。 3. 我们为 PikiwiDB 设计了一个新的 logo,作为其商标,并已在相关政府机构注册。 -![2024-03-27-Pika-3.5.3-logo](2024-03-27-Pika-3.5.3-logo.png) +![](https://github.com/OpenAtomFoundation/pikiwidb/blob/unstable/docs/images/pikiwidb-logo.png) -1 重大改进 +## 1 主要更新 -1.1 PikiwiDB(Pika) 支持 ACL +### 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: -+ PikiwiDB(Pika) 支持 ACL - https://github.com/OpenAtomFoundation/pika/pull/2013 -+ 修正 ACL 用户认证错误问题 - https://github.com/OpenAtomFoundation/pika/pull/2449 -+ ACL 向前兼容 userblacklist - https://github.com/OpenAtomFoundation/pika/pull/2459 -+ 添加 Redis ACL 测试集 - https://github.com/OpenAtomFoundation/pika/pull/2495 +关键 PR 链接: + +- [PikiwiDB(Pika) 支持 ACL](https://github.com/OpenAtomFoundation/pika/pull/2013) +- [修正 ACL 用户认证错误问题](https://github.com/OpenAtomFoundation/pika/pull/2449) +- [ACL 向前兼容 userblacklist](https://github.com/OpenAtomFoundation/pika/pull/2459) +- [添加 Redis ACL 测试集](https://github.com/OpenAtomFoundation/pika/pull/2495) -1.2 混合存储模型支持 bitmap +### 1.2 混合存储模型支持 bitmap 在单体环境下,同时优化 PikiwiDB(Pika) 的读/写/compaction 是一项挑战。在 v3.5.2 版本中,我们引入了由缓存 Redis 和 RocksDB 构成的混合存储模型,并支持了 string/list/set/zset/hashtable 五种数据结构。在 3.5.3 版本中,我们增加了对 bitmap 的支持。 @@ -49,259 +43,179 @@ PikiwiDB(Pika) 3.5.3 版本正式全面支持 Redis ACL,为未来在云原生 关键 PR 链接: +- [PikiwiDB(Pika) 支持 bitmap](https://github.com/OpenAtomFoundation/pika/pull/2253) +- [支持对 Redis 缓存进行动态调参](https://github.com/OpenAtomFoundation/pika/pull/2197) -+ 支持 bitmap 的支持: - https://github.com/OpenAtomFoundation/pika/pull/2253 +### 1.3 快慢命令分离 -+ 另外,我们在 3.5.3 版本中支持对 Redis 缓存进行动态调参: - https://github.com/OpenAtomFoundation/pika/pull/2197 +为了避免慢命令阻塞快命令的执行,我们在 Codis-Proxy 和 PikiwiDB(Pika) 两个层面实现了快慢命令分离。 -1.3 快慢命令分离 +关键 PR 链接: -+ 为了防止慢命令把快命令执行卡死,我们在 Codis-Proxy 和 PikiwiDB(Pika) 两个层面都实现了快慢命令分离。 - https://github.com/OpenAtomFoundation/pika/pull/2162 +- [实现快慢命令分离](https://github.com/OpenAtomFoundation/pika/pull/2162) -1.4 Redis Stream +### 1.4 Redis Stream 支持 虽然 PikiwiDB(Pika) 之前支持了 Redis pubsub,但它只能进行在线消息传递。在 3.5.3 版本中,我们增加了对 Redis Stream 的有限支持,类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,我们在底层引擎 BlackWidow 中特别添加了对 Stream 数据类型的支持。 -关键 PR: -+ Pika 支持 Redis Stream - https://github.com/OpenAtomFoundation/pika/pull/1955 + +关键 PR 链接: + +- [Pika 支持 Redis Stream](https://github.com/OpenAtomFoundation/pika/pull/1955) + 请注意,Pika Stream 目前还不支持消费组消费,这将在后续版本中实现。 -1.5 云原生集群 +### 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: - -+ PikiwiDB(Pika) Operator 支持 pika 集群自动扩容 - https://github.com/OpenAtomFoundation/pika/pull/2121 -+ 优化 codis slot 迁移速度,支持动态修改迁移线程和速度 - https://github.com/OpenAtomFoundation/pika/pull/2486 - -+ Pika-operator 支持 namespace,在不同的 namespace 下部署不同的集群 - https://github.com/OpenAtomFoundation/pika/pull/2480 +关键 PR 链接: -+ Pika-operator 支持监控指标采集,自动拉起 pika-expoter +- [Pika-Operator 支持 Pika 集群自动扩容](https://github.com/OpenAtomFoundation/pika/pull/2121) +- [优化 codis slot 迁移速度,支持动态修改迁移线程和速度](https://github.com/OpenAtomFoundation/pika/pull/2486) +- [Pika-operator 支持 namespace,可在不同 namespace 下部署不同的集群](https://github.com/OpenAtomFoundation/pika/pull/2480) +- [Pika-operator 支持监控指标采集,自动拉起 pika-expoter](https://github.com/OpenAtomFoundation/pika/pull/2451) - https://github.com/OpenAtomFoundation/pika/pull/2451 -1.6 Compaction 改进 +### 1.6 Compaction 优化 PikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。 -有关 compaction 的关键优化 PR 如下: -+ 添加 CompactRange 命令支持对一定范围内的 key 进行 compact - https://github.com/OpenAtomFoundation/pika/pull/2163 -+ 提升 Compaction 速度减少 Compaction 耗时 - https://github.com/OpenAtomFoundation/pika/pull/2172 -+ 执行 shutdown 命令时调用 disable compaction, 提升进程退出速度 - https://github.com/OpenAtomFoundation/pika/pull/2345 +关键 PR 链接: + +- [添加 CompactRange 命令,支持对一定范围内的 key 进行 compact](https://github.com/OpenAtomFoundation/pika/pull/2163) +- [提升 Compaction 速度,减少 Compaction 耗时](https://github.com/OpenAtomFoundation/pika/pull/2172) +- [执行 shutdown 命令时调用 disable compaction,提升进程退出速度](https://github.com/OpenAtomFoundation/pika/pull/2345) -1.7 自动 Failover +### 1.7 自动 Failover PikiwiDB(Pika) 集群目前是基于 Codis 实现的。为了提高基于 Codis 的 PikiwiDB(Pika) Cluster 的易用性,我们对 Codis 进行了许多扩展。 原始的 Codis 不支持 Group 内的 Failover,需要使用 Redis Sentinel,这会导致运维成本增加。我们在 Codis Dashboard 中加入了 sentinel 的功能,实现了对 Group 内主从的自动 failover。 -关键 PR: +关键 PR 链接: -+ PikiwiDB(Pika) 分布式集群支持自动 failover - https://github.com/OpenAtomFoundation/pika/pull/2386 +- [PikiwiDB(Pika) 分布式集群支持自动 failover](https://github.com/OpenAtomFoundation/pika/pull/2386) -1.8 可观测性提升 +### 1.8 可观测性提升 PikiwiDB(Pika) 的可观测性关键组件是 Pika-Exporter。在 3.5.2 版本中,我们虽然添加了 Redis Cache 缓存热数据,但缺少监控指标。在 3.5.3 版本中,我们增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标。 -关键 PR: - -+ PikiwiDB(Pika) exporter 暴露 cache 相关的数据采集指标 - https://github.com/OpenAtomFoundation/pika/pull/2318 -+ PikiwiDB(Pika) 分布式集群 Codis proxy 新增可观测指标 - https://github.com/OpenAtomFoundation/pika/pull/2199 -+ 修复dbsize 计算错误问题 - https://github.com/OpenAtomFoundation/pika/pull/2494 -+ 修复网络监控指标统计不准确的问题 - https://github.com/OpenAtomFoundation/pika/pull/2234 -1.9 数据一致性 -3.5.3 版本修复了许多 PikiwiDB(Pika) 主从同步问题,确保数据的一致性。 +关键 PR 链接: -关键 PR: +- [Pika exporter 暴露 cache 相关的数据采集指标](https://github.com/OpenAtomFoundation/pika/pull/2318) +- [PikiwiDB(Pika) 分布式集群 Codis proxy 新增可观测指标](https://github.com/OpenAtomFoundation/pika/pull/2199) +- [修复 dbsize 计算错误问题](https://github.com/OpenAtomFoundation/pika/pull/2494) +- [修复网络监控指标统计不准确的问题](https://github.com/OpenAtomFoundation/pika/pull/2234) -+ 修复主从复制过程中, slave 节点收到 master 异常回包后的处理逻辑 - https://github.com/OpenAtomFoundation/pika/pull/2319 -+ 修复 Pika cache 部分场景下 cache 和 DB 数据不一致的问题 - https://github.com/OpenAtomFoundation/pika/pull/2225 -+ 修复全量复制失败后,未做处理导致数据丢失问题 - https://github.com/OpenAtomFoundation/pika/pull/2439 -+ 修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求 - https://github.com/OpenAtomFoundation/pika/pull/2437 -+ 全量复制过程中,添加数据同步状态,明确数据同步进度 - https://github.com/OpenAtomFoundation/pika/pull/2430 -+ 修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题 - https://github.com/OpenAtomFoundation/pika/pull/2409 -+ 修复迁移数据后数据不一致的问题 - https://github.com/OpenAtomFoundation/pika/pull/2485 +### 1.9 数据一致性 +3.5.3 版本修复了许多 PikiwiDB(Pika) 主从同步问题,确保数据的一致性。 -1.10 添加测试集 +关键 PR 链接: -PikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成: +- [修复主从复制过程中,slave 节点收到 master 异常回包后的处理逻辑](https://github.com/OpenAtomFoundation/pika/pull/2319) +- [修复 Pika cache 部分场景下 cache 和 DB 数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2225) +- [修复全量复制失败后,未做处理导致数据丢失问题](https://github.com/OpenAtomFoundation/pika/pull/2439) +- [修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求](https://github.com/OpenAtomFoundation/pika/pull/2437) +- [全量复制过程中,添加数据同步状态,明确数据同步进度](https://github.com/OpenAtomFoundation/pika/pull/2430) +- [修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2409) +- [修复迁移数据后数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2485) -+ gtest 单测主要测试 Pika C++ 代码 -+ Redis TCL 测试集来自 Redis,用于测试 PikiwiDB(Pika) 对 Redis 标准命令兼容度 -+ Go 测试集可对 Pika 进行 Redis 命令测试、主从和 Codis 集群 e2e 测试 +### 1.10 测试集增加 -3.5.3 中添加了 Codis 集群 e2e 测试,关键 PR 如下: +PikiwiDB(Pika) 的测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。在 3.5.3 版本中,我们增加了 Codis 集群 e2e 测试。 +关键 PR 链接: -+ 丰富了 Pika TCL 测试集 - https://github.com/OpenAtomFoundation/pika/pull/2497 -+ 丰富了 Pika Gotest 测试集 - https://github.com/OpenAtomFoundation/pika/pull/2502 +- [Pika TCL 测试集](https://github.com/OpenAtomFoundation/pika/pull/2497) +- [Pika Gotest 测试集](https://github.com/OpenAtomFoundation/pika/pull/2502) -1.11 工具集 -PikiwiDB(Pika) 一直重视工具集的建设,所有相关工具都可以在 https://github.com/OpenAtomFoundation/pika/tree/unstable/tools 中找到。在 3.5.3 版本中,我们新增了一个工具: +### 1.11 工具集更新 -PikiwiDB(Pika) 支持大 key 分析工具 - https://github.com/OpenAtomFoundation/pika/pull/2195 +PikiwiDB(Pika) 一直重视工具集的建设,所有相关工具都可以在 https://github.com/OpenAtomFoundation/pika/tree/unstable/tools 中找到。在 3.5.3 版本中,我们新增了一个工具: -1.12 文档更新 +- [PikiwiDB(Pika) 支持大 key 分析工具](https://github.com/OpenAtomFoundation/pika/pull/2195) + +### 1.12 文档更新 PikiwiDB(Pika) 的文档主要是 wiki 文档。在 3.5.3 版本中,我们更新了 Pika 支持的 Redis 命令文档。 -文档链接: https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5 -2 改进列表 +文档链接:https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5 + +## 2 发版详情 在第一章节中,我们概述了 3.5.3 版本的主要功能升级和改进。下面详细列出了本次发版的相关 PR。 -2.1 新特性 - -+ Pika 支持 ACL - - https://github.com/OpenAtomFoundation/pika/pull/2013 - -+ 在全量复制的过程中,pika 服务的从节点不接收读请求 - - https://github.com/OpenAtomFoundation/pika/pull/2197 -+ 删除 Sharing 模式残留的 Slot 代码,回归 3.0,以后一个 Pika 下有多个 DB,每个 DB 只有一个 Blackwidow - https://github.com/OpenAtomFoundation/pika/pull/2251 -+ 在 Codis dashboard 协程 panic 时自动恢复服务 - https://github.com/OpenAtomFoundation/pika/pull/2349 -+ Pika cache 新增 bimap数据类型 - https://github.com/OpenAtomFoundation/pika/pull/2253 -+ Pika 支持快慢命令分离 - https://github.com/OpenAtomFoundation/pika/pull/2162 -+ Pika exporter 暴露 cache 相关的数据采集指标 - https://github.com/OpenAtomFoundation/pika/pull/2318 -+ Pika 执行完成 Bgsave 后, 保留 unix timepoint - https://github.com/OpenAtomFoundation/pika/pull/2167 -+ Pika 支持动态配置 disable_auto_compations 参数 - https://github.com/OpenAtomFoundation/pika/pull/2257 -+ Pika 支持 Redis Stream - https://github.com/OpenAtomFoundation/pika/pull/1955 -+ Pika 支持大 key 分析工具 - https://github.com/OpenAtomFoundation/pika/pull/2195 -+ Pika 支持动态调整 Pika cache 参数 - https://github.com/OpenAtomFoundation/pika/pull/2197 -+ 更新 Pika benchmark 工具支持更多的接口压测 - https://github.com/OpenAtomFoundation/pika/pull/2222 -+ Pika Operator 支持 pika 集群自动扩容 - https://github.com/OpenAtomFoundation/pika/pull/2121 -+ 添加 CompactRange 命令支持对一定范围内的 key 进行 compact - https://github.com/OpenAtomFoundation/pika/pull/2163 -+ 提升 Compaction 速度减少 Compaction 耗时 - https://github.com/OpenAtomFoundation/pika/pull/2172 -+ 升级 RocksDB 版本到 v8.7.3 - https://github.com/OpenAtomFoundation/pika/pull/2157 -+ Pika 分布式集群 Codis proxy 新增可观测指标 - https://github.com/OpenAtomFoundation/pika/pull/2199 -+ Pika 分布式集群支持自动 failover - https://github.com/OpenAtomFoundation/pika/pull/2386 -+ Pika 支持 redis rename-command 功能 - https://github.com/OpenAtomFoundation/pika/pull/2455 -+ 优化 codis slot 迁移速度,支持动态修改迁移线程和速度 - https://github.com/OpenAtomFoundation/pika/pull/2486 -+ Pika 支持动态调整 max-conn-rbuf-size 参数 - https://github.com/OpenAtomFoundation/pika/pull/2434 -+ Pika-operator 支持 namespace,可以在不同的 namespace 下部署不同的集群 - https://github.com/OpenAtomFoundation/pika/pull/2480 -+ Pika-operator 支持监控指标采集,自动拉起 pika-expoter - https://github.com/OpenAtomFoundation/pika/pull/2451 -+ ACL 向前兼容 userblacklist - https://github.com/OpenAtomFoundation/pika/pull/2459 -+ 丰富了 Pika TCL 测试集 - https://github.com/OpenAtomFoundation/pika/pull/2497 -+ 丰富了 Pika Gotest 测试集 - https://github.com/OpenAtomFoundation/pika/pull/2502 - -2.2 bug 修复 - -+ 修复 Pika 有从节点进行全量复制期间会误删除 dump 文件的问题 - https://github.com/OpenAtomFoundation/pika/pull/2377 -+ 修复主从复制过程中, slave 节点收到 master 异常回包后的处理逻辑 - https://github.com/OpenAtomFoundation/pika/pull/2319 -+ 在 Pika 执行 shutdown 命令时调用 disable compaction, 提升进程退出速度 - https://github.com/OpenAtomFoundation/pika/pull/2345 -+ 修复 Codis-dashboard Redis Memory 值不准确的问题 - https://github.com/OpenAtomFoundation/pika/pull/2337 -+ INFO 命令耗时优化,降低查磁盘使用量的频率 - https://github.com/OpenAtomFoundation/pika/pull/2197 -+ 修复 Rsync 删除临时文件路径不对,删除失败,导致rocksdb打开失败的问题 - https://github.com/OpenAtomFoundation/pika/pull/2186 -+ 修复 Compact ,Bgsave ,Info keyspace 命令未指定db名称,导致部分命令 coredump 的问题 - https://github.com/OpenAtomFoundation/pika/pull/2194 -+ Codis dashboard 用 info replication 替代 info 命令查寻 master ip 降低对 Pika 的性能影响 - https://github.com/OpenAtomFoundation/pika/pull/2198 -+ 修复 Pika cache 使用边缘case,解决部分场景下 cache 和 DB 数据不一致的问题 - https://github.com/OpenAtomFoundation/pika/pull/2225 -+ 修复当 dump 文件夹为空时,会启动报错 Segmentation fault 的问题 - https://github.com/OpenAtomFoundation/pika/pull/2265 -+ 修复因为 flag 计算错误,导致的部分命令缓存没有生效问题 - https://github.com/OpenAtomFoundation/pika/pull/2217 -+ 修复主从复制模式下,主实例 flushdb 后,从实例因为死锁导致的不能访问的问题 - https://github.com/OpenAtomFoundation/pika/pull/2249 -+ 修复部分命令未对 RocksDB 的返回值进行判断的问题 - https://github.com/OpenAtomFoundation/pika/pull/2187 -+ 规范函数的返回值及初始值 - https://github.com/OpenAtomFoundation/pika/pull/2176 -+ 修复网络监控指标统计不准确的问题 - https://github.com/OpenAtomFoundation/pika/pull/2234 -+ 修复配置文件加载部分参数异常的问题 - https://github.com/OpenAtomFoundation/pika/pull/2218 -+ 修复 Codis dashboard cpu 100% 的问题 - https://github.com/OpenAtomFoundation/pika/pull/2393 -+ 修复 Codis fe pika 主从角色显示异常的问题 - https://github.com/OpenAtomFoundation/pika/pull/2387 -+ 修复迁移数据后数据不一致的问题 - https://github.com/OpenAtomFoundation/pika/pull/2485 -+ 修复dbsize 计算错误问题 - https://github.com/OpenAtomFoundation/pika/pull/2494 -+ 修复扩缩容或者 pod 起停后,Codis-dashboard 界面显示不准确的问题 - https://github.com/OpenAtomFoundation/pika/pull/2475 -+ 修复 DB 层重复上锁的问题 - https://github.com/OpenAtomFoundation/pika/pull/2372 -+ 修复全量复制失败后,未做处理导致数据丢失问题 - https://github.com/OpenAtomFoundation/pika/pull/2439 -+ 修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求 - https://github.com/OpenAtomFoundation/pika/pull/2437 -+ 全量复制过程中,添加数据同步状态,明确数据同步进度 - https://github.com/OpenAtomFoundation/pika/pull/2430 -+ 修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题 - https://github.com/OpenAtomFoundation/pika/pull/2409 -+ 修复 codis slot 迁移过程中 master 实例 coredump 的问题 - https://github.com/OpenAtomFoundation/pika/pull/2415 -+ 修复在主从复制过程中,删除正在使用的 dump 文件的问题 - https://github.com/OpenAtomFoundation/pika/pull/2377 -+ 修复主从复制过程中从实例 rsync 响应错误的问题 - https://github.com/OpenAtomFoundation/pika/pull/2319 - -2.3 发版 tag - https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3 -3 社区 - -如果你有任何疑问,欢迎加入交流群,PikiwiDB(Pika) 开源社区感谢大家的支持和帮助。 - -![2024-03-27-Pika-3.5.3-connect](2024-03-27-Pika-3.5.3-connect.png) \ No newline at end of file +### 2.1 新特性 + +- [Pika 支持 ACL](https://github.com/OpenAtomFoundation/pika/pull/2013) +- [在全量复制过程中,pika 服务的从节点不接收读请求](https://github.com/OpenAtomFoundation/pika/pull/2197) +- [删除 Sharing 模式残留的 Slot 代码,回归 3.0,以后一个 Pika 下有多个 DB,每个 DB 只有一个 Blackwidow](https://github.com/OpenAtomFoundation/pika/pull/2251) +- [在 Codis dashboard 协程 panic 时自动恢复服务](https://github.com/OpenAtomFoundation/pika/pull/2349) +- [Pika cache 新增 bimap数据类型](https://github.com/OpenAtomFoundation/pika/pull/2253) +- [Pika 支持快慢命令分离](https://github.com/OpenAtomFoundation/pika/pull/2162) +- [Pika exporter 暴露 cache 相关的数据采集指标](https://github.com/OpenAtomFoundation/pika/pull/2318) +- [Pika 执行完成 Bgsave 后, 保留 unix timepoint](https://github.com/OpenAtomFoundation/pika/pull/2167) +- [Pika 支持动态配置 disable_auto_compations 参数](https://github.com/OpenAtomFoundation/pika/pull/2257) +- [Pika 支持 Redis Stream](https://github.com/OpenAtomFoundation/pika/pull/1955) +- [Pika 支持大 key 分析工具](https://github.com/OpenAtomFoundation/pika/pull/2195) +- [Pika 支持动态调整 Pika cache 参数](https://github.com/OpenAtomFoundation/pika/pull/2197) +- [更新 Pika benchmark 工具支持更多的接口压测](https://github.com/OpenAtomFoundation/pika/pull/2222) +- [Pika Operator 支持 Pika 集群自动扩容](https://github.com/OpenAtomFoundation/pika/pull/2121) +- [添加 CompactRange 命令支持对一定范围内的 key 进行 compact](https://github.com/OpenAtomFoundation/pika/pull/2163) +- [提升 Compaction 速度减少 Compaction 耗时](https://github.com/OpenAtomFoundation/pika/pull/2172) +- [升级 RocksDB 版本到 v8.7.3](https://github.com/OpenAtomFoundation/pika/pull/2157) +- [Pika 分布式集群 Codis proxy 新增可观测指标](https://github.com/OpenAtomFoundation/pika/pull/2199) +- [Pika 分布式集群支持自动 failover](https://github.com/OpenAtomFoundation/pika/pull/2386) +- [Pika 支持 redis rename-command 功能](https://github.com/OpenAtomFoundation/pika/pull/2455) +- [优化 codis slot 迁移速度,支持动态修改迁移线程和速度](https://github.com/OpenAtomFoundation/pika/pull/2486) +- [Pika 支持动态调整 max-conn-rbuf-size 参数](https://github.com/OpenAtomFoundation/pika/pull/2434) +- [Pika-operator 支持 namespace,可以在不同的 namespace 下部署不同的集群](https://github.com/OpenAtomFoundation/pika/pull/2480) +- [Pika-operator 支持监控指标采集,自动拉起 pika-expoter](https://github.com/OpenAtomFoundation/pika/pull/2451) +- [ACL 向前兼容 userblacklist](https://github.com/OpenAtomFoundation/pika/pull/2459) +- [丰富了 Pika TCL 测试集](https://github.com/OpenAtomFoundation/pika/pull/2497) +- [丰富了 Pika Gotest 测试集](https://github.com/OpenAtomFoundation/pika/pull/2502) + +### 2.2 Bug 修复 + +- [修复 Pika 有从节点进行全量复制期间会误删除 dump 文件的问题](https://github.com/OpenAtomFoundation/pika/pull/2377) +- [修复主从复制过程中, slave 节点收到 master 异常回包后的处理逻辑](https://github.com/OpenAtomFoundation/pika/pull/2319) +- [在 Pika 执行 shutdown 命令时调用 disable compaction, 提升进程退出速度](https://github.com/OpenAtomFoundation/pika/pull/2345) +- [修复 Codis-dashboard Redis Memory 值不准确的问题](https://github.com/OpenAtomFoundation/pika/pull/2337) +- [INFO 命令耗时优化,降低查磁盘使用量的频率](https://github.com/OpenAtomFoundation/pika/pull/2197) +- [修复 Rsync 删除临时文件路径不对,删除失败,导致rocksdb打开失败的问题](https://github.com/OpenAtomFoundation/pika/pull/2186) +- [修复 Compact, Bgsave, Info keyspace 命令未指定db名称,导致部分命令 coredump 的问题](https://github.com/OpenAtomFoundation/pika/pull/2194) +- [Codis dashboard 用 info replication 替代 info 命令查寻 master ip 降低对 Pika 的性能影响](https://github.com/OpenAtomFoundation/pika/pull/2198) +- [修复 Pika cache 使用边缘case,解决部分场景下 cache 和 DB 数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2225) +- [修复当 dump 文件夹为空时,会启动报错 Segmentation fault 的问题](https://github.com/OpenAtomFoundation/pika/pull/2265) +- [修复因为 flag 计算错误,导致的部分命令缓存没有生效问题](https://github.com/OpenAtomFoundation/pika/pull/2217) +- [修复主从复制模式下,主实例 flushdb 后,从实例因为死锁导致的不能访问的问题](https://github.com/OpenAtomFoundation/pika/pull/2249) +- [修复部分命令未对 RocksDB 的返回值进行判断的问题](https://github.com/OpenAtomFoundation/pika/pull/2187) +- [规范函数的返回值及初始值](https://github.com/OpenAtomFoundation/pika/pull/2176) +- [修复网络监控指标统计不准确的问题](https://github.com/OpenAtomFoundation/pika/pull/2234) +- [修复配置文件加载部分参数异常的问题](https://github.com/OpenAtomFoundation/pika/pull/2218) +- [修复 Codis dashboard cpu 100% 的问题](https://github.com/OpenAtomFoundation/pika/pull/2393) +- [修复 Codis fe pika 主从角色显示异常的问题](https://github.com/OpenAtomFoundation/pika/pull/2387) +- [修复迁移数据后数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2485) +- [修复 dbsize 计算错误问题](https://github.com/OpenAtomFoundation/pika/pull/2494) +- [修复扩缩容或者 pod 起停后,Codis-dashboard 界面显示不准确的问题](https://github.com/OpenAtomFoundation/pika/pull/2475) +- [修复 DB 层重复上锁的问题](https://github.com/OpenAtomFoundation/pika/pull/2372) +- [修复全量复制失败后,未做处理导致数据丢失问题](https://github.com/OpenAtomFoundation/pika/pull/2439) +- [修复主从复制过程中,主实例执行 bgsave 过程中,没有正确回应从的同步请求](https://github.com/OpenAtomFoundation/pika/pull/2437) +- [全量复制过程中,添加数据同步状态,明确数据同步进度](https://github.com/OpenAtomFoundation/pika/pull/2430) +- [修复从库在 Apply binlog 时,没有对操作的 key 加锁,导致数据不一致的问题](https://github.com/OpenAtomFoundation/pika/pull/2409) +- [修复 codis slot 迁移过程中 master 实例 coredump 的问题](https://github.com/OpenAtomFoundation/pika/pull/2415) +- [修复在主从复制过程中,删除正在使用的 dump 文件的问题](https://github.com/OpenAtomFoundation/pika/pull/2377) +- [修复主从复制过程中从实例 rsync 响应错误的问题](https://github.com/OpenAtomFoundation/pika/pull/2319) + +### 2.3 发版标签 + +https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3 + +## 3 社区 + +PikiwiDB(Pika) 开源社区感谢您的支持,如果您有任何疑问或建议,欢迎加入我们的社区交流群: + +* 微信助手 PikiwiDB【请在微信中搜索 PikiwiDB】 +* telegram 群 https://t.me/+gMlTzNacOF1iMTM1 \ No newline at end of file diff --git a/blog/2024-05-16-Pika-3.5.4.md b/blog/2024-05-16-Pika-3.5.4.md index da8a716..7b683b0 100644 --- a/blog/2024-05-16-Pika-3.5.4.md +++ b/blog/2024-05-16-Pika-3.5.4.md @@ -1,151 +1,163 @@ --- -title: What's new in Pika v3.5.4 +title: What's new in PikiwiDB(Pika) v3.5.4 slug: Pika-3.5.4 authors: - - name: 于雨 - title: dubbogo示土区 + - name: 陈俊华 + title: 360 hide_table_of_contents: false --- -PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。 -v3.5.4 解决了历史遗留的 bug,对 PikiwiDB(Pika) 的一些遗留 bug 进行修复和优化,旨在打造出一个高稳定性的版本。本次的重点优化主要包括,PikiwiDB(Pika)支持动态调整限速参数、增强 PikiwiDB(Pika) 的客观测性指标、 磁盘 IO 限速支持读限速及写限速等。 -1 新特性 +PikiwiDB (Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。 + +v3.5.4 解决了历史遗留的 bug,对 PikiwiDB (Pika) 的一些遗留 bug 进行修复和优化,旨在打造出一个高稳定性的版本。本次的重点优化主要包括,PikiwiDB (Pika) 支持动态调整限速参数、增强 PikiwiDB (Pika) 的客观测性指标、 磁盘 IO 限速支持读限速及写限速等。 + +## 1 新特性 1. Pika 支持动态调整全量同步限速参数 rsync-timeout-ms 和 throttle-bytes-per-second。 -自 v3.5.0 版本开始,PikiwiDB(Pika) 服务摒弃了通过子进程内使用原来 rsync 工具进行主从全量同步的逻辑,在 PikiwiDB(Pika) 内部以线程方式【称作 rsync 线程】自行实现了新的全量同步逻辑,避免因为外部进程不可控引起的主从同步问题,根据 360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 主从进行全量同步的过程中,如果遇到某些不利的外部因素,如网络波动,硬件故障(如网卡降速导致的主从网卡速率不匹配)等,可能引起 rsync 线程请求持续超时(PikiwiDB(Pika) 内置 rsync 模块用于全量同步阶段的文件传输),且超时重试所发出的包可能引发更大的网络信道负担。此时对于运维人员来说,如果能动态调整 rsync 请求的超时时间和 rsync 传输的速率上限,不仅意味着对全量同步阶段控制粒度的进一步细化,更大大降低了在该场景下的运维处置难度。 +自 v3.5.0 版本开始,PikiwiDB (Pika) 服务摒弃了通过子进程内使用原来 rsync 工具进行主从全量同步的逻辑,在 PikiwiDB (Pika) 内部以线程方式【称作 rsync 线程】自行实现了新的全量同步逻辑,避免因为外部进程不可控引起的主从同步问题,根据 360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB (Pika) 主从进行全量同步的过程中,如果遇到某些不利的外部因素,如网络波动,硬件故障(如网卡降速导致的主从网卡速率不匹配)等,可能引起 rsync 线程请求持续超时(PikiwiDB (Pika) 内置 rsync 模块用于全量同步阶段的文件传输),且超时重试所发出的包可能引发更大的网络信道负担。此时对于运维人员来说,如果能动态调整 rsync 请求的超时时间和 rsync 传输的速率上限,不仅意味着对全量同步阶段控制粒度的进一步细化,更大大降低了在该场景下的运维处置难度。 -关键PR: +关键 PR: https://github.com/OpenAtomFoundation/pika/pull/2633 2. 将 info key space 1 的结果输出至 info all 并展示到监控界面中。 -PikiwiDB(Pika) 是通过 Info 命令采集数据至 Pika-Exporter,展示到 Grafana 界面上的,目前界面上部分数据是没有展示的,如 keys 的数量,本次将执行 info keyspace 的结果展示到监控界面,用户可以通过这个指标来查看存储的量级等。 +PikiwiDB (Pika) 是通过 Info 命令采集数据至 Pika-Exporter,展示到 Grafana 界面上的,目前界面上部分数据是没有展示的,如 keys 的数量,本次将执行 info keyspace 的结果展示到监控界面,用户可以通过这个指标来查看存储的量级等。 -关键PR: +关键 PR: https://github.com/OpenAtomFoundation/pika/pull/2603 -3.Pika 磁盘IO 限速参数支持 OnlyRead、OnlyWrite、ReadAndWrite,默认支持OnlyWrite。 +3.Pika 磁盘 IO 限速参数支持 OnlyRead、OnlyWrite、ReadAndWrite,默认支持 OnlyWrite。 -自3.5.0版本开始,PikiwiDB(Pika) 服务可以通过调整 rate-limit 参数实现写限速,防止在网卡质量不高的情况下磁盘 IO 过重导致服务不可用,或者 binlog 阻塞的情况发生。360内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 实例的网卡较差情况下,也需要对读实例进行限速,本次修改支持读、写限速,默认是写限速,调整 config 配置中的 rate-limiter-mode 可以设置为读限速,或者同时读写限速。 +自 3.5.0 版本开始,PikiwiDB(Pika) 服务可以通过调整 rate-limit 参数实现写限速,防止在网卡质量不高的情况下磁盘 IO 过重导致服务不可用,或者 binlog 阻塞的情况发生。360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB (Pika) 实例的网卡较差情况下,也需要对读实例进行限速,本次修改支持读、写限速,默认是写限速,调整 config 配置中的 rate-limiter-mode 可以设置为读限速,或者同时读写限速。 -关键PR: +关键 PR: - https://github.com/OpenAtomFoundation/pika/pull/2599 +- https://github.com/OpenAtomFoundation/pika/pull/2599 2 改进列表 - slotmigrate 添加 go test。 +- slotmigrate 添加 go test。 - https://github.com/OpenAtomFoundation/pika/pull/2576 + https://github.com/OpenAtomFoundation/pika/pull/2576 - INFO 命令耗时优化,降低查磁盘频率,避免因为数据采集调用 info 命令时查磁盘太过频繁导致服务性能下降。 +- INFO 命令耗时优化,降低查磁盘频率,避免因为数据采集调用 info 命令时查磁盘太过频繁导致服务性能下降。 - https://github.com/OpenAtomFoundation/pika/pull/2554 + https://github.com/OpenAtomFoundation/pika/pull/2554 - 对五种基本数据类型命令增加 Redis tcl 测试。 +- 对五种基本数据类型命令增加 Redis tcl 测试。 - https://github.com/OpenAtomFoundation/pika/pull/2527 + https://github.com/OpenAtomFoundation/pika/pull/2527 3 Bug 修复 - 修复使用 Pika Exporter 时可能会出现 slots 分配不均衡的问题。 +- 修复使用 Pika Exporter 时可能会出现 slots 分配不均衡的问题。 + + https://github.com/OpenAtomFoundation/pika/pull/2651 + +- 修复 Codis dashboard 不能正确更新 master 实例状态的问题。 + + https://github.com/OpenAtomFoundation/pika/pull/2650 + +- 修复 Redis 事务 binlog 解析失败导致的主从同步异常问题。 + + https://github.com/OpenAtomFoundation/pika/pull/2642 - https://github.com/OpenAtomFoundation/pika/pull/2651 +- 修复 Pika Expoter 启动时不带参数导致启动失败问题。 - 修复 Codis dashboard 不能正确更新 master 实例状态的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2640 - https://github.com/OpenAtomFoundation/pika/pull/2650 +- 修复使用 Pika Operater 拉起集群 Codis-proxy panic 的问题。 - 修复 Redis 事务 binlog 解析失败导致的主从同步异常问题。 + https://github.com/OpenAtomFoundation/pika/pull/2633 - https://github.com/OpenAtomFoundation/pika/pull/2642 +- 修复 CI 编译出的二进制进行自动化测试时 cp 命令失败问题。 - 修复 Pika Expoter 启动时不带参数导致启动失败问题。 + https://github.com/OpenAtomFoundation/pika/pull/2614 - https://github.com/OpenAtomFoundation/pika/pull/2640 +- 修复变量未初始化导致 cache 启动失败的问题。 - 修复使用 Pika Operater 拉起集群 Codis-proxy panic 的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2613 - https://github.com/OpenAtomFoundation/pika/pull/2633 +- 修复 userpass 和 userblacklist 动态修改参数功能异常问题。 - 修复 CI 编译出的二进制进行自动化测试时 cp 命令失败问题。 + https://github.com/OpenAtomFoundation/pika/pull/2600 - https://github.com/OpenAtomFoundation/pika/pull/2614 +- 修复 scard sscan 结果不一致的问题。 - 修复变量未初始化导致 cache 启动失败的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2596 - https://github.com/OpenAtomFoundation/pika/pull/2613 +- 修复当 max-rsync-parallel-num 大于 4,slave 会在主从复制时 coredump 的问题。 - 修复 userpass 和 userblacklist 动态修改参数功能异常问题。 + https://github.com/OpenAtomFoundation/pika/pull/2595 - https://github.com/OpenAtomFoundation/pika/pull/2600 +- 调整不常用的线程池线程数,避免因为空跑导致性能损耗。 - 修复 scard sscan 结果不一致的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2590 - https://github.com/OpenAtomFoundation/pika/pull/2596 +- 修复 Pika 事务边缘测试 case 不通过的问题。 - 修复当 max-rsync-parallel-num 大于4,slave 会在主从复制时 coredump 的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2586 - https://github.com/OpenAtomFoundation/pika/pull/2595 +- 将 cache-model 修改成 cache-mode。 - 调整不常用的线程池线程数,避免因为空跑导致性能损耗。 + https://github.com/OpenAtomFoundation/pika/pull/2585 - https://github.com/OpenAtomFoundation/pika/pull/2590 +- 修复使用 info keyspace 后,info all 死锁的问题。 - 修复 Pika 事务边缘测试 case 不通过的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2584 - https://github.com/OpenAtomFoundation/pika/pull/2586 +- 修复因修改 zsetscorekey comparator impl 字典序比较熟顺序,导致 353 352 极端场景不兼容的问题。 - 将 cache-model 修改成 cache-mode。 + https://github.com/OpenAtomFoundation/pika/pull/2583 - https://github.com/OpenAtomFoundation/pika/pull/2585 +- 修复 compact 死锁的问题。 - 修复使用 info keyspace 后,info all 死锁的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2581 - https://github.com/OpenAtomFoundation/pika/pull/2584 +- Slotmigrate 添加 go test。 - 修复因修改 zsetscorekey comparator impl 字典序比较熟顺序,导致 353 352极端场景不兼容的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2576 - https://github.com/OpenAtomFoundation/pika/pull/2583 +- 更新 Pika Operater 使用的 pika 版本。 - 修复 compact 死锁的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2572 - https://github.com/OpenAtomFoundation/pika/pull/2581 +- 修复 config rewrite 后 blockcache 数值异常的问题。 - Slotmigrate 添加 go test。 + https://github.com/OpenAtomFoundation/pika/pull/2561 - https://github.com/OpenAtomFoundation/pika/pull/2576 +- 修复 slotmigrate 动态修复后值错误的问题。 - 更新 Pika Operater 使用的 pika 版本。 + https://github.com/OpenAtomFoundation/pika/pull/2548 - https://github.com/OpenAtomFoundation/pika/pull/2572 +- 修复 spop 可能会出现主从数据不一致的问题。 - 修复 config rewrite 后 blockcache 数值异常的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2541 - https://github.com/OpenAtomFoundation/pika/pull/2561 +- 修复 CloseFd (it->second [i]) 出现越界的问题。 - 修复 slotmigrate 动态修复后值错误的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2539 - https://github.com/OpenAtomFoundation/pika/pull/2548 +- 修复 Flushall 和 FlushDB 死锁的隐患,并删除 FlushSubDB 接口。 - 修复 spop 可能会出现主从数据不一致的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2533 - https://github.com/OpenAtomFoundation/pika/pull/2541 +- 增加参数控制是否清理 tcl 测试后产生的数据文件,防止废弃数据占据磁盘。 - 修复 CloseFd(it->second[i]) 出现越界的问题。 + https://github.com/OpenAtomFoundation/pika/pull/2507 - https://github.com/OpenAtomFoundation/pika/pull/2539 +4 社区 - 修复 Flushall 和 FlushDB 死锁的隐患,并删除 FlushSubDB 接口。 +PikiwiDB (Pika) 开源社区热烈欢迎您的参与和支持。如果您有任何问题、意见或建议,可通过以下渠道联系我们: - https://github.com/OpenAtomFoundation/pika/pull/2533 +![图片](data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='1px' height='1px' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' fill-opacity='0'%3E%3Cg transform='translate(-249.000000, -126.000000)' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E) - 增加参数控制是否清理 tcl 测试后产生的数据文件,防止废弃数据占据磁盘。 - https://github.com/OpenAtomFoundation/pika/pull/2507 +![img](https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=Mzg4MTY2ODA1MQ==&mid=2247483978&idx=1&sn=b56b42fb857f2ef6cc4c57b18f205e92&send_time=) -![2024-05-16-Pika-3.5.4-connect.png](2024-05-16-Pika-3.5.4-connect.png) \ No newline at end of file +微信扫一扫 +关注该公众号 \ No newline at end of file diff --git a/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md b/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md index 20bd727..6ae2ea8 100644 --- a/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md +++ b/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md @@ -8,98 +8,154 @@ authors: hide_table_of_contents: false --- +# 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 形式的复合数据结构。 +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 实例,减小了数据的空间放大和读放大效应,实现了机器资源的高效利用。 -+ RocksDB 实例数可配置 +- **强类型 key** -摒弃了 Blackwidow 按数据类型采用 RocksDB 实例的物理隔离模式,Floyd 采用了 RocksDB 的 Column-Family 虚拟隔离机制,在单个 RocksDB 实例下可存储所有类型的数据。用户可自由设定 Pika 实例中每个 DB【等同于Redis DB】中 RocksDB 实例的数量,而数据的存储则依据 key 的 hash 值分配至相应的 RocksDB 实例,减小了数据的空间放大和读放大效应,实现了机器资源的高效利用。 +![](https://private-user-images.githubusercontent.com/73943232/333059521-afa8a2bf-cebf-481f-a370-deaf4386b46b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1MjU4NzYsIm5iZiI6MTcyMDUyNTU3NiwicGF0aCI6Ii83Mzk0MzIzMi8zMzMwNTk1MjEtYWZhOGEyYmYtY2ViZi00ODFmLWEzNzAtZGVhZjQzODZiNDZiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzA5VDExNDYxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTlkMzcyYWU4NzI4ZDkyYjliZTg3NjM1YTI4ZjhlMzUwMDlmYWJmYzMzZTJkMzY4ZTYwMzk2NGJiNDhkNDc0ZWImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.FHMEJbqfdxgE3asbq8neuN4SMyDpyZHlpRSNy7JH1Zo) -+ 禁止重复 key +基于 RocksDB 的 Column-Family 虚拟隔离机制,Floyd 把所有类型的 key 和 string 一起存储在 Column-Family 0。 -![2024-05-16-PikiwiDB(Pika)-4.0.0-key](2024-07-08-PikiwiDB(Pika)-4.0.0-key.png) -基于 RocksDB 的 Column-Family 虚拟隔离机制,Floyd 把所有类型的 key 和 string 一起存储在 Column-Family 0。在此存储基础之上,可明确禁止不同类型的 key 重复,这一设计旨在杜绝潜在的数据冗余与不一致性,与 Redis 服务特性保持一致,进一步提升了系统的整体效率与数据质量。 +在此存储基础之上,不同于 Blackwidow,可明确禁止不同类型的 key 重复【强类型】,这一设计旨在杜绝潜在的数据冗余与不一致性,与 Redis 服务特性保持一致,进一步提升了系统的整体效率与数据质量。 -+ Floyd 详细说明 +Pika v2.x 系列版本基于存储引擎 Nemo,v3.x 系列版本基于 Blackwidow,它们因为采用了物理隔离机制,无法低成本实现强类型 key,所有在 Redis TYPE 命令的结果中可能返回多种类型,而 Floyd 则完全兼容 Redis 只返回一种类型。 -如果对 Floyd 存储引擎感兴趣,请详阅《Floyd 存储引擎》【链接:https://github.com/OpenAtomFoundation/pika/discussions/2052】。由于 Floyd 前后进行了多个版本的迭代,所以阅读该 github discussion 文档时请注意前后时间,如有相关冲突性说法,以最新日期的文字为准。 +- **Floyd 详细说明** + +如果对 Floyd 存储引擎感兴趣,请详阅《Floyd 存储引擎》 + +【链接:https://github.com/OpenAtomFoundation/pika/discussions/2052】 + +由于 Floyd 前后进行了多个版本的迭代,所以阅读该 github discussion 文档时请注意前后时间,如有相关冲突性说法,以最新日期的文字为准。 关键 PR: -+ PikiwiDB(Pika) 支持 Floyd 存储引擎 +PikiwiDB(Pika) 支持 Floyd 存储引擎 + https://github.com/OpenAtomFoundation/pika/pull/2413 -+ 添加 Floyd 的 compaction-filter 的 Gtest + +添加 Floyd 的 compaction-filter 的 Gtest + https://github.com/OpenAtomFoundation/pika/pull/2669 -+ Pika 不支持不同类型的重复 key, 写入重复 key 返回非法类型 + +Pika 不支持不同类型的重复 key, 写入重复 key 返回非法类型 + https://github.com/OpenAtomFoundation/pika/pull/2609 -+ 对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操作与 String 操作明确区分开 + +对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操作与 String 操作明确区分开 + https://github.com/OpenAtomFoundation/pika/pull/2720 -+ 添加支持分区索引过滤的功能 + +添加支持分区索引过滤的功能 + https://github.com/OpenAtomFoundation/pika/pull/2601 -1.2 Mget 批量查询缓存 +## **1.2 Mget 批量查询缓存** + +Pika v3.5.2 的热数据缓存只实现了对热点 Key 的点查 (如 get/hget),在后续的 v3.5.3 和 v3.5.4 修复若干 bug 后,对热数据的点查目前已经非常稳定。然而并未支持批量查询 (如 mget etc)。 -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 】。 +为了满足业务需求,Pika 团队开发了批量查询热数据缓存功能,显著提升了批量查询性能,降低了查询延迟和失败率。相关技术细节请阅读《PikiwiDB (Pika) 混合存储之批量查询》 + +【链接:https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ 】。 + + 关键 PR : -+ Mget 支持多 key 查询缓存, 记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能 +Mget 支持多 key 查询缓存,记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能 + https://github.com/OpenAtomFoundation/pika/pull/2675 -+ 修复 Mget 没有使用解析 ttl 的函数导致出现部分key的ttl未被更新,数据不一致的问题 + +修复 Mget 没有使用解析 ttl 的函数导致出现部分 key 的 ttl 未被更新,数据不一致的问题 + https://github.com/OpenAtomFoundation/pika/pull/2730 -1.3 主从复制 + +## **1.3 主从复制** Pika v3.3.6 有很多主从复制的缺陷。v4.0.0 版本对 Pika 全量复制及增量复制进行了大量优化和 bug 修复,取得了非常好的效果。 -并在 info 命令中输出了 "repl_connect_status" 指标(PR 2638),以方便用户更加明确清晰的确定当前的主从复制状态。 + +并在 info 命令中输出了 "repl_connect_status" 指标 (PR 2638),以方便用户更加明确清晰的确定当前的主从复制状态。 关键 PR : -+ 修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题 +修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题 + https://github.com/OpenAtomFoundation/pika/pull/2746 -+ 修复 Spop 在写 binlog 时可能会出现竞态问题 + +修复 Spop 在写 binlog 时可能会出现竞态问题 + https://github.com/OpenAtomFoundation/pika/pull/2647 -+ 修复多 DB 下全量同步超时后不重试的问题 + +修复多 DB 下全量同步超时后不重试的问题 + https://github.com/OpenAtomFoundation/pika/pull/2667 -+ 修复多 DB 主从超时场景下,可能会出现窗口崩溃的问题 + +修复多 DB 主从超时场景下,可能会出现窗口崩溃的问题 + https://github.com/OpenAtomFoundation/pika/pull/2666 -+ 修复主从同步限速逻辑中重复解锁的问题 + +修复主从同步限速逻辑中重复解锁的问题 + https://github.com/OpenAtomFoundation/pika/pull/2657 -+ 重构主从复制模式 slave 节点的主从同步线程模型,尽可能减少 binlog 消费阻塞问题 + +重构主从复制模式 slave 节点的主从同步线程模型,尽可能减少 binlog 消费阻塞问题 + https://github.com/OpenAtomFoundation/pika/pull/2638 -1.4 Redis Stream +## **1.4 Redis Stream** + +Redis Stream 类似于消息队列(MQ),以便更安全地传递消息。 + +为了确保数据的安全性,底层引擎 BlackWidow 和 Floyd 中特别添加了对 Stream 数据类型的支持。 -Redis Stream 类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,底层引擎 BlackWidow 和 Floyd 中特别添加了对 Stream 数据类型的支持。 关键 PR: -+ 修复 pkpatternmatchdel 命令使用错误导致的 stream 类型数据删除异常的问题 + +修复 pkpatternmatchdel 命令使用错误导致的 stream 类型数据删除异常的问题 + https://github.com/OpenAtomFoundation/pika/pull/2726 -+ 修复 Keyspace 命令未计算 Stream 类型数据的问题 + +修复 Keyspace 命令未计算 Stream 类型数据的问题 + https://github.com/OpenAtomFoundation/pika/pull/2705 -1.5 Compaction +## **1.5 Compaction** -PikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。 +PikiwiDB (Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB (Pika) 的读写性能。 -Floyd 使用了 v8.7.3 版本的 RocksDB,开放了更多 RocksDB 参数,以方便用户优化 RocksDB 性能: +因此,控制好 compaction 是优化 Pika 读写性能的关键。 -+ enable-partitioned-index-filters: 支持加载分区索引过滤器,加快 RocksDB 查找速度。 -+ min-write-buffer-number-to-merge: 默认值为 1,如果将此值设置得更大,意味着需要更多的写缓冲区被填满后才进行 flush。这样可以减少 flush 的频率,增加数据在内存中的累积量,从而可能提高写入吞吐量。 -+ level0-stop-writes-trigger: 默认值为 36,定义了 L0 层中 sst 文件的最大数量,一旦达到这个数量,RocksDB 将会采取 暂停写入、强制 compaction 等措施来防止写入操作继续累积,以避免 L0 层变得过于庞大,进而可能导致写入放大、查询性能下降等问题。 -+ level0-slowdown-writes-trigger:默认值为 20,用于控制当 Level 0 的 SST 文件数量达到这个阈值时,触发写减速(write slowdown),防止 Level 0 的文件数量过多,导致后续 compaction 操作的压力过大。 -+ level0-file-num-compaction-trigger:默认值为 4,当 Level 0 的 SST 文件数量达到这个参数设定的阈值时,RocksDB 会开始执行 compaction 操作,将 Level 0 的文件合并到 Level 1,以减少 Level 0 的文件数量,降低读取延迟,并优化存储空间的利用率。 -+ max-subcompactions:默认值为 1,用于控制RocksDB 中并发执行的 sub-compaction 任务数量,其值为 1 表示关闭 sub-compaction。如果系统资源充足,建议提升该参数以优化 compaction 效率。 -+ max-bytes-for-level-base:指定了 L1 SST 文件总的大小。这个大小是 RocksDB 进行数据分层管理和 compaction 决策的重要依据:如果 L1 层的大小设置得太小,可能会导致 L0 层的 compaction 过于频繁,进而影响写性能。反之,如果设置得太大,可能会占用较多的磁盘空间,并且影响读取性能,因为读取操作可能需要跨越更多的层级。Pika 没有在 pika.conf 中开放此参数给用户配置,而是使用其他参数(level0-file-num-compaction-trigger 和 write-buffer-size)计算后的结果。 +Floyd 使用了 v8.7.3 版本的 RocksDB,开放了更多 RocksDB 参数,以方便用户优化 RocksDB 性能: +1. enable-partitioned-index-filters: 支持加载分区索引过滤器,加快 RocksDB 查找速度。 +2. min-write-buffer-number-to-merge: 默认值为 1,如果将此值设置得更大,意味着需要更多的写缓冲区被填满后才进行 flush。这样可以减少 flush 的频率,增加数据在内存中的累积量,从而可能提高写入吞吐量。 +3. level0-stop-writes-trigger: 默认值为 36,定义了 L0 层中 sst 文件的最大数量,一旦达到这个数量,RocksDB 将会采取 **暂停写入、强制 compaction** 等措施来防止写入操作继续累积,以避免 L0 层变得过于庞大,进而可能导致写入放大、查询性能下降等问题。 +4. level0-slowdown-writes-trigger:默认值为 20,用于控制当 Level 0 的 SST 文件数量达到这个阈值时,触发写减速(write slowdown),防止 Level 0 的文件数量过多,导致后续 compaction 操作的压力过大。 +5. level0-file-num-compaction-trigger:默认值为 4,当 Level 0 的 SST 文件数量达到这个参数设定的阈值时,RocksDB 会开始执行 compaction 操作,将 Level 0 的文件合并到 Level 1,以减少 Level 0 的文件数量,降低读取延迟,并优化存储空间的利用率。 +6. max-subcompactions:默认值为 1,用于控制 RocksDB 中并发执行的 sub-compaction 任务数量,其值为 1 表示关闭 sub-compaction。如果系统资源充足,建议提升该参数以优化 compaction 效率。 +7. max-bytes-for-level-base:指定了 L1 SST 文件总的大小。这个大小是 RocksDB 进行数据分层管理和 compaction 决策的重要依据:如果 L1 层的大小设置得太小,可能会导致 L0 层的 compaction 过于频繁,进而影响写性能。反之,如果设置得太大,可能会占用较多的磁盘空间,并且影响读取性能,因为读取操作可能需要跨越更多的层级。Pika 没有在 pika.conf 中开放此参数给用户配置,而是使用其他参数(**level0-file-num-compaction-trigger** 和 **write-buffer-size**)计算后的结果。 +``` storage_options_.options.max_bytes_for_level_base = g_pika_conf->level0_file_num_compaction_trigger() * g_pika_conf->write_buffer_size() - +``` 关键 PR: 添加 Floyd 的 compaction-filter 的 Gtest @@ -108,160 +164,212 @@ https://github.com/OpenAtomFoundation/pika/pull/2669 https://github.com/OpenAtomFoundation/pika/pull/2601 新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗 https://github.com/OpenAtomFoundation/pika/pull/2538 -1.6 可观测性 + +## **1.6 可观测性** + v3.5 版本增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标,但是在集群方面的可观测性是缺失的。v4.0.0 对 Codis-Proxy 的 P99、P999、延迟等监控指标进行采集和展示,可以直观地反映线上 Codis-proxy 的运行情况。 v4.0.0 开始还提供新的工具:根据 pika benchmark 工具压测结果自动生成可视化的统计图表。 关键 PR: -Codis 支持 info 命令, 可以通过该命令查询 Codis-proxy 的 info 信息 + +Codis 支持 info 命令,可以通过该命令查询 Codis-proxy 的 info 信息 + https://github.com/OpenAtomFoundation/pika/pull/2688 + Codis-proxy 新增 P99 P95 等监控耗时指标 + https://github.com/OpenAtomFoundation/pika/pull/2668 + 添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表 + https://github.com/OpenAtomFoundation/pika/pull/2663 -1.7 测试集 -PikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。v4.0.0 中丰富了诸多特性的 go test 功能,并进一步完善了基本数据类型的 TCL 测试。 +## **1.7 测试集** + +PikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。v4.0.0 中丰富了诸多特性的 go test 功能,并进一步完善了基本数据类型的 TCL 测试。 + 关键 PR: + 添加 Floyd 的 compaction-filter 的 Gtest + https://github.com/OpenAtomFoundation/pika/pull/2669 + Pika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷 + https://github.com/OpenAtomFoundation/pika/pull/2753 -1.8 跨平台 -PikiwiDB(Pika) 以往仅支持 centos 和 ubuntu 等 linux 平台,v3.5 开始支持 Mac 等平台。v4.0.0 将对 Mac 平台的支持扩展至 FreeBSD 平台。 + +## **1.8 跨平台** + +PikiwiDB(Pika) 以往仅支持 centos 和 ubuntu 等 linux 平台,v3.5 开始支持 Mac 等平台。v4.0.0 将对 Mac 平台的支持扩展至 FreeBSD 平台。 + 关键 PR: + Pika 支持在 FreeBSD14 平台上进行编译 + https://github.com/OpenAtomFoundation/pika/pull/2711 -2 改进列表 + +# **2 改进列表** + 下面详细列出了本次发版的主要功能升级和改进。 -2.1 新特性 - -+ Pika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷 - https://github.com/OpenAtomFoundation/pika/pull/2753 -+ Pika 支持在 FreeBSD14 平台上进行编译打包 - https://github.com/OpenAtomFoundation/pika/pull/2711 -+ Pika 线程整理,避免启动过多无用线程,对不同的线程进行命名,方便问题定位 - https://github.com/OpenAtomFoundation/pika/pull/2697 -+ Mget 支持多 key 查询缓存, 记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能 - https://github.com/OpenAtomFoundation/pika/pull/2675 -+ Codis 支持 info 命令, 可以通过该命令查询 Codis-proxy 的 info 信息 - https://github.com/OpenAtomFoundation/pika/pull/2688 -+ 添加 Floyd 的 compaction-filter 的 Gtest - https://github.com/OpenAtomFoundation/pika/pull/2669 -+ Codis-proxy 新增 P99 P95 等监控耗时指标 - https://github.com/OpenAtomFoundation/pika/pull/2668 -+ 添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表 - https://github.com/OpenAtomFoundation/pika/pull/2663 -+ Pika 主从复制新增监控指标 repl_connect_status, 可以更加明确清晰的确定当前的主从复制的状态 - https://github.com/OpenAtomFoundation/pika/pull/2638 -+ Pika 不支持不同类型的重复 key, 写入重复 key 返回非法类型 - https://github.com/OpenAtomFoundation/pika/pull/2609 -+ 添加支持分区索引过滤的功能 - https://github.com/OpenAtomFoundation/pika/pull/2601 -+ Pika 支持第三代存储引擎 Floyd, 通过支持多 rocksdb 实例、对 Blob 的使用进行优化、对过期数据的清理进行优化,提升了 Pika 实例的读写性能 - https://github.com/OpenAtomFoundation/pika/pull/2413 - -2.2 bug 修复 - -+ 修复 iter 未被析构,导致 pkpatternmatchdel 在返回之前不会删除 iter,这可能会导致 rocksdb 永远引用一个版本,导致数据不符合预期的问题 - https://github.com/OpenAtomFoundation/pika/pull/2785 -+ 修复 config 参数 min-blob-size 带单位时解析错误的问题 - https://github.com/OpenAtomFoundation/pika/pull/2767 -+ 修复 zverank 返回值异常的问题 - https://github.com/OpenAtomFoundation/pika/pull/2673 -+ 修复 Pika-port 传输数据过程中报错的问题 - https://github.com/OpenAtomFoundation/pika/pull/2758 -+ 修复因为堆上分配的缓冲区越界导致 Dbsize 命令运行时崩溃的问题 - https://github.com/OpenAtomFoundation/pika/pull/2749 -+ 修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题 - https://github.com/OpenAtomFoundation/pika/pull/2746 -+ 修复参数未初始化导致 slotsscan 等命令不能和 bgsave 命令相互制衡的问题 - https://github.com/OpenAtomFoundation/pika/pull/2745 -+ 修复 Slotmigrate 迁移数据的过程中,返回值设置错误,异常场景下会终止数据迁移的问题 - https://github.com/OpenAtomFoundation/pika/pull/2741 -+ 修复 Mget 没有使用解析 ttl 的函数导致出现部分key的ttl未被更新,数据不一致的问题 - https://github.com/OpenAtomFoundation/pika/pull/2730 -+ 修复 pkpatternmatchdel 命令使用错误导致的 stream 类型数据删除异常的问题 - https://github.com/OpenAtomFoundation/pika/pull/2726 -+ 修复 pkpatternmatchdel 不能正确删除掉对应的 keys 的问题 - https://github.com/OpenAtomFoundation/pika/pull/2717 -+ 修复 ACL 密码验证错误问题 - https://github.com/OpenAtomFoundation/pika/pull/2714 -+ 修复 Keyspace 命令未计算 Stream 类型数据的问题 - https://github.com/OpenAtomFoundation/pika/pull/2705 -+ 对部分命令定制化处理逻辑,避免写 binlog 导致从节点的 binlog 解析失败的问题 - https://github.com/OpenAtomFoundation/pika/pull/2793 -+ 修复 Pika cmdID 赋值在 Cmd 初始函数中,可能会导致并发构造的时候出现内存泄漏的问题 - https://github.com/OpenAtomFoundation/pika/pull/2692 -+ 修复 ExpectedStale 未考虑 String 类型, 如果存在已经过期的 String 类型的 key, ExpectedStale 会返回错误的问题 - https://github.com/OpenAtomFoundation/pika/pull/2682 -+ 修复 Spop 在写 binlog 时可能会出现竞态问题 - https://github.com/OpenAtomFoundation/pika/pull/2674 -+ db instance 设置不合理时,给用户错误提示 - https://github.com/OpenAtomFoundation/pika/pull/2672 -+ 修复 server_stat 中的数据竞态问题 - https://github.com/OpenAtomFoundation/pika/pull/2671 -+ 修复多 DB 下全量同步超时后不重试的问题 - https://github.com/OpenAtomFoundation/pika/pull/2667 -+ 修复多 DB 下全量同步超时后不重试的问题 - https://github.com/OpenAtomFoundation/pika/pull/2666 -+ 修复主从同步限速逻辑中重复解锁的问题 - https://github.com/OpenAtomFoundation/pika/pull/2657 -+ 发版支持自动打包 centos7 和 centos8 平台的二进制编译包 - https://github.com/OpenAtomFoundation/pika/pull/2535 -+ 修复 Codis 侧的 getrange 命令没有返回预期结果的问题 - https://github.com/OpenAtomFoundation/pika/pull/2510 - -2.3 提升改进项 - -+ 更新 Pika Docker Readme, 可以按照 Readme 在 Docker 中部署 Pika 服务 - https://github.com/OpenAtomFoundation/pika/pull/2743 -+ 优化重复查询 meta value 导致影响 Pika 服务读写性能的问题 - https://github.com/OpenAtomFoundation/pika/pull/2735 -+ 支持对更多的 RocksDB 参数进行动态调整,用户根据不同的业务使用场景调整参数提升 Pika 的读写性能 - https://github.com/OpenAtomFoundation/pika/pull/2728 -+ 对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操作与 String 操作明确区分开 - https://github.com/OpenAtomFoundation/pika/pull/2720 -+ 更新了 PR 标题验证,不允许在标题末尾出现中文字符 - https://github.com/OpenAtomFoundation/pika/pull/2718 -+ 重构主从复制模式 slave 节点的主从同步线程模型,尽可能减少 binlog 消费阻塞问题 - https://github.com/OpenAtomFoundation/pika/pull/2638 -+ 新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗 - https://github.com/OpenAtomFoundation/pika/pull/2538 - -2.4 发版 tag - - https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0 -3 社区 -感谢所有为 v4.0.0 做出贡献的社区成员,包括 issue/PR 提交者、代码 reviewer 【排名不分先后,依据字母序列】: - AlexStocks +## **2.1 新特性** + +- Pika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷 + https://github.com/OpenAtomFoundation/pika/pull/2753 + +- Pika 支持在 FreeBSD14 平台上进行编译打包 + https://github.com/OpenAtomFoundation/pika/pull/2711 + +- Pika 线程整理,避免启动过多无用线程,对不同的线程进行命名,方便问题定位 + https://github.com/OpenAtomFoundation/pika/pull/2697 + +- Mget 支持多 key 查询缓存,记录未命中的 key 去 DB 中查询,提升 Pika 服务的读性能 + https://github.com/OpenAtomFoundation/pika/pull/2675 + +- Codis 支持 info 命令,可以通过该命令查询 Codis-proxy 的 info 信息 + https://github.com/OpenAtomFoundation/pika/pull/2688 + +- 添加 Floyd 的 compaction-filter 的 Gtest + https://github.com/OpenAtomFoundation/pika/pull/2669 + +- Codis-proxy 新增 P99 P95 等监控耗时指标 + https://github.com/OpenAtomFoundation/pika/pull/2668 + +- 添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表 + https://github.com/OpenAtomFoundation/pika/pull/2663 + +- Pika 主从复制新增监控指标 repl_connect_status, 可以更加明确清晰的确定当前的主从复制的状态 + https://github.com/OpenAtomFoundation/pika/pull/2638 + +- Pika 不支持不同类型的重复 key, 写入重复 key 返回非法类型 + https://github.com/OpenAtomFoundation/pika/pull/2609 + +- 添加支持分区索引过滤的功能 + https://github.com/OpenAtomFoundation/pika/pull/2601 + +- Pika 支持第三代存储引擎 Floyd, 通过支持多 rocksdb 实例、对 Blob 的使用进行优化、对过期数据的清理进行优化,提升了 Pika 实例的读写性能 + https://github.com/OpenAtomFoundation/pika/pull/2413 + - baerwang +## **2.2 bug 修复** - chejinge +- 修复 iter 未被析构,导致 pkpatternmatchdel 在返回之前不会删除 iter,这可能会导致 rocksdb 永远引用一个版本,导致数据不符合预期的问题 + https://github.com/OpenAtomFoundation/pika/pull/2785 - cheniujh +- 修复 config 参数 min-blob-size 带单位时解析错误的问题 + https://github.com/OpenAtomFoundation/pika/pull/2767 - chienguo +- 修复 zverank 返回值异常的问题 + https://github.com/OpenAtomFoundation/pika/pull/2673 - guangkun123 +- 修复 Pika-port 传输数据过程中报错的问题 + https://github.com/OpenAtomFoundation/pika/pull/2758 - gukj-spel +- 修复因为堆上分配的缓冲区越界导致 Dbsize 命令运行时崩溃的问题 + https://github.com/OpenAtomFoundation/pika/pull/2749 - longfar-ncy +- 修复批量扩容时,多个 slave 同时连接 master, 短时间多次 bgsave 导致部分从节点数据不完整的问题 + https://github.com/OpenAtomFoundation/pika/pull/2746 - lqxhub +- 修复参数未初始化导致 slotsscan 等命令不能和 bgsave 命令相互制衡的问题 + https://github.com/OpenAtomFoundation/pika/pull/2745 - luky116 +- 修复 Slotmigrate 迁移数据的过程中,返回值设置错误,异常场景下会终止数据迁移的问题 + https://github.com/OpenAtomFoundation/pika/pull/2741 - Mixficsol +- 修复 Mget 没有使用解析 ttl 的函数导致出现部分 key 的 ttl 未被更新,数据不一致的问题 + https://github.com/OpenAtomFoundation/pika/pull/2730 + +- 修复 pkpatternmatchdel 命令使用错误导致的 stream 类型数据删除异常的问题 + https://github.com/OpenAtomFoundation/pika/pull/2726 + +- 修复 pkpatternmatchdel 不能正确删除掉对应的 keys 的问题 + https://github.com/OpenAtomFoundation/pika/pull/2717 + +- 修复 ACL 密码验证错误问题 + https://github.com/OpenAtomFoundation/pika/pull/2714 + +- 修复 Keyspace 命令未计算 Stream 类型数据的问题 + https://github.com/OpenAtomFoundation/pika/pull/2705 + +- 对部分命令定制化处理逻辑,避免写 binlog 导致从节点的 binlog 解析失败的问题 + https://github.com/OpenAtomFoundation/pika/pull/2793 + +- 修复 Pika cmdID 赋值在 Cmd 初始函数中,可能会导致并发构造的时候出现内存泄漏的问题 + https://github.com/OpenAtomFoundation/pika/pull/2692 + +- 修复 ExpectedStale 未考虑 String 类型,如果存在已经过期的 String 类型的 key, ExpectedStale 会返回错误的问题 + https://github.com/OpenAtomFoundation/pika/pull/2682 + +- 修复 Spop 在写 binlog 时可能会出现竞态问题 + https://github.com/OpenAtomFoundation/pika/pull/2674 + +- db instance 设置不合理时,给用户错误提示 + https://github.com/OpenAtomFoundation/pika/pull/2672 + +- 修复 server_stat 中的数据竞态问题 + https://github.com/OpenAtomFoundation/pika/pull/2671 + +- 修复多 DB 下全量同步超时后不重试的问题 + https://github.com/OpenAtomFoundation/pika/pull/2667 + +- 修复多 DB 下全量同步超时后不重试的问题 + https://github.com/OpenAtomFoundation/pika/pull/2666 + +- 修复主从同步限速逻辑中重复解锁的问题 + https://github.com/OpenAtomFoundation/pika/pull/2657 + +- 发版支持自动打包 centos7 和 centos8 平台的二进制编译包 + https://github.com/OpenAtomFoundation/pika/pull/2535 + +- 修复 Codis 侧的 getrange 命令没有返回预期结果的问题 + https://github.com/OpenAtomFoundation/pika/pull/2510 + +## **2.3 提升改进项** + +- 更新 Pika Docker Readme, 可以按照 Readme 在 Docker 中部署 Pika 服务 + https://github.com/OpenAtomFoundation/pika/pull/2743 + +- 优化重复查询 meta value 导致影响 Pika 服务读写性能的问题 + https://github.com/OpenAtomFoundation/pika/pull/2735 + +- 支持对更多的 RocksDB 参数进行动态调整,用户根据不同的业务使用场景调整参数提升 Pika 的读写性能 + https://github.com/OpenAtomFoundation/pika/pull/2728 + +- 对 HyperLogLog 和 String 进行类型隔离,确保 HyperLogLog 操作与 String 操作明确区分开 + https://github.com/OpenAtomFoundation/pika/pull/2720 + +- 更新了 PR 标题验证,不允许在标题末尾出现中文字符 + https://github.com/OpenAtomFoundation/pika/pull/2718 + +- 重构主从复制模式 slave 节点的主从同步线程模型,尽可能减少 binlog 消费阻塞问题 + https://github.com/OpenAtomFoundation/pika/pull/2638 + +- 新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗 + https://github.com/OpenAtomFoundation/pika/pull/2538 + +## 2.4 发版 tag + +​ https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0 + +# **3 社区** + +感谢所有为 v4.0.0 做出贡献的社区成员,包括 issue/PR 提交者、代码 reviewer 【排名不分先后,依据字母序列】: - saz97 - - wangshao1 +- AlexStocks +- baerwang +- chejinge +- cheniujh +- chienguo +- guangkun123 +- gukj-spel +- longfar-ncy +- lqxhub +- luky116 +- Mixficsol +- saz97 +- wangshao1 PikiwiDB (Pika) 开源社区热烈欢迎您的参与和支持。如果您有任何问题、意见或建议,请扫码添加 PikiwiDB 小助手【微信号: PikiwiDB】为好友,它会拉您加入官方微信群。 -![2024-07-08-PikiwiDB(Pika)-4.0.0-connect](2024-07-08-PikiwiDB(Pika)-4.0.0-connect.png) \ No newline at end of file