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
分布式缓存的缓存开关。当配置
cnfs-cache-properties. enable=true
时,表示开启分布式缓存。nfs-efc-cache.
container-number
当开启分布式缓存时需要配置。
缓存的DaemonSet的容器数量,当缓存出现性能瓶颈时,可以增加容器数量。
nfs-efc-cache.
volume-type
当开启分布式缓存时需要配置。
缓存容器EmptyDir使用的介质。
Disk:磁盘。
Memory:内存。
nfs-efc-cache.
volume-size
当开启分布式缓存时需要配置。表示缓存数据卷Volume的总大小,单位:GiB。
cnfs-client-properties
安装分布式缓存的相关依赖时,需要配置
cnfs-client-properties. enable=true
。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倍。