開啟CNFS NAS計(jì)算端分布式緩存
CNFS文件存儲(chǔ)計(jì)算端分布式緩存可提供多鏈接訪問、元數(shù)據(jù)緩存、分布式數(shù)據(jù)緩存等加速能力,并提供端側(cè)性能監(jiān)控、QoS能力。本文介紹如何在ACK集群中開啟CNFS NAS計(jì)算端分布式緩存,并通過分布式緩存功能加速讀取數(shù)據(jù)。
索引
前提條件
分布式緩存支持的操作系統(tǒng)為Alibaba Cloud Linux 2,內(nèi)核版本為v4.19.91-23至v4.19.91-26版本。
已創(chuàng)建Kubernetes集群,Kubernetes版本為v1.20及以上,且存儲(chǔ)插件選擇為CSI。具體操作,請參見創(chuàng)建Kubernetes托管版集群。
CSI-Plugin和CSI-Provisioner組件版本不低于v1.22.11-abbb810e-aliyun。關(guān)于升級CSI-Plugin和CSI-Provisioner組件的操作,請參見安裝與升級CSI組件。
storage-operator組件版本不低于v1.22.86-041b094-aliyun。關(guān)于升級storage-operator組件的操作,請參見管理組件。
已通過kubectl工具連接Kubernetes集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
分布式緩存關(guān)鍵性能指標(biāo)
指標(biāo) | 測試場景① | 未開啟分布式緩存 | 開啟分布式緩存 |
元數(shù)據(jù)性能 | 100萬文件目錄遍歷耗時(shí) | 18min | 小于60s |
創(chuàng)建寫入4 KB文件耗時(shí) | 3000μs | 小于200μs | |
重復(fù)讀取4 KB文件耗時(shí) | 400μs | 小于100μs | |
吞吐性能 | 單節(jié)點(diǎn)讀寫吞吐性能② | 200~500 MB/s | 大于800 MB/s |
綜合場景性能 | 5000張150 KB圖片解壓縮耗時(shí) | 52s | 約15s |
構(gòu)建Redis項(xiàng)目耗時(shí) | 27s | 約21s |
本文以上表格提供的數(shù)據(jù)僅為理論值(參考值),實(shí)際數(shù)據(jù)以您的操作環(huán)境為準(zhǔn)。
注解①:測試數(shù)據(jù)的ECS機(jī)型為ecs.hfg6.4xlarge,測試環(huán)境的差異可能導(dǎo)致性能數(shù)據(jù)有一定偏差。
注解②:ECS網(wǎng)絡(luò)帶寬和NAS文件系統(tǒng)規(guī)格會(huì)影響單節(jié)點(diǎn)讀寫吞吐性能。
步驟一:使用分布式緩存掛載NAS文件系統(tǒng)
執(zhí)行以下命令,在集群中創(chuàng)建并部署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
參數(shù)
說明
cnfs-client-properties
分布式緩存的緩存開關(guān)。當(dāng)配置
cnfs-cache-properties. enable=true
時(shí),表示開啟分布式緩存。nfs-efc-cache.
container-number
當(dāng)開啟分布式緩存時(shí)需要配置。
緩存的DaemonSet的容器數(shù)量,當(dāng)緩存有性能瓶頸時(shí),可以增加容器數(shù)量。
nfs-efc-cache.
volume-type
當(dāng)開啟分布式緩存時(shí)需要配置。
緩存容器EmptyDir使用的介質(zhì)。
Disk:磁盤。
Memory:內(nèi)存。
nfs-efc-cache.
volume-size
當(dāng)開啟分布式緩存時(shí)需要配置。表示緩存數(shù)據(jù)卷Volume的總大小,單位:GiB。
cnfs-client-properties
安裝分布式緩存的相關(guān)依賴,則需要配置
cnfs-client-properties. enable=true
。node-selector
緩存的DaemonSet通過Label進(jìn)行調(diào)度,如果不配置,則所有節(jié)點(diǎn)都會(huì)部署緩存。
重要使用磁盤和內(nèi)存時(shí),會(huì)使用節(jié)點(diǎn)的數(shù)據(jù)盤和內(nèi)存資源,請確保不影響業(yè)務(wù)運(yùn)行。
本示例部署了分布式緩存的DaemonSet,緩存中有3個(gè)Container,在緩存Pod容器內(nèi)每個(gè)Container掛載5 GiB的tmpfs卷,并且只調(diào)度到帶有
cache=true
標(biāo)簽的節(jié)點(diǎn)上。
ConfigMap配置完成后,會(huì)根據(jù)已配置的ConfigMap自動(dòng)部署緩存的DaemonSet以及Service。
執(zhí)行以下命令,重啟CSI-Plugin組件,安裝相關(guān)依賴。
kubectl get pod -nkube-system -owide | grep csi-plugin | awk '{print $1}' | xargs kubectl -nkube-system delete pod
執(zhí)行以下命令,為CNFS的文件存儲(chǔ)開啟分布式緩存。
創(chuàng)建一個(gè)CNFS托管NAS文件系統(tǒng),StatefulSet通過使用動(dòng)態(tài)存儲(chǔ)卷的方式掛載分布式緩存,使用busybox鏡像,Pod啟動(dòng)時(shí)會(huì)通過
dd
命令將1 G大小的文件寫入/data
下面,1 G文件后續(xù)用于測試緩存是否生效。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" useClient: "EFCClient" # 通過EFC客戶端使用分布式緩存進(jìn)行掛載。 --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alibabacloud-cnfs-nas-sc mountOptions: - g_tier_EnableClusterCache=true # 掛載時(shí),分布式緩存使用緩存配置。 - g_tier_EnableClusterCachePrefetch=true # 掛載時(shí),分布式緩存開啟預(yù)讀功能。 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
執(zhí)行以下命令,確認(rèn)分布式緩存是否掛載成功。
kubectl exec cnfs-nas-sts-0 -- mount | grep /data
預(yù)期輸出:
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)
輸出顯示有掛載點(diǎn),說明分布式緩存已掛載成功。
執(zhí)行以下命令,確認(rèn)分布式緩存的DaemonSet是否啟動(dòng)。
kubectl get ds/cnfs-cache-ds -n kube-system -owide
預(yù)期輸出:
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個(gè)節(jié)點(diǎn),DaemonSet的3個(gè)Pod均處于可用狀態(tài),說明分布式緩存的DaemonSet已經(jīng)啟動(dòng)完成。
執(zhí)行以下命令,確認(rèn)分布式緩存的Service是否實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)。
kubectl get ep cnfs-cache-ds-service -n kube-system -owide
預(yù)期輸出:
NAME ENDPOINTS AGE cnfs-cache-ds-service 10.19.1.130:6500,10.19.1.40:6500,10.19.1.66:6500 19d
Service已經(jīng)發(fā)現(xiàn)后端緩存Pod對應(yīng)的EndPoints為10.19.1.130、10.19.1.40、10.19.1.66,端口為6500。
步驟二:測試緩存是否生效
執(zhí)行以下命令,將寫入到
/data
中的1 G的tmpfile文件復(fù)制到/
下,查看耗時(shí)時(shí)間。kubectl exec cnfs-nas-sts-0 -- time cp /data/1G.tmpfile /
預(yù)期輸出:
real 0m 5.66s user 0m 0.00s sys 0m 0.75s
可以看到:未開啟分布式緩存時(shí),拷貝時(shí)間不變,保持約5s左右。
重復(fù)執(zhí)行以下命令,查看耗時(shí)。
kubectl exec cnfs-nas-sts-0 -- time cp /data/1G.tmpfile /
預(yù)期輸出:
real 0m 0.79s user 0m 0.00s sys 0m 0.58s
可以看到:對多次訪問的文件,拷貝讀加速提升了6~7倍。