28Pika:如何基于SSD实现大容量Redis?基

基本概念

  • 基于大内存的大容量实例在实例恢复、主从同步过程中会引起一系列潜在问题

    • 例如:恢复时间增长
    • 主从切换开销大
    • 缓冲区易溢出
  • 360 公司 DBA 和基础架构组联合开发的 Pika\

  • pika目标(使用ssd平滑替代redis)\

    • 单实例可以保存大容量数据,同时避免了实例恢复和主从同步时的潜在问题\

    • 和 Redis 数据类型保持兼容,可以支持使用 Redis 的应用平滑地迁移到 Pika 上

大内存Redis实例的潜在问题

  • 大内存的潜在问题

    • RDB生成恢复效率低  快照

      • fork时间久,导致主线程阻塞
      • 可能造成swap 内存换到磁盘
    • 全量同步时长增加、缓冲区易溢出

      • 全量同步 RDB文件很大导致全量同步时长增加
      • 主从切换的过程耗时增加,同样会影响业务的可用性

Pika整体架构

  • 整体架构

    • 网络框架
    • Pika线程模块
    • Nemo存储模块
    • RocksDB
    • binlog
  • 网络框架

    • 功能:负责底层网络请求的接收和发送

    • 实现:

      • 对操作系统底层的网络函数进行了封装 socket

      • Pika 线程模块采用了多线程模型来具体处理客户端请求\

        • 请求分发线程(DispatchThread)\

        • 一组工作线程(WorkerThread)(将请求封装成task)\

        • 线程池(ThreadPool)\

    • 调优:增加工作线程数和线程池的线程数

  • Nemo

    • 实现了 Pika 和 Redis 的数据类型兼容,降低Pika的学习成本
  • binlog

    • 记录写命令,用于主从节点的命令同步(避免大内存复制,命令比数据小很多)\

Pika 如何基于 SSD 保存更多数据?

  • 基本概念:使用了业界广泛应用的持久化键值数据库RocksDB

  • RocksDB的读写机制(不会占据太大的内存空间)\

    • RocksDB会使用两小块内存空间来交替缓存写入的数据(Memtable1,Memtable2)\

      • 一般为几MB,几十MB
    • 优先写入Memtable1,Memtable1则写入SSD中

    • 此时Memtable2将代替Memtable1

    • 等待Memtable1数据都写完且Memtable2写满,则切换到Memtable1

  • 为什么pika不会出现大文件同步的效率和内存溢出的问题

    • 基于 RocksDB 保存了数据文件,不需要再通过内存快照进行恢复了\

    • 实现增量命令同步,既节省了内存,还避免了缓冲区溢出的问题\

  • pika的优势

    • Pika 使用 RocksDB 把大量数据保存到了 SSD,同时避免了内存快照的生成和恢复问题\

    • Pika 使用 binlog 机制进行主从同步,避免大内存时的影响\

\

Pika 如何实现 Redis 数据类型兼容?

  • 基本概念:RocksDB 只提供了单值的键值对类型,只满足redis的string数据结构

  • Nemo 模块就负责把 Redis 的集合类型转换成单值的键值对\

    • redis集合类型

      • List 和 Set 类型,它们的集合中也只有单值\

      • Hash(field-value) 和 Sorted Set(member-score ) 类型,它们的集合中的元素是成对的\

    • list的转换

      • key:保证多位组成有意义 保存在list的顺序
      • value:前继和后继元素,存活时间,值,版本,存活时间
    • set的转换

      • key:保存set的key和value
      • value:保存版本和存活时间
    • hash的转换

      • key:size hashkey field1
      • value:value1,field2,value2.....
    • zset

      • 类似hash,不过会根据score进行排序

list的转化

\

Pika 的其他优势与不足

  • pika的优点

    • 实例重启快 直接从ssd中获取数据,不需要回放数据\

    • 执行全量同步的风险低,使用binlog(磁盘)实现增量同步,不必担心缓冲区大小的限制

    • 多线程模型,降低了读写ssd对pika的性能影响

  • pika的缺点

    • 访问性能低于redis

      • 将存储从缓存从内存转移到ssd
      • 记录binlog会降低效率
      • 个人感觉数据结构效率很低
  • 适用场景:保存大容量数据是我们的首要需求,那么,Pika 是一个不错的解决方案

\

总结

  • pika优点

    • 既支持 Redis 操作接口,又能支持保存大容量的数据\

    • 支持迁移redis

  • 调优

    • 增加线程数据量,提升并发请求处理能力
    • 使用高配的SSD,提升SSD自身访问性能
  • redis迁移pika

    • Redis 数据迁移到 Pika\

      • aof_to_pika -i [Redis AOF文件] -h [Pika IP] -p [Pika port] -a [认证信息]
    • 把 Redis 请求转发给 Pika\

  • github.com/Qihoo360/pi…\

\