加速PV存儲卷數(shù)據(jù)訪問
JindoRuntime是基于阿里云EMR團隊JindoFS系統(tǒng)開發(fā)的Fluid運行時引擎。JindoFS基于C++實現(xiàn),能夠為Fluid提供Dataset數(shù)據(jù)管理和緩存功能。JindoRuntime支持在Kubernetes環(huán)境下對PV存儲卷中的數(shù)據(jù)進行緩存,以提升后續(xù)數(shù)據(jù)訪問過程的效率。此外,PV存儲卷對應的存儲系統(tǒng)可以是任意的自建存儲系統(tǒng),例如CephFS等。本文介紹如何基于JindoRuntime加速PV存儲卷數(shù)據(jù)訪問。
前提條件
已創(chuàng)建一個非ContainerOS操作系統(tǒng)的ACK Pro版集群,且集群版本為1.18及以上。具體操作,請參見創(chuàng)建ACK Pro版集群。
重要ack-fluid組件暫不支持在ContainerOS操作系統(tǒng)上使用。
已安裝云原生AI套件并部署ack-fluid組件,且ack-fluid版本為1.0.6以上。
重要若您已安裝開源Fluid,請卸載后再部署ack-fluid組件。
已通過kubectl連接Kubernetes集群。具體操作,請參見通過kubectl工具連接集群。
已創(chuàng)建需要訪問存儲系統(tǒng)對應的PV存儲卷和PVC存儲卷聲明。
在Kubernetes環(huán)境中,不同的存儲系統(tǒng)有不同的存儲卷創(chuàng)建方式,為保證存儲系統(tǒng)與Kubernetes集群的連接穩(wěn)定,請根據(jù)對應存儲系統(tǒng)的官方文檔進行準備。
步驟一:查詢PV存儲卷和PVC存儲卷聲明的信息
執(zhí)行如下命令,查詢Kubernetes中PV存儲卷和PVC存儲卷聲明的信息。
kubectl get pvc,pv
預期輸出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/demo-pvc Bound demo-pv 5Gi RWX 19h
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/demo-pv 30Gi RWX Retain Bound default/demo-pvc 19h
PV存儲卷demo-pv
的容量為30GB,支持RWX訪問模式,已被綁定到PVC名稱為demo-pvc
的存儲卷聲明上,均可正常使用。
步驟二:創(chuàng)建Fluid Dataset和JindoRuntime
使用如下YAML,創(chuàng)建
dataset.yaml
文件。下方配置文件中包含兩個待創(chuàng)建的Fluid資源對象,分別是Dataset和JindoRuntime。
Dataset:所需掛載的PVC存儲卷聲明信息。
JindoRuntime:待啟動的JindoFS分布式緩存系統(tǒng)配置,包括緩存系統(tǒng)Worker組件副本數(shù),以及每個Worker組件最大可用的緩存容量等。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: pv-demo-dataset spec: mounts: - mountPoint: pvc://demo-pvc name: data path: / accessModes: - ReadOnlyMany --- apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: pv-demo-dataset spec: replicas: 2 tieredstore: levels: - mediumtype: MEM volumeType: emptyDir path: /dev/shm quota: 10Gi high: "0.9" low: "0.8"
配置文件中資源對象的詳細參數(shù)說明如下。
參數(shù)
說明
mountPoint
需掛載的數(shù)據(jù)源信息。PVC作為數(shù)據(jù)源進行掛載時,支持使用
pvc://<pvc_name>/<path>
格式進行掛載,字段解析如下:pvc_name:所需掛載的PVC存儲卷聲明名稱,該PVC與待創(chuàng)建的Dataset資源必須在同一命名空間下。
path:指定了要掛載的存儲卷下的子目錄。掛載時該子目錄必須存在,否則無法成功掛載。
replicas
待啟動的JindoFS緩存系統(tǒng)Worker組件副本數(shù)。可以根據(jù)需要進行調(diào)整。
mediumtype
緩存類型。僅支持HDD(機械硬盤)、SSD(固態(tài)硬盤)和MEM(內(nèi)存)三種類型。
關于mediumtype的推薦配置,請參見策略二:選擇緩存介質(zhì)。
volumeType
緩存介質(zhì)存儲卷類型。僅支持emptyDir和hostPath兩種類型,默認為hostPath類型。
如果使用內(nèi)存或本地存儲的系統(tǒng)盤作為緩存介質(zhì),推薦選擇emptyDir類型,避免節(jié)點上緩存數(shù)據(jù)殘留,進而影響節(jié)點可用性。
如果使用本地存儲的數(shù)據(jù)盤作為緩存介質(zhì),可使用hostPath類型,并配置path指定為宿主機上數(shù)據(jù)盤的掛載路徑。
關于volumeType的推薦配置,請參見策略二:選擇緩存介質(zhì)。
path
JindoFS緩存系統(tǒng)Worker的緩存數(shù)據(jù)存儲目錄。為達到最優(yōu)的數(shù)據(jù)訪問性能,建議使用
/dev/shm
或其他掛載了內(nèi)存文件系統(tǒng)的路徑。quota
單個緩存Worker組件提供的最大緩存容量。可以根據(jù)需要進行調(diào)整。
執(zhí)行如下命令,創(chuàng)建Dataset和JindoRuntime資源對象。
kubectl create -f dataset.yaml
執(zhí)行如下命令,查看Dataset的部署情況。
kubectl get dataset pv-demo-dataset
預期輸出:
說明初次啟動JindoFS緩存系統(tǒng)時涉及鏡像拉取過程,因為網(wǎng)絡環(huán)境等因素的影響,可能需要耗時2~3分鐘。
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE pv-demo-dataset 10.96GiB 0.00B 20.00GiB 0.0% Bound 2m13s
Dataset處于Bound狀態(tài),表明JindoFS緩存系統(tǒng)已在集群內(nèi)正常啟動,應用Pod可正常訪問Dataset中定義的數(shù)據(jù)。
(可選)步驟三:創(chuàng)建DataLoad執(zhí)行緩存預熱
由于首次訪問無法命中數(shù)據(jù)緩存,應用Pod的數(shù)據(jù)訪問效率可能較低,F(xiàn)luid提供了DataLoad緩存預熱操作提升首次數(shù)據(jù)訪問的效率。
創(chuàng)建
dataload.yaml
文件,代碼示例如下。apiVersion: data.fluid.io/v1alpha1 kind: DataLoad metadata: name: dataset-warmup spec: dataset: name: pv-demo-dataset namespace: default loadMetadata: true target: - path: / replicas: 1
上述資源對象的詳細參數(shù)說明如下所示。
參數(shù)
說明
dataset.name
需要預熱的Dataset對象名字。
dataset.namespace
需要預熱的Dataset對象所在的命名空間。該命名空間需要與DataLoad對象所在命名空間一致。
loadMetadata
預熱前是否進行元信息同步,對于JindoRuntime須設置為true。
target[*].path
需預熱的存儲目錄或文件,路徑為基于Dataset中聲明的掛載點的相對路徑。
例如,Dataset中掛載的數(shù)據(jù)源為
pvc://my-pvc/mydata
,那么設置path為/test
將會預熱my-pvc
對應存儲系統(tǒng)下的/mydata/test
目錄。target[*].replicas
需預熱的存儲目錄或文件的緩存副本數(shù)量。
執(zhí)行如下命令,創(chuàng)建DataLoad對象。
kubectl create -f dataload.yaml
執(zhí)行如下命令,查看DataLoad狀態(tài)。
kubectl get dataload dataset-warmup
預期輸出:
NAME DATASET PHASE AGE DURATION dataset-warmup pv-demo-dataset Complete 62s 12s
執(zhí)行如下命令,查看數(shù)據(jù)緩存狀態(tài)。
kubectl get dataset
預期輸出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE pv-demo-dataset 10.96GiB 10.96GiB 20.00GiB 100.0% Bound 3m13s
DataLoad緩存預熱操作完成后,數(shù)據(jù)集的已緩存數(shù)據(jù)量(CACHED)已更新為整個數(shù)據(jù)集的大小,代表整個數(shù)據(jù)集已被緩存,緩存百分比(CACHED PERCENTAGE)為100.0%。
步驟四:創(chuàng)建應用容器,訪問PV存儲卷中的數(shù)據(jù)
使用如下YAML,創(chuàng)建
pod.yaml
文件,并修改YAML文件中的claimName名稱與步驟二創(chuàng)建的Dataset名稱相同。apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 command: - "bash" - "-c" - "sleep inf" volumeMounts: - mountPath: /data name: data-vol volumes: - name: data-vol persistentVolumeClaim: claimName: pv-demo-dataset # 名稱需要與Dataset相同。
執(zhí)行如下命令,創(chuàng)建應用Pod。
kubectl create -f pod.yaml
執(zhí)行如下命令,登錄Pod訪問數(shù)據(jù)。
kubectl exec -it nginx bash
預期輸出:
# Nginx Pod中,/data目錄下有一個名為demofile的文件,大小為11 GB。 ls -lh /data total 11G -rw-r----- 1 root root 11G Jul 22 2022 demofile # 執(zhí)行cat /data/demofile > /dev/null命令,將demofile文件中的內(nèi)容讀取并寫入/dev/null設備中,用時11.004秒。 time cat /data/demofile > /dev/null real 0m11.004s user 0m0.065s sys 0m3.089s
由于數(shù)據(jù)集中的數(shù)據(jù)已經(jīng)全部緩存在了JindoFS緩存系統(tǒng)中,讀取數(shù)據(jù)時將會從緩存中讀取,而不是從遠程存儲系統(tǒng)中讀取,從而減少了網(wǎng)絡傳輸,提升了數(shù)據(jù)訪問效率。