类 Redis 存储系统 Pika 架构设计

Pika 是 360 基础架构团队和 DBA 团队联合研发的一款高效、稳定、简单可依赖的开源的 NoSQL 数据库产品。彻底兼容 Redis 协议,支持 5 种数据结构(string,hash,list,set,zset),数据持久化到 RocksDB,相比于 Redis 内存的存储方式,能极大减小服务器资源的占用,加强了数据的可靠性。能够采用单机和集群两种模式部署。Pika 项目 2015 年启动,随后在 Github 上开源,现有 3700 stars,35个 contributors,社区有大量的线上业务使 Pika算法

对比 Redis

存储容量: Redis 存储到内存,硬件成本高,宕机恢复延迟高;Pika 借用 RocksDB 存储到磁盘,单台服务器所容纳的数据量是 Redis 的几十倍,宕机恢复速度快。数据库

吞吐量: Redis QPS 更高,单台服务器百万级的 QPS;Pika QPS 相对较低,单服务器几十万,Redis 是 Pika 的 3~5 倍。服务器

访问延迟: Redis 应该在 1ms 之内;Pika 延迟稍高,3ms 之内。数据结构

运维部署: Redis 支持单机主从和集群两种方式; Pika 也支持两种方式部署。架构

适用场景

若是业务场景数据量比较大(> 50GB),数据可靠性要求高,那么 Pika 能够解决的问题。运维

场景1:大规模数据处理系统的中间结果存储分布式

场景2:使用 Redis/Redis Cluster 作持久化存储的业务系统性能

场景3:大型分布式系统的元数据存储spa

架构设计

Pika 能够经过配置文件中的 instance-mode 配置项,设置为 classic 和 sharding,来选择运行经典模式(Classic)仍是分布式模式(Sharding)的 Pika。架构设计

  • 经典模式架构

经典模式(Classic): 即1主N从同步模式,1 个主实例存储全部的数据,N 个从实例彻底镜像同步主实例的数据,每一个实例支持多个 DBs。DB 默认从 0 开始,Pika 的配置项 databases 能够设置最大 DB 数量。DB 在 Pika 上的物理存在形式是一个文件目录。

  • 分布式模式架构

分布式模式(Sharding): Sharding 模式下,将用户存储的数据集合称为 Table,每一个 Table 切分红多个分片,每一个分片称为 Slot,对于某一个 KEY 的数据由哈希算法计算决定属于哪一个 Slot。将全部 Slots 及其副本按照必定策略分散到全部的 Pika 实例中,每一个 Pika 实例有一部分主 Slot 和一部分从 Slot。在 Sharding 模式下,分主从的是 Slot 而再也不是 Pika 实例。Slot 在 Pika 上的物理存在形式是一个文件目录。

总结

Pika 项目普遍应用到 360 内部和社区的重要项目中,节省了大量的资源。3.0 版本以后除了提升稳定性和性能以外,最主要的功能是支持了分布式,能够知足大规模的业务场景。