当前位置: 首页 > 工具软件 > NVM-Direct > 使用案例 >

40 | Redis的下一步:基于NVM内存的实践

劳和雅
2023-12-01


Redis核心技术与实战

未来篇

40 | Redis的下一步:基于NVM内存的实践

非易失存储(Non-Volatile Memory,NVM) 器件具有容量大、性能快、能持久化保存数据的特性,这些刚好就是 Redis 追求的目标。同时,NVM 器件像 DRAM 一样,可以让软件以字节粒度进行寻址访问,所以,在实际应用中,NVM 可以作为内存来使用,称为 NVM 内存。

Redis 发展的下一步,就可以基于 NVM 内存来实现大容量实例,或者是实现快速持久化数据和恢复。

NVM 内存的特性与使用模式

Redis 是基于 DRAM 内存的键值数据库,而跟传统的 DRAM 内存相比,NVM 有三个显著的特点:

  • NVM 内存最大的优势是可以直接持久化保存数据。
    数据保存在 NVM 内存上后,即使发生宕机或是掉电,数据仍然存在 NVM 内存上。但如果数据是保存在 DRAM 上,那么,掉电后数据就会丢失。
  • NVM 内存的访问速度接近 DRAM 的速度。
  • NVM 内存的容量很大。
    NVM 器件的密度大,单个 NVM 的存储单元可以保存更多数据。例如,单根 NVM 内存条就能达到 128GB 的容量,最大可以达到 512GB,而单根 DRAM 内存条通常是 16GB 或 32GB。所以,可以很轻松地用 NVM 内存构建 TB 级别的内存。

Intel 在 2019 年 4 月份时推出的 Optane AEP 内存条(简称 AEP 内存)。AEP 内存给软件提供了两种使用模式,分别对应着使用了 NVM 的容量大和持久化保存数据两个特性。

  • 第一种是 Memory 模式
    这种模式是把 NVM 内存作为大容量内存来使用,也就是说,只使用 NVM 容量大和性能高的特性,没有启用数据持久化的功能。
    在 Memory 模式下,服务器上仍然需要配置 DRAM 内存,但是,DRAM 内存是被 CPU 用作 AEP 内存的缓存,DRAM 的空间对应用软件不可见。 换句话说,软件系统能使用到的内存空间,就是 AEP 内存条的空间容量。
  • 第二种是 App Direct 模式
    这种模式启用了 NVM 持久化数据的功能。 在这种模式下,应用软件把数据写到 AEP 内存上时,数据就直接持久化保存下来了。所以,使用了 App Direct 模式的 AEP 内存,也叫做持久化内存(Persistent Memory,PM)。

基于 NVM 内存的 Redis 实践

当 AEP 内存使用 Memory 模式时,应用软件就可以利用它的大容量特性来保存大量数据,Redis 也就可以给上层业务应用提供大容量的实例。而且,在 Memory 模式下,Redis 可以像在 DRAM 内存上运行一样,直接在 AEP 内存上运行,不用修改代码。

在 Memory 模式下,AEP 内存的访问延迟会比 DRAM 高一点,Redis 实例读性能会有所降低,需要在保存大量数据和读性能较慢两者之间做个取舍。

Redis 在涉及持久化操作时的问题:

  • RDB 文件创建时的 fork 操作会阻塞主线程;
  • AOF 文件记录日志时,需要在数据可靠性和写性能之间取得平衡;
  • 使用 RDB 或 AOF 恢复数据时,恢复效率受 RDB 和 AOF 大小的限制。

如果使用持久化内存,就可以充分利用 PM 快速持久化的特点,来避免 RDB 和 AOF 的操作。因为 PM 支持内存访问,而 Redis 的操作都是内存操作,可以把 Redis 直接运行在 PM 上。同时,数据本身就可以在 PM 上持久化保存,不再需要额外的 RDB 或 AOF 日志机制来保证数据可靠性。

PM 的使用方法:

  1. 当服务器中部署了 PM 后,可以在操作系统的 /dev 目录下看到一个 PM 设备,如下所示:
 /dev/pmem0
  1. 然后,需要使用 ext4-dax 文件系统来格式化这个设备:
 mkfs.ext4 /dev/pmem0
  1. 然后,把这个格式化好的设备,挂载到服务器上的一个目录下:
mount -o dax /dev/pmem0  /mnt/pmem0

此时,就可以在这个目录下创建文件。创建好了以后,再把这些文件通过内存映射(mmap)的方式映射到 Redis 的进程空间。这样就可以把 Redis 接收到的数据直接保存到映射的内存空间上,而这块内存空间是由 PM 提供的。所以,数据写入这块空间时,就可以直接被持久化保存。
因为 PM 的读写速度比 DRAM 慢,所以,如果使用 PM 来运行 Redis,需要评估下 PM 提供的访问延迟和访问带宽,是否能满足业务层的需求。

 类似资料: