Pika服务 - Wangxiaoman/tech-note GitHub Wiki
Pika是什么
Pika是一个可持久化的大容量redis存储服务,兼容string、hash、list、zset、set的绝大部分接口(兼容详情),解决redis由于存储数据量巨大而导致内存不够用的容量瓶颈。Pika的存储引擎为rocksdb,复合结构是利用string类型来实现的
github地址
https://github.com/Qihoo360/pika
安装方式
https://github.com/Qihoo360/pika/wiki/%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8
pika整体架构图
- 使用redis protocol,这意味着可以直接使用redis client
- 命令通过redis protocol协议处理之后传输到ProcessLayer
- 将命令写入binlog文件
- 数据写入Blackwidow storage中
- Blackwidow 是对rocksdb的封装,以支持list、set、zset、map的数据存储结构(几种数据结构的实现方式),因为都是利用kv存储的变种来实现的复合结构,所以在性能上一定有损失,需要根据实际情况来使用
pika的目录结构
-
在pika.conf文件中可以指定具体位置
-
db目录:存放所有的数据文件,按照数据类型分不同的文件夹
-
log目录:mainfest文件(rocksdb的信息文件),警告,错误,一般日志文件,binlog文件
-
dump目录:快照文件
-
pid:pid文件
-
dbsync:主从同步时存放全量同步所需的文件
pika的线程模型
- pika使用多线程模型,使用多个工作线程来读写,由Blackwidow引擎保证线程安全,共有12种线程
- PikaServer:主线程
- DispatchThread :监听端口,接收用户的连接请求
- WorkThread:存在多个线程(根据配置 thread-num),将多个用户客户端连接中的命令封装成Task扔到ThreadPool中
- ThreadPool:存在多个线程(根据配置 thread-pool-size),执行task(读写db,写binlog)
- PikaAuxiliaryThread:辅助线程,处理同步过程中,状态机的切换、心跳、主从超时等
- MonitorThread:执行monitor的client会挂在这个线程上,所有的执行命令会返回给挂在这个线程的客户端
- KeyScanThread:处理scan的统计命令
- BgsaveThread:处理bgsave
- PurgeThread:处理过期key
- PubsubThread:处理pubsub
- PikaReplClient:
- PikaReplServer:
pika最佳实践
- 线程数配置建议和cpu核数一致,如果单机多实例,不建议低于cpu核数的一半
- 主从服务器性能尽量一致
- 复合数据结构,建议field不要超过1w个(因为都是使用简单string结构来处理的,过大会是性能陡降)
- root-connection-num是独立的(127.0.0.1登录的连接数),这样保证不会像redis那样,连接打满之后,完全无法访问来处理问题
- 对于查询整个库的key的数量,使用info keyspace,该值是缓存上次的结果,需要计算新值,使用info keyspace 1
- 注意dump的配置,bgsave每天只存储一个文件,默认dump-exipre为不过期,实际使用注意该值的配置(如果需要定时做bgsave的话)