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整体架构图

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的话)