加速PV存储卷数据访问

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

  1. 使用如下YAML,创建dataset.yaml文件。

    下方配置文件中包含两个待创建的Fluid资源对象,分别是DatasetJindoRuntime

    • 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组件提供的最大缓存容量。可以根据需要进行调整。

  2. 执行如下命令,创建Dataset和JindoRuntime资源对象。

    kubectl create -f dataset.yaml
  3. 执行如下命令,查看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缓存预热操作提升首次数据访问的效率。

  1. 创建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

    需预热的存储目录或文件的缓存副本数量。

  2. 执行如下命令,创建DataLoad对象。

    kubectl create -f dataload.yaml
  3. 执行如下命令,查看DataLoad状态。

    kubectl get dataload dataset-warmup

    预期输出:

    NAME             DATASET           PHASE      AGE   DURATION
    dataset-warmup   pv-demo-dataset   Complete   62s   12s
  4. 执行如下命令,查看数据缓存状态。

    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存储卷中的数据

  1. 使用如下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相同。
  2. 执行如下命令,创建应用Pod。

    kubectl create -f pod.yaml
  3. 执行如下命令,登录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缓存系统中,读取数据时将会从缓存中读取,而不是从远程存储系统中读取,从而减少了网络传输,提升了数据访问效率。