CNFS文件存储计算端分布式缓存可提供多链接访问、元数据缓存、分布式数据缓存等加速能力,并提供端侧性能监控、QoS能力。本文介绍如何在ACK集群中开启CNFS NAS计算端分布式缓存,并通过分布式缓存功能加速读取数据。
前提条件
- 分布式缓存支持的操作系统为Alibaba Cloud Linux 2,内核版本为v4.19.91-23至v4.19.91-26。 
- 已创建Kubernetes集群,Kubernetes版本为v1.20及以上,且存储插件选择为CSI。具体操作,请参见创建Kubernetes托管版集群。 
- CSI-Plugin和CSI-Provisioner组件版本不低于v1.22.11-abbb810e-aliyun。关于升级CSI-Plugin和CSI-Provisioner组件的操作,请参见安装与升级CSI组件。 
- storage-operator组件版本不低于v1.22.86-041b094-aliyun。关于升级storage-operator组件的操作,请参见管理组件。 
- 已通过kubectl工具连接Kubernetes集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。 
分布式缓存关键性能指标
| 指标 | 测试场景① | 未开启分布式缓存 | 开启分布式缓存 | 
| 元数据性能 | 100万文件目录遍历耗时 | 18min | 小于60s | 
| 创建写入4 KB文件耗时 | 3000μs | 小于200μs | |
| 重复读取4 KB文件耗时 | 400μs | 小于100μs | |
| 吞吐性能 | 单节点读写吞吐性能② | 200~500 MB/s | 大于800 MB/s | 
| 综合场景性能 | 5000张150 KB图片解压缩耗时 | 52s | 约15s | 
| 构建Redis项目耗时 | 27s | 约21s | 
本文以上表格提供的数据仅为理论值(参考值),实际数据以您的操作环境为准。
- 注解①:测试数据的ECS机型为ecs.hfg6.4xlarge,测试环境的差异可能导致性能数据有一定偏差。 
- 注解②:ECS网络带宽和NAS文件系统规格会影响单节点读写吞吐性能。 
步骤一:使用分布式缓存挂载NAS文件系统
- 执行以下命令,在集群中创建并部署csi-plugin的ConfigMap,安装加速插件。 - cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: csi-plugin namespace: kube-system data: cnfs-client-properties: | nas-efc=true nas-efc-cache: | enable=true container-number=3 volume-type=memory volume-size=15Gi node-selector: | cache=true EOF- 参数 - 说明 - cnfs-client-properties - 分布式缓存的缓存开关。当配置 - nas-efc=true时,表示开启分布式缓存。- nfs-efc-cache. - container-number - 当开启分布式缓存时需要配置。 - 缓存的DaemonSet的容器数量,当缓存出现性能瓶颈时,可以增加容器数量。 - nfs-efc-cache. - volume-type - 当开启分布式缓存时需要配置。 - 缓存容器EmptyDir使用的介质。 - disk:磁盘。
- memory:内存。
 - nfs-efc-cache. - volume-size - 当开启分布式缓存时需要配置。表示缓存数据卷Volume的总大小,单位:GiB。 - node-selector - 缓存的DaemonSet通过Label进行调度。如果不配置,则所有节点都会部署缓存。 重要- 使用磁盘和内存时,会使用节点的数据盘和内存资源,请确保不影响业务运行。 
- 本示例部署了分布式缓存的DaemonSet,缓存中有3个容器,在缓存Pod容器内每个容器挂载5 GiB的tmpfs卷,并且只调度到带有 - cache=true标签的节点上。
 - ConfigMap配置完成后,会根据已配置的ConfigMap自动部署缓存的DaemonSet以及Service。 
- 执行以下命令,重启CSI-Plugin组件,安装相关依赖。 - kubectl get pod -nkube-system -owide | grep csi-plugin | awk '{print $1}' | xargs kubectl -nkube-system delete pod
- 执行以下命令,为CNFS的文件存储开启分布式缓存。 - 创建一个CNFS托管NAS文件系统,StatefulSet通过使用动态存储卷的方式挂载分布式缓存,使用busybox镜像,Pod启动时会通过 - dd命令将1 G大小的文件写入- /data下面,1 G文件后续用于测试缓存是否生效。
- 执行以下命令,确认分布式缓存是否挂载成功。 - kubectl exec cnfs-nas-sts-0 -- mount | grep /data- 预期输出: - xxx.cn-xxx.nas.aliyuncs.com:/nas-6b9d1397-6542-4410-816b-4dfd0633****:2fMaQdxU on /data type alifuse.aliyun-alinas-eac (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)- 输出显示有挂载点,说明分布式缓存已挂载成功。 
- 执行以下命令,确认分布式缓存的DaemonSet是否启动。 - kubectl get ds/cnfs-cache-ds -n kube-system -owide- 预期输出: - NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR cnfs-cache-ds 3 3 3 3 3 <none> 19d alinas-dadi-container registry-vpc.cn-shenzhen.aliyuncs.com/acs/nas-cache:20220420 app=cnfs-cache-ds- 本示例的集群有3个节点,DaemonSet的3个Pod均处于可用状态,说明分布式缓存的DaemonSet已经启动完成。 
- 执行以下命令,确认分布式缓存的Service是否实现服务发现。 - kubectl get ep cnfs-cache-ds-service -n kube-system -owide- 预期输出: - NAME ENDPOINTS AGE cnfs-cache-ds-service 10.19.1.130:6500,10.19.1.40:6500,10.19.1.66:6500 19d- Service已经发现后端缓存Pod对应的EndPoints为10.19.1.130、10.19.1.40、10.19.1.66,端口为6500。 
步骤二:测试缓存是否生效
- 执行以下命令,将写入到 - /data中的1 G的tmpfile文件复制到- /下,查看耗时情况。- kubectl exec cnfs-nas-sts-0 -- time cp /data/1G.tmpfile /- 预期输出: - real 0m 5.66s user 0m 0.00s sys 0m 0.75s- 可以看到:未开启分布式缓存时,拷贝时间不变,保持约5s左右。 
- 重复执行以下命令,查看耗时。 - kubectl exec cnfs-nas-sts-0 -- time cp /data/1G.tmpfile /- 预期输出: - real 0m 0.79s user 0m 0.00s sys 0m 0.58s- 可以看到:对多次访问的文件,拷贝读加速提升了6~7倍。