摘要: 背景 Redis作为一款简洁、高效的开源K/V数据库,可以被用于内存缓存、持久化存储等不同场景,大量服务于各类互联网应用。同时也提供了丰富的功能配置,客户可以根据各自业务需求,在读写性能、缓存容量、数据可靠性等方面作出灵活的选择。

背景

Redis作为一款简洁、高效的开源K/V数据库,可以被用于内存缓存、持久化存储等不同场景,大量服务于各类互联网应用。同时也提供了丰富的功能配置,客户可以根据各自业务需求,在读写性能、缓存容量、数据可靠性等方面作出灵活的选择。

Redis提供了RDB和AOF两种持久化方式供选择,4.0中更是引入了RDB-AOF混合持久化的方式,整合RDB和AOF的优势,提供更实时的数据持久化保证、更快的恢复速度和更紧凑的空间使用。针对AOF的写入,Redis提供了两种选项供选择:

• always:aoflog实时写入落盘,保证写入数据的安全性,但写入性能下降严重。

• everysec:buffer写入aoflog,后台定期刷盘,可以很好的保证写入性能,但在failure场景下,需要承担秒级新写入数据丢失的风险。

这两种模式需要用户在性能和数据安全性之间做出取舍,鱼和熊掌无法兼得。对一些对数据安全性有更高要求的场景,需要应用层协同来保证数据安全,会给系统设计和实现带来一定的复杂度。另一方面,在Redis发生failover的时候,会有一个缓存预热重建的过程,期间对应用会有一个可感知的不可服务时间、以及访问延时抖动。

关于上述问题,很重要的一个原因在于目前DRAM和SSD(请忽略HDD)之间巨大的性能鸿沟。近几年,备受学术界和工业界关注的NVM(Non-volatile Memory) 技术,给这类问题的解决带来了新的机遇。

图1:NVM产品的存储层次结构

目前已有的NVM产品,对上层应用提供DIMM形态的访问接口。作为一种NVM设备,相比于DRAM具备掉电不丢数据的特性,容量上也会比DRAM高出一个数量级,成本优势明显。相比于传统SSD,不但读写速度更快(百ns量级),而且具备字节寻址的能力。同时也要看到,NVM产品仍然存在读写不对称、顺序和随机访问不对称等特征。

从应用场景上来看,NVM产品可以定位于替代部分DRAM功能,支撑持久Memory或In-Memory应用。具体来说可被应用在如下场景:

• 持久化内存:作为数据持久层,对数据一致性要求很高的持久化系统,同时兼顾数据可靠性和数据读写性能。

• 内存数据库:作为数据In Place空间,提供数据运行和持久化存储空间。

• 系统日志卷作为日志卷,例如,在HPC系统中通常采用Checkpointing实现对计算中间状态进行持久化保存,这是一个耗时、耗系统吞吐量的过程。

基于NVM产品提供的字节寻址、持久化、高性能的能力,以及考虑到其读写、顺序和随机访问不对称等特性,对Redis作了细致的设计和深度的定制化改造,针对上面几个问题取得非常好的测试效果。

性能分析

前面提到Redis的always模式通过实时flush操作确保AOF文件的实时持久化,但这会导致性能大幅下降。Everysec模式通过大幅减少flush操作的频率,基于page cache缓冲对设备的读写访问大幅提升QPS性能,但是这会引入秒级的数据丢失风险。而基于NVM产品提供的持久化能力可以非常优雅地解决这个问题,兼顾性能和可靠性。整个的数据流图如下:

图2: 基于NVM产品的数据读写流程

首先将AOF文件直接放在基于NVM产品的PMEM-aware filesystem上(比如EXT4 DAX模式),通过mmap将AOF文件映射到用户态地址空间,之后对AOF的访问操作就变成了非常轻量的直接load/store方式,而且要确保数据持久化也仅需要在用户态执行persist操作(主要是cache flush)。可见,基于NVM产品的AOF持久化机制相比传统的IO栈要轻量的多:

B• Bypass整个传统IO栈(Block层->设备驱动等),实现直接load/store操作。

• 通过cache flush操作即可实现持久化,取代了flush系统调用。

