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-cache-properties: | enable=true container-number=3 volume-type=memory volume-size=15Gi cnfs-client-properties: | enable=true node-selector: | cache=true EOF
参数 说明 cnfs-cache-properties 分布式缓存的缓存开关。当配置 cnfs-cache-properties. enable=true
时,表示开启分布式缓存。cnfs-cache-properties. container-number 当开启分布式缓存时需要配置。 缓存的DaemonSet的容器数量,当缓存有性能瓶颈时,可以增加容器数量。
cnfs-cache-properties. volume-type 当开启分布式缓存时需要配置。 缓存容器EmptyDir使用的介质。
- Disk:磁盘
- Memory:内存
cnfs-cache-properties. volume-size 当开启分布式缓存时需要配置。表示缓存数据卷Volume的总大小,单位:GiB。 cnfs-client-properties 安装分布式缓存的相关依赖,则需要配置 cnfs-client-properties. enable=true
。node-selector 缓存的DaemonSet通过Label进行调度,如果不配置,则所有节点都会部署缓存。 重要- 使用磁盘和内存时,会使用节点的数据盘和内存资源,请确保不影响业务运行。
- 本示例部署了分布式缓存的DaemonSet,缓存中有3个Container,在缓存Pod容器内每个Container挂载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文件后续用于测试缓存是否生效。cat << EOF | kubectl apply -f - apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerNetworkFileSystem metadata: name: cnfs-nas-filesystem spec: description: "cnfs" type: nas reclaimPolicy: Retain parameters: filesystemType: standard storageType: Capacity protocolType: NFS encryptType: None enableTrashCan: "true" trashCanReservedDays: "5" useElasticAccelerationClient: "true" # 使用分布式缓存进行挂载。 --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alibabacloud-cnfs-nas-sc mountOptions: - nolock,tcp,noresvport - vers=3 - g_tier_EnableClusterCache=true # 挂载时,分布式缓存使用缓存配置。 - g_tier_EnableClusterCachePrefetch=true # 挂载时,分布式缓存开启预读功能。 parameters: volumeAs: subpath containerNetworkFileSystem: cnfs-nas-filesystem path: "/" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain allowVolumeExpansion: true --- apiVersion: apps/v1 kind: StatefulSet metadata: name: cnfs-nas-sts labels: app: busybox spec: serviceName: "busybox" replicas: 1 selector: matchLabels: app: busybox template: metadata: labels: app: busybox spec: containers: - name: busybox image: busybox command: ["/bin/sh"] args: ["-c", "dd if=/dev/zero of=/data/1G.tmpfile bs=1G count=1;sleep 3600;"] volumeMounts: - mountPath: "/data" name: www volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "alibabacloud-cnfs-nas-sc" resources: requests: storage: 50Gi EOF
- 执行以下命令,确认分布式缓存是否挂载成功。
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倍。