基本概念
-
基于大内存的大容量实例在实例恢复、主从同步过程中会引起一系列潜在问题
- 例如:恢复时间增长
- 主从切换开销大
- 缓冲区易溢出
-
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\
-
\
近期评论