AOF机制的另一个问题是AOF文件的持续增大会造成巨大的空间浪费,所以阿里云Redis团队通过后台线程的方式按照一定的策略(考虑吞吐和资源占用量等)对AOF文件进行replay操作。即根据AOF命令在NVM产品上构造持久化的KV数据结构,然后完成回放的AOF文件就可以删除,从而解决了AOF占用空间的问题。

之所以选择后台线程异步replay的方式在NVM上构建持久化数据结构,是因为该过程需要通过事务操作来保证写操作的原子性和数据结构的一致性,耗时较大,所以数据先写到DDR的方式可以保证客户端写操作的QPS不下降。考虑到NVM拥有出色的读性能,数据异步replay到NVM之后,会根据数据冷热和内存占用量释放部分value比较大的内存副本,转而直接基于NVM提供读服务。所以DRAM逐渐演变为NVM的写cache和热数据的读cache,以充分发挥NVM的读性能和成本优势,同时规避NVM写性能(相对)的短板问题。

在两台96核/384GB神龙服务器上,实测string数据结构的SET操作,从结果数据来看几乎与everysec模式的性能持平,同时兼顾了always模式的数据安全性和everysec模式的高性能。


图3:Redis写入性能对比

Redis在重启时需要进行数据恢复操作。原生Redis重启后都需要从RDB和AOF中加载数据到内存,完成加载后才可以正常提供服务。经过实测,10GB左右数据的RDB加载时间大概为53秒左右,这段时间内Redis服务处于不可用状态。而在基于NVM的方案中,Redis重启后可以先基于NVM的持久化数据结构直接提供读服务,DRAM数据结构重建完成后即可提供完整的读写服务。同样针对10GB左右的数据集,系统shutdown save后重启,实测1秒内可以提供只读服务,35秒内可以提供完整读写服务,整个数据恢复时间大幅下降。如下图所示:

图4: Redis recovery时间对比

另外,原生Redis通过fork一个子进程来保存全量DB数据到RDB或AOF文件,即使相比上次保存的数据仅有一个key的变更,也依然会全量保存整个DB,显然这不是一种高效的实现方式。并且该过程会对Redis带来较大的性能抖动。而基于NVM的方案是一种持续增量持久化的方式,更加高效和平滑,这点对于在线服务来说至关重要。

NVM相比DRAM能提供更高的存储密度和更大容量的数据存储空间,因此可以有效降低单位数据存储成本。基于NVM的字节寻址能力和与DRAM的速度差异,我们设计了NVM非易失性内存和DRAM易失性内存间的数据换入与换出策略,能在不影响Redis基本性能的前提下,提高数据的存储容量并节约成本。

结束语

整个方案中,充分发挥了NVM的字节寻址、持久化等能力,借助DRAM做cache来弥补NVM读写不对称的问题,从而实现了高可靠、高性能、低成本的Redis数据库,从测试数据可以看出NVM对Redis在持久化以及其他性能方面提升效果非常显著。

除此之外,NVM相比DRAM能提供更高的存储密度和更大容量的数据存储空间,因此可以有效降低单位数据存储成本。在不影响Redis基本读写性能的前提下,基于NVM和DRAM的动态数据输入换出,是我们下一步工作的方向之一。

当然,目前方案仍存在一些待优化的点,比如:对于高写入场景,replay性能跟不上DRAM写入速度;failover时候,需要等DRAM重建完成才能提供写服务等。后续会继续跟进这些问题,结合技术和产品来一起合理改进。

原文链接

本文为云栖社区原创内容,未经允许不得转载。

