非易失性存储卷概述
非易失性存储卷可以通过Intel的持久化内存PMEM等技术实现。本文介绍ACK中非易失性存储卷的使用方式和使用示例。
背景信息
PMEM(Persistent Memory)是一种高性能、持久性内存,位于内存总线,具备DRAM的速度和延迟,同时具有NAND闪存的非易失性。主要优势包括:
访问延迟低于闪存SSD的访问延迟。
吞吐量提高,超过闪存存储。
价格比DRAM便宜,节约成本。
PMEM可缓存,解决PCIe互连不能在CPU中缓存的问题。
可实时访问数据,支持对大型数据集进行超高速访问。
断电后,数据仍保留在内存中,例如闪存。
使用方式
ACK集群支持设备生命周期管理,通过Alibaba Cloud CSI Driver,您可以声明式分配、挂载和使用资源。
在ACK中,非易失性存储卷的使用方式有以下两种:
PMEM-LVM方式(无侵入的块存储使用方式)
非易失性存储作为块存储或文件系统访问,无需修改应用,直接声明即可使用。此方案的原则是把节点上PMEM资源统一成VolumeGroup,然后通过声明PVC类型和容量,使用PMEM-LVM。
适用于无服务器化应用、CICD短生命周期高速临时存储、低延迟高吞吐的数据类应用。IO性能可以提升2~10倍。更多示例请参考使用非易失性存储提升读写性能。
PMEM-直接内存(Direct Memory)访问方式
非易失性存储作为直接内存访问,需对应用内存分配部分函数做有限修改以适配PMEM SDK,实现对PMEM设备的直接访问,达到接近内存访问的吞吐和时延。
适用于内存数据库Redis、HANA等大内存低成本需求,可以降低内存成本30~50%。更多示例请参考使用非易失性存储卷的直接内存访问方式部署Redis数据库。
各方式的性能对比如下:
方式 | 碎片化 | 在线扩容 | 持久化 | 应用修改 | 时延 (4K/RW) | 吞吐 (4K/RW) | 单盘最大容量(ecs.ebmre6p.26xlarge) |
PMEM-LVM | 无 | 支持 | 是 | 否 | 10 us | 10W | 1536 GB |
PMEM-Direct | 是 | 否 | 否 | 是 | 1.2 us | 56W | 768 GB |
SSD | 无 | 支持 | 是 | 否 | 100 us | 1W | 32 TB |
插件部署
插件说明
ACK对非易失性内存支持方案的系统组件包含:
CSI-Plugin:实现PMEM设备初始化,卷的具体创建、删除操作,实现挂载、卸载操作。
CSI-Provisioner:感知并发起卷的创建、删除操作。
CSI-Scheduler:容量调度 (ACK调度器内置)。
部署插件
在ACK集群中添加PMEM类型的ECS节点(如ecs.ebmre6p.26xlarge)。具体操作,请参见创建和管理节点池。
第一代PMEM支持持久内存型实例规格族re6p和持久内存型弹性裸金属服务器实例规格族ebmre6p。
第二代PMEM支持内存增强型实例规格族re7p。
为PMEM类型的ECS节点添加标签,启用PMEM CSI的挂载能力。
给节点添加以下Label:
pmem.csi.alibabacloud.com
:启用设备自运维。pmem.csi.alibabacloud.com/type: lvm
:表示此节点使用LVM方式提供PV卷。pmem.csi.alibabacloud.com/type: direct
:表示此节点使用内存访问方式提供PV卷。
部署CSI PMEM插件。
部署CSI-Plugin。
部署CSI-Provisioner。
部署StorageClass。
使用示例
创建块存储类型数据卷
使用以下YAML,创建PVC。
添加
annotations: volume.kubernetes.io/selected-node
以定向调度PVC到某个非易失性存储卷节点。apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: volume.kubernetes.io/selected-node: cn-zhangjiakou.192.168.XX.XX name: pmem-lvm spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: pmem-lvm
使用以下YAML,创建应用负载。
apiVersion: apps/v1 kind: StatefulSet metadata: name: sts-lvm labels: app: busybox-lvm spec: selector: matchLabels: app: busybox-lvm serviceName: "busybox" template: metadata: labels: app: busybox-lvm spec: containers: - name: busybox image: busybox command: ["sh", "-c"] args: ["sleep 10000"] volumeMounts: - name: pmem-pvc mountPath: "/data" volumes: - name: pmem-pvc persistentVolumeClaim: claimName: pmem-lvm
查看结果。
查看创建的PVC。
kubectl get pvc
预期输出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pmem-lvm Bound disk-**** 10Gi RWO pmem-lvm 10m
查看创建的Pod。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE sts-lvm-0 1/1 Running 0 10m
进入应用,查看挂载路径详情。
kubectl exec -ti sts-lvm-0 -- df /data
预期输出如下,可以看到已经动态创建了一个块存储数据卷,并挂载给Pod使用。
Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/pmemvgregion0-disk--**** 10255636 36888 10202364 1% /data
创建直接内存类型数据卷
使用以下YAML,创建PVC。
添加
annotations: volume.kubernetes.io/selected-node
以定向调度PVC到某个非易失性存储卷节点。apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: volume.kubernetes.io/selected-node: cn-zhangjiakou.192.168.XX.XX name: pmem-direct spec: accessModes: - ReadWriteOnce resources: requests: storage: 9Gi storageClassName: pmem-direct
使用以下YAML,创建应用负载。
apiVersion: apps/v1 kind: StatefulSet metadata: name: sts-direct labels: app: busybox-direct spec: selector: matchLabels: app: busybox-direct serviceName: "busybox" template: metadata: labels: app: busybox-direct spec: containers: - name: busybox image: busybox command: ["sh", "-c"] args: ["sleep 1000"] volumeMounts: - name: pmem-pvc mountPath: "/data" volumes: - name: pmem-pvc persistentVolumeClaim: claimName: pmem-direct
查看结果。
查看PVC。
kubectl get pvc pmem-direct
预期输出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pmem-direct Bound disk-**** 9Gi RWO pmem-direct 17m
查看Pod。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE sts-direct-0 1/1 Running 0 17m
进入应用,查看挂载路径详情。
kubectl exec -ti sts-direct-0 -- df /data
预期输出如下,可以看到已经动态创建了一个PMEM数据卷,并挂载给Pod使用。
Filesystem 1K-blocks Used Available Use% Mounted on /dev/pmem0 9076344 36888 9023072 1% /data