# pika **Repository Path**: lfjking/pika ## Basic Information - **Project Name**: pika - **Description**: https://github.com/OpenAtomFoundation/pika - **Primary Language**: Unknown - **License**: BSD-3-Clause - **Default Branch**: unstable - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-01-05 - **Last Updated**: 2024-01-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Pika ## Pika简介 [English](https://github.com/Qihoo360/pika/blob/master/README.md) Pika 是一个以 RocksDB 为存储引擎的的大容量、高性能、多租户、数据可持久化的弹性 KV 数据存储系统,完全兼容 Redis 协议,支持其常用的数据结构,如 string/hash/list/zset/set/geo/hyperloglog/pubsub/bitmap/stream 等 [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)。 Redis 的内存使用了超过 16GiB 时,会面临内存容量有限、单线程阻塞、启动恢复时间长、内存硬件成本贵、缓冲区容易写满、一主多从故障时切换代价大等问题。Pika 的出现并不是为了替代 Redis, 而是 Redis 补充。Pika 力求在完全兼容Redis 协议、继承 Redis 便捷运维设计的前提下,通过持久化存储的方式解决了 Redis 一旦存储数据量巨大就会出现内存容量不足的瓶颈问题,并且可以像 Redis 一样,支持使用 slaveof 命令实现主从模式,还支持数据的全量同步和增量同步。 还可以通过 twemproxy or [Codis](https://github.com/OpenAtomFoundation/pika/tree/unstable/cluster) 以静态数据分片方式实现 Pika 集群。 ## Pika特性 * 协议兼容:完全兼容 Redis 协议,且极力追求高性能、大容量、低成本、大规模 * 数据结构:支持 Redis 的常用数据结构 String、Hash、List、Zset、Set、Geo、Hyperloglog、Pubsub、Bitmap、Stream、ACL etc * 冷热数据:对热数据做缓存,将全量数据持久化存储到 RocksDB,并且实现冷热分级存储 * 极大容量:相比于 Redis 的内存存储方式,Pika 支持百 GB 的数据量级,能极大减少服务器资源占用,增强数据的可靠性 * 部署方式:单机主从模式(slaveof)和 Codis 集群模式,扩缩容简单 * 迁移简单:不用修改代码即可平滑从 Redis 迁移到 Pika * 便于运维:完善的[运维](https://github.com/OpenAtomFoundation/pika/wiki/pika%E7%9A%84%E4%B8%80%E4%BA%9B%E7%AE%A1%E7%90%86%E5%91%BD%E4%BB%A4%E6%96%B9%E5%BC%8F%E8%AF%B4%E6%98%8E)命令文档 ## Pika解决的问题及应用场景 Pika 力求在完全兼容 Redis 协议、 继承 Redis 便捷运维设计的前提下, 通过持久化存储的方式解决 Redis 在大容量场景下的问题, 如:  ## Pika架构之存储引擎 * 支持多平台 CentOS、Ubuntu、macOS * 多线程模型 * 基于 RocksDB 的存储引擎 * 多粒度数据缓存模型  ## 部署模式 ### 1、主从模式 * 架构与 Redis 类似 * 与 Redis 协议和数据结构兼容良好 * 每种数据结构使用一个 RocksDB 实例 * 主从采用 Binlog 异步复制方式  ### 2、分布式集群模式 * 采用 Codis 架构,支持多 group * 单 group 内是一个主从集 * 以 group 为单位进行弹性伸缩  ## Pika用户展示
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
> 注:
> 横轴表示 Pika 线程数,纵轴表示 QPS,value 为128字节。
> set3/get7 表示 30% 的 set 和 70% 的 get。
* ##### 案例一结论
从上图可以看出,Pika 的 worker 线程数设置为 20~24 比较划算。
#### 3.2 案例二
* ##### 测试目的
测试在最佳 worker 线程数(20线程)下,Pika 的 RTT 表现。
* ##### 测试条件
* Pika数据容量:800G
* value:128字节
* ##### 测试结果
```c
====== GET ======
10000000 requests completed in 23.10 seconds
200 parallel clients
3 bytes payload
keep alive: 1
99.89% <= 1 milliseconds
100.00% <= 2 milliseconds
100.00% <= 3 milliseconds
100.00% <= 5 milliseconds
100.00% <= 6 milliseconds
100.00% <= 7 milliseconds
100.00% <= 7 milliseconds
432862.97 requests per second
```
```c
====== SET ======
10000000 requests completed in 36.15 seconds
200 parallel clients
3 bytes payload
keep alive: 1
91.97% <= 1 milliseconds
99.98% <= 2 milliseconds
99.98% <= 3 milliseconds
99.98% <= 4 milliseconds
99.98% <= 5 milliseconds
99.98% <= 6 milliseconds
99.98% <= 7 milliseconds
99.98% <= 9 milliseconds
99.98% <= 10 milliseconds
99.98% <= 11 milliseconds
99.98% <= 12 milliseconds
99.98% <= 13 milliseconds
99.98% <= 16 milliseconds
99.98% <= 18 milliseconds
99.99% <= 19 milliseconds
99.99% <= 23 milliseconds
99.99% <= 24 milliseconds
99.99% <= 25 milliseconds
99.99% <= 27 milliseconds
99.99% <= 28 milliseconds
99.99% <= 34 milliseconds
99.99% <= 37 milliseconds
99.99% <= 39 milliseconds
99.99% <= 40 milliseconds
99.99% <= 46 milliseconds
99.99% <= 48 milliseconds
99.99% <= 49 milliseconds
99.99% <= 50 milliseconds
99.99% <= 51 milliseconds
99.99% <= 52 milliseconds
99.99% <= 61 milliseconds
99.99% <= 63 milliseconds
99.99% <= 72 milliseconds
99.99% <= 73 milliseconds
99.99% <= 74 milliseconds
99.99% <= 76 milliseconds
99.99% <= 83 milliseconds
99.99% <= 84 milliseconds
99.99% <= 88 milliseconds
99.99% <= 89 milliseconds
99.99% <= 133 milliseconds
99.99% <= 134 milliseconds
99.99% <= 146 milliseconds
99.99% <= 147 milliseconds
100.00% <= 203 milliseconds
100.00% <= 204 milliseconds
100.00% <= 208 milliseconds
100.00% <= 217 milliseconds
100.00% <= 218 milliseconds
100.00% <= 219 milliseconds
100.00% <= 220 milliseconds
100.00% <= 229 milliseconds
100.00% <= 229 milliseconds
276617.50 requests per second
```
* ##### 案例二结论
get/set 响应时间 99.9% 都在 2ms 以内。
#### 3.3 案例三
* ##### 测试目的
在 Pika 最佳的 worker 线程数下,查看各命令的极限QPS。
* ##### 测试条件
* Pika 的 worker 线程数:20
* key 数量:10000
* field 数量:100(list除外)
* value:128字节
* 命令执行次数:1000万(lrange 除外)
* ##### 测试结果
```c
PING_INLINE: 548606.50 requests per second
PING_BULK: 544573.31 requests per second
SET: 231830.31 requests per second
GET: 512163.91 requests per second
INCR: 230861.56 requests per second
MSET (10 keys): 94991.12 requests per second
LPUSH: 196093.81 requests per second
RPUSH: 195186.69 requests per second
LPOP: 131156.14 requests per second
RPOP: 152292.77 requests per second
LPUSH (needed to benchmark LRANGE): 196734.20 requests per second
LRANGE_10 (first 10 elements): 334448.16 requests per second
LRANGE_100 (first 100 elements): 50705.12 requests per second
LRANGE_300 (first 300 elements): 16745.16 requests per second
LRANGE_450 (first 450 elements): 6787.94 requests per second
LRANGE_600 (first 600 elements): 3170.38 requests per second
SADD: 160885.52 requests per second
SPOP: 128920.80 requests per second
HSET: 180209.41 requests per second
HINCRBY: 153364.81 requests per second
HINCRBYFLOAT: 141095.47 requests per second
HGET: 506791.00 requests per second
HMSET (10 fields): 27777.31 requests per second
HMGET (10 fields): 38998.52 requests per second
HGETALL: 109059.58 requests per second
ZADD: 120583.62 requests per second
ZREM: 161689.33 requests per second
PFADD: 6153.47 requests per second
PFCOUNT: 28312.57 requests per second
PFADD (needed to benchmark PFMERGE): 6166.37 requests per second
PFMERGE: 6007.09 requests per second
```
* ##### 结论
整体表现很不错,个别命令表现较弱(LRANGE,PFADD,PFMERGE)。
#### 3.4 案例四
* ##### 测试目的
Pika 与 Redis 的极限 QPS 对比。
* ##### 测试条件
* Pika 的 worker 线程数:20
* key 数量:10000
* field 数量:100(list除外)
* value:128字节
* 命令执行次数:1000万(lrange 除外)
* Redis 版本:3.2.0
* ##### 测试结果
## 可观测性
### Metrics
* 1. Pika Server Info:系统架构、IP、端口、run_id、配置文件等
* 2. Pika Data Info:DB 大小、日志大小、内存使用情况等
* 3. Pika ClientsInfo:连接的客户端
* 4. Pika Stats Info:compact、slot等状态信息
* 5. Pika Network Info:客户端和主从复制的传入和传出流量以及速率
* 6. Pika CPU Info:CPU使用情况
* 7. Pika Replication Info:主从复制的状态信息,binlog 信息等
* 8. Pika Keyspace Info:五种数据类型的 Key 信息
* 9. Pika Command Exec Count Info:命令执行计数
* 10. Pika Command Execution Time:命令执行耗时
* 11. RocksDB Metrics:五种数据类型的 RocksDB 信息,包括 Memtable、Block Cache、Compaction、SST File、Blob File 等。
详细请参考 [指标 Metrics](tools/pika_exporter/README.md)。
## 文档
* [wiki](https://github.com/OpenAtomFoundation/pika/wiki)
* release notes
- [What's new in Pika v3.5.2](https://my.oschina.net/dubbogo/blog/10315913)
- [What's new in Pika v3.5.1](https://my.oschina.net/dubbogo/blog/10114890)
- [What's new in Pika v3.5.0](https://mp.weixin.qq.com/s/NNnmd0RtQ-vx9arW9YBcBA)
## 联系方式

* [Slack Channel](https://join.slack.com/t/w1687838400-twm937235/shared_invite/zt-1y72dch5d-~9CuERHYUSmfeJZh32Z~qQ)
* QQ群:294254078