JindoRuntime是基于阿里云EMR团队JindoFS系统开发的Fluid运行时引擎。JindoFS基于C++实现,能够为Fluid提供Dataset数据管理和缓存功能。JindoRuntime支持在Kubernetes环境下对PV存储卷中的数据进行缓存,以提升后续数据访问过程的效率。此外,PV存储卷对应的存储系统可以是任意的自建存储系统,例如CephFS等。本文介绍如何基于JindoRuntime加速PV存储卷数据访问。
前提条件
已创建一个非ContainerOS操作系统的ACK Pro版集群,且集群版本为1.18及以上。具体操作,请参见创建ACK Pro版集群。
重要ack-fluid组件暂不支持在ContainerOS操作系统上使用。
已安装云原生AI套件并部署ack-fluid组件,且ack-fluid版本为1.0.6以上。
重要若您已安装开源Fluid,请卸载后再部署ack-fluid组件。
已通过kubectl连接Kubernetes集群。具体操作,请参见通过kubectl工具连接集群。
已创建需要访问存储系统对应的PV存储卷和PVC存储卷声明。
在Kubernetes环境中,不同的存储系统有不同的存储卷创建方式,为保证存储系统与Kubernetes集群的连接稳定,请根据对应存储系统的官方文档进行准备。
步骤一:查询PV存储卷和PVC存储卷声明的信息
执行如下命令,查询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
的存储卷声明上,均可正常使用。
步骤二:创建Fluid Dataset和JindoRuntime
使用如下YAML,创建
dataset.yaml
文件。下方配置文件中包含两个待创建的Fluid资源对象,分别是Dataset和JindoRuntime。
Dataset:所需挂载的PVC存储卷声明信息。
JindoRuntime:待启动的JindoFS分布式缓存系统配置,包括缓存系统Worker组件副本数,以及每个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"
配置文件中资源对象的详细参数说明如下。
参数
说明
mountPoint
需挂载的数据源信息。PVC作为数据源进行挂载时,支持使用
pvc://<pvc_name>/<path>
格式进行挂载,字段解析如下:pvc_name:所需挂载的PVC存储卷声明名称,该PVC与待创建的Dataset资源必须在同一命名空间下。
path:指定了要挂载的存储卷下的子目录。挂载时该子目录必须存在,否则无法成功挂载。
replicas
待启动的JindoFS缓存系统Worker组件副本数。可以根据需要进行调整。
mediumtype
缓存类型。仅支持HDD(机械硬盘)、SSD(固态硬盘)和MEM(内存)三种类型。
关于mediumtype的推荐配置,请参见策略二:选择缓存介质。
volumeType
缓存介质存储卷类型。仅支持emptyDir和hostPath两种类型,默认为hostPath类型。
如果使用内存或本地存储的系统盘作为缓存介质,推荐选择emptyDir类型,避免节点上缓存数据残留,进而影响节点可用性。
如果使用本地存储的数据盘作为缓存介质,可使用hostPath类型,并配置path指定为宿主机上数据盘的挂载路径。
关于volumeType的推荐配置,请参见策略二:选择缓存介质。
path
JindoFS缓存系统Worker的缓存数据存储目录。为达到最优的数据访问性能,建议使用
/dev/shm
或其他挂载了内存文件系统的路径。quota
单个缓存Worker组件提供的最大缓存容量。可以根据需要进行调整。
执行如下命令,创建Dataset和JindoRuntime资源对象。
kubectl create -f dataset.yaml
执行如下命令,查看Dataset的部署情况。
kubectl get dataset pv-demo-dataset
预期输出:
说明初次启动JindoFS缓存系统时涉及镜像拉取过程,因为网络环境等因素的影响,可能需要耗时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状态,表明JindoFS缓存系统已在集群内正常启动,应用Pod可正常访问Dataset中定义的数据。
(可选)步骤三:创建DataLoad执行缓存预热
由于首次访问无法命中数据缓存,应用Pod的数据访问效率可能较低,Fluid提供了DataLoad缓存预热操作提升首次数据访问的效率。
创建
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
上述资源对象的详细参数说明如下所示。
参数
说明
dataset.name
需要预热的Dataset对象名字。
dataset.namespace
需要预热的Dataset对象所在的命名空间。该命名空间需要与DataLoad对象所在命名空间一致。
loadMetadata
预热前是否进行元信息同步,对于JindoRuntime须设置为true。
target[*].path
需预热的存储目录或文件,路径为基于Dataset中声明的挂载点的相对路径。
例如,Dataset中挂载的数据源为
pvc://my-pvc/mydata
,那么设置path为/test
将会预热my-pvc
对应存储系统下的/mydata/test
目录。target[*].replicas
需预热的存储目录或文件的缓存副本数量。
执行如下命令,创建DataLoad对象。
kubectl create -f dataload.yaml
执行如下命令,查看DataLoad状态。
kubectl get dataload dataset-warmup
预期输出:
NAME DATASET PHASE AGE DURATION dataset-warmup pv-demo-dataset Complete 62s 12s
执行如下命令,查看数据缓存状态。
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缓存预热操作完成后,数据集的已缓存数据量(CACHED)已更新为整个数据集的大小,代表整个数据集已被缓存,缓存百分比(CACHED PERCENTAGE)为100.0%。
步骤四:创建应用容器,访问PV存储卷中的数据
使用如下YAML,创建
pod.yaml
文件,并修改YAML文件中的claimName名称与步骤二创建的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相同。
执行如下命令,创建应用Pod。
kubectl create -f pod.yaml
执行如下命令,登录Pod访问数据。
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 # 执行cat /data/demofile > /dev/null命令,将demofile文件中的内容读取并写入/dev/null设备中,用时11.004秒。 time cat /data/demofile > /dev/null real 0m11.004s user 0m0.065s sys 0m3.089s
由于数据集中的数据已经全部缓存在了JindoFS缓存系统中,读取数据时将会从缓存中读取,而不是从远程存储系统中读取,从而减少了网络传输,提升了数据访问效率。