28 | Pika:如何基于SSD实现大容量Redis?
蒋德钧

你好,我是蒋德钧。
我们在应用 Redis 时,随着业务数据的增加(比如说电商业务中,随着用户规模和商品数量的增加),就需要 Redis 能保存更多的数据。你可能会想到使用 Redis 切片集群,把数据分散保存到多个实例上。但是这样做的话,会有一个问题,如果要保存的数据总量很大,但是每个实例保存的数据量较小的话,就会导致集群的实例规模增加,这会让集群的运维管理变得复杂,增加开销。
你可能又会说,我们可以通过增加 Redis 单实例的内存容量,形成大内存实例,每个实例可以保存更多的数据,这样一来,在保存相同的数据总量时,所需要的大内存实例的个数就会减少,就可以节省开销。
这是一个好主意,但这也并不是完美的方案:基于大内存的大容量实例在实例恢复、主从同步过程中会引起一系列潜在问题,例如恢复时间增长、主从切换开销大、缓冲区易溢出。
那怎么办呢?我推荐你使用固态硬盘(Solid State Drive,SSD)。它的成本很低(每 GB 的成本约是内存的十分之一),而且容量大,读写速度快,我们可以基于 SSD 来实现大容量的 Redis 实例。360 公司 DBA 和基础架构组联合开发的 Pika键值数据库,正好实现了这一需求。
Pika 在刚开始设计的时候,就有两个目标:一是,单实例可以保存大容量数据,同时避免了实例恢复和主从同步时的潜在问题;二是,和 Redis 数据类型保持兼容,可以支持使用 Redis 的应用平滑地迁移到 Pika 上。所以,如果你一直在使用 Redis,并且想使用 SSD 来扩展单实例容量,Pika 就是一个很好的选择。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Redis 核心技术与实战》,新⼈⾸单¥68
《Redis 核心技术与实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(30)
- 最新
- 精选
- Roy LiangSSD使用寿命和擦写次数相关,我们有的业务数据量和访问量特别大,使用SSD一年就得换了,这样实际成本降不下来。所以,请问有没有可能开发一套混合存储系统,热数据存储而不是缓存在Redis,冷数据存储在Pika,Redis中的热数据淘汰时,自动写入Pika,Pika的冷数据加载时,自动写入Redis,这样业务代码几乎就不用做数据一致性维护相关的内容。不知道这个系统是否存在可行性?其中的技术风险可能在哪里?
作者回复: 这个方案是可行的,相当于冷热分层存储了,而且Pika和Redis的数据模型兼容,所以数据迁移起来会比较方便直接。 我想到的关键技术问题:1. 数据冷热的区分方法,这有点类似于缓存算法,把经常访问的数据要能够筛选出来;2. 数据的迁移开销,数据迁移时需要避免对Redis前端读写请求的阻塞,开发这个系统时可能要考虑使用额外线程来迁移Redis数据;3. 数据迁移时数据读写正确性的保证,例如数据正在迁移,是否还能正常读写。
429 - 杨逸林Redis 服务器有没有必要上 ECC 内存? 还有如果那个 Memtable 有没有极端情况,Memtable1 还在写入 SSD,Memtable2 已经满了,这怎么办?虽然写入 SSD 很快,我是说如果。 binlog 机制在 MySQL 那已经玩烂了。。。
作者回复: ECC内存是需要的,Redis数据都在内存中,如果内存出错,会有影响的。 关于Memtable的问题是个好问题。在你说的情况下,Memtable1还在写SSD,Memtable2已经满了,此时相当于有两个Memtable要刷盘,RocksDB会对前端的写进行限速。 RocksDB中有个配置项是max_write_buffer_number,如果需要往盘上刷的memtable大于这个配置项,就会进行写限速了。
45 - 游弋云端可以考虑内存、SSD、HDD做分级存储,当前这对系统要求就更高了,需要识别数据的冷温热,再做不同介质间的动态迁移,甚至可以做一些访问预测来做预加载和调级。
作者回复: 分级存储时,数据的冷热度识别是一个主要要考虑的问题。通常可以用缓存算法策略来筛选冷热数据,目前也有些尝试是用机器学习的方法来预测数据冷热度,进而再放到不同的介质中。
3 - Mr.蜜只要能区分出冷热数据,启用机械硬盘作为一部分存储介质也是一个可取的方案。
作者回复: 如果用机械硬盘,考虑到机械硬盘的毫秒级别延迟,数据访问速度会比较慢,会拖慢前端应用的响应。一般还是建议用SSD更好些。
- dfuru使用机械硬盘作为实例容量扩展: 1. 在pika的解决方案中,当写满一个memtable时,切换memtable,将写满的memtable中的数据已文件的形式持久化到硬盘上。 硬盘具体是SSD、机械硬盘还是NVME,都可以。 2. 使用机械硬盘,容量更大,价格更便宜,读写性能更低。大量数据访问机械盘时,磁盘IO是主要瓶颈。
作者回复: 机械硬盘作为容量扩展是可以的,不过机械硬盘的性能慢,会是潜在问题。另外,现在SSD的容量也可以做到很大,当然容量的性价比还是比不上机械硬盘。
- Kaito是否可以使用机械硬盘作为Redis的内存容量的扩展? 我觉得也是可以的。机械硬盘相较于固态硬盘的优点是,成本更低、容量更大、寿命更长。 1、成本:机械硬盘是电磁存储,固态硬盘是半导体电容颗粒组成,相同容量下机械硬盘成本是固态硬盘的1/3。 2、容量:相同成本下,机械硬盘可使用的容量更大。 3、寿命:固态硬盘的电容颗粒擦写次数有限,超过一定次数后会不可用。相同ops情况下,机械硬盘的寿命要比固态硬盘的寿命更长。 但机械硬盘相较于固态硬盘的缺点也很明显,就是速度慢。 机械硬盘在读写数据时,需要通过转动磁盘和磁头等机械方式完成,而固态硬盘是直接通过电信号保存和控制数据的读写,速度非常快。 如果对于访问延迟要求不高,对容量和成本比较关注的场景,可以把Pika部署在机械硬盘上使用。 另外,关于Pika的使用场景,它并不能代替Redis,而是作为Redis的补充,在需要大容量存储(50G数据量以上)、访问延迟要求不苛刻的业务场景下使用。在使用之前,最好是根据自己的业务情况,先做好调研和性能测试,评估后决定是否使用。6107
- neohope用机械硬盘阵列来做缓存,其实没有必要,速度太慢了: 1、用redis来做缓存,就是因为mysql慢,所以加了一层 2、redis比mysql快的最根本原因,不是redis技术强悍,而是内存比磁盘快 3、mysql本身就是把热数据放到内存里,冷数据存到磁盘阵列上,并且做了很多数据查找的优化 4、pika利用的是SSD比磁盘快,比内存便宜,才找到了自己的生存空间,其根本原因也不是RocksDB技术先进; 5、Pika的用磁盘做缓存,从磁盘上查找记录,比mysql也快不了太多,解决不了什么问题,而且还引入了新的故障点,没有太多价值122
- 孔祥鑫有个地方没搞明白,读ssd上的数据文件,和redis读rdb文件相比,两者都是文件,为什么会比redis快呢48
- Geek_9a0c9fpika从性能上比当然不然redis,但是它你补了redis几个不足,那么pika在真是项目中都应用在什么场景呢?,与ssd的mysql比优势在哪里?除了o(1)的操作。6
- Q, Qpika实际是使用ssd提高性能,那还不如把redis层去掉,mysql直接上ssd岂不是更加方便?45
收起评论