阿里云基于NVM的持久化高性能Redis数据库相关推荐

  1. 技术干货| 阿里云基于Hudi构建Lakehouse实践探索

    简介:阿里云高级技术专家王烨(萌豆)在Apache Hudi 与 Apache Pulsar 联合 Meetup 杭州站上的演讲整理稿件,本议题介绍了阿里云如何使用 Hudi 和 OSS 对象存储构建 ...

  2. 技术干货| 阿里云基于Hudi构建Lakehouse实践探索「内附干货PPT下载渠道」

    简介: 阿里云高级技术专家王烨(萌豆)在Apache Hudi 与 Apache Pulsar 联合 Meetup 杭州站上的演讲整理稿件,本议题介绍了阿里云如何使用 Hudi 和 OSS 对象存储构 ...

  3. 阿里云ECS-Centos7.9集群部署Redis服务遭木马攻击

    阿里云ECS-Centos7.9集群部署Redis服务遭木马攻击 #背景 阿里云ECS-Centos7.9集群:hadoop202,hadoop203,hadoop204 hadoop202启动red ...

  4. 阿里云centos环境之linux上redis安装及踩过的坑(七)

    阿里云centos环境之linux上redis安装及踩过的坑<七> 文章目录 阿里云centos环境之linux上redis安装及踩过的坑<七> 第一:下载上传 第二:解压安装 ...

  5. 阿里云Redis之:通过阿里云自带的连接工具连接Redis(十八)

    通过阿里云自带的连接工具连接Redis 1)登陆数据库 进入实例列表->点击登陆数据库. 2)填写Redis的连接信息 数据库类型选择Redis->实例地区选择华北2->实例ID选择 ...

  6. IDC最新数据库报告:阿里云份额跃居第一 首次超越传统数据库

    IDC最新数据库报告:阿里云份额跃居第一 首次超越传统数据库 日前,全球知名市场调研机构IDC 公布了的2019年下半年中国关系型数据库市场厂商份额数据.报告显示,在公有云模式中,阿里云市场份额达50 ...

  7. 阿里云基于区块链服务构建企业业务系统实践总结

    笔者注:本文是在2018年8月19日由InfoQ主办的BCCon全球区块链生态技术大会的演讲内容基础上整理而成,从技术上对阿里云区块链服务解决企业落地问题的思路以及设计理念进行了解读. 大家好!很高兴 ...

  8. 每周推荐短视频:阿里云基于校企合作培养数据库技术人才

    如何看待开源越来越流行的现象?开源对于数据库产业发展提供了哪些机会和价值? 嘉宾简介 阿里云数据库产品事业部首席架构师.阿里云数据库产品事业部 PolarDB-X 产品负责人-曲山 武汉大学教授.中国 ...

  9. 修改串口设备名ttymxc1_ESP8266接入阿里云——基于官方SDK接入阿里云串口获取云下发数据...

    作者:电子快递哥 日期:于2020年3月18日 有态度,有温度,欢迎关注电子快递哥,转载请注明出处, ESP8266接入阿里云 --之一基于官方SDK接入阿里云串口获取云下发数据 一.获取阿里云IoT ...

最新文章

  1. python如何使用字典中的值并进行比较_python – 如何比较字典中的值?
  2. myeclipse-pro-2013-SR2 下载地址
  3. 阅读源码技术与艺术五
  4. 数据结构Java07【二叉排序树(添加查找删除-节点)】
  5. vue --- 获取子组件数据的一个应急方案$refs
  6. [剑指offer]面试题第[3]题[JAVA][从尾到头打印链表][栈]
  7. 分页插件pageHelpler的使用(ssm框架中)服务器端分页
  8. .jar文件如何打开_ofd发票文件如何打开
  9. C#异步通信概念及应用浅析 .
  10. printf(“%f“,a/b)
  11. Android 系统(138 )---Mtk平台 Android 打包解包*.img ,修改system.img 参数
  12. android jni 多线程,[Android]JNI进阶--线程池
  13. python UI/API 环境配置
  14. python——extend用新序列扩展其他列表
  15. 提取二值图像中信号骨架matlab,matlab 二进制图像轮廓提取
  16. 赞!7000 字学习笔记,MySQL 从入到放弃
  17. Android 原生锁屏页面音乐控制
  18. 2020年移动发展趋势
  19. 新一代三维GIS技术白皮书v1.0
  20. Spark bucketing bucket分桶原理和应用

热门文章

  1. 计算机组成原理哈工大期末_浅谈计算机组成原理(三)
  2. php分页类smary,Smarty分页实现方法完整实例
  3. vuex的命名空间有哪些_Python3 命名空间和作用域
  4. springboot profile_SpringBoot简单配置
  5. java jlist checkbox_JCheckBox检查Java中的JList中的切换逻辑时遇到问题
  6. redis将散裂中某个值自增_Redis总结
  7. linux 文件的组织,Linux文件组织和目录结构
  8. python notebook软件_Jupyter notebook快速入门教程(推荐)
  9. 这就是科研爱情:硕士毕业工作6年后,二人一起辞职携手攻读博士学位
  10. 变化很大!2021年THE世界大学排名出炉,这些中国高校表现出色!