加速主机目录数据访问

JindoRuntime是基于阿里云EMR团队的JindoFS文件系统开发的Fluid运行时引擎。JindoFS基于C++实现,能够为Fluid提供Dataset数据管理和缓存功能。JindoRuntime支持对Kubernetes环境主机目录HostPath中的数据进行缓存,从而提升后续数据访问过程的效率。在混合云场景下,您可以将主机目录挂载到自建存储系统,从而实现自建存储系统的数据访问加速。本文介绍如何基于JindoRuntime加速主机目录数据访问。

前提条件

  • 已创建一个非ContainerOS操作系统的ACK Pro版集群,且集群版本为1.18及以上。具体操作,请参见创建ACK Pro版集群

    重要

    ack-fluid组件暂不支持在ContainerOS操作系统上使用。

  • 已安装云原生AI套件并部署ack-fluid组件,且ack-fluid版本为1.0.6以上。

    重要

    若您已安装开源Fluid,请卸载后再部署ack-fluid组件。

步骤一:准备主机目录挂载点

JindoRuntime利用分布式缓存来加速主机目录数据访问,因此,对于使用JindoFS分布式缓存系统的用户,需要在Master组件和Worker组件所运行的节点上提前准备好对应的主机目录。操作示例如下。

  1. 执行如下命令,在/mnt目录下创建一个新的子目录作为主机目录挂载点。

    $ mkdir /mnt/demo-remote-fs
  2. 执行如下命令,为cn-beijing.192.168.1.45cn-beijing.192.168.2.234两个节点创建相应的主机目录。

    # 此处两个节点为本文的示例节点,具体生产环境请替换成您自己的节点名称。
    ssh cn-beijing.192.168.1.45 "mkdir -p /mnt/demo-remote-fs"
    ssh cn-beijing.192.168.2.234 "mkdir -p /mnt/demo-remote-fs"
  3. 执行如下命令,为cn-beijing.192.168.1.45cn-beijing.192.168.2.234节点打标签。标签demo-remote-fs=true用于设置JindoRuntime的Master和Worker组件的节点调度约束条件。

    kubectl label node cn-beijing.192.168.1.45 demo-remote-fs=true
    kubectl label node cn-beijing.192.168.2.234 demo-remote-fs=true

步骤二:创建Fluid Dataset和JindoRuntime

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

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

    • Dataset:所需挂载的主机目录信息。

    • JindoRuntime:待启动的JindoFS分布式缓存系统配置,包括缓存系统Worker组件副本数,以及每个Worker组件最大可用的缓存容量等。

    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: hostpath-demo-dataset
    spec:
      mounts: 
        - mountPoint: local:///mnt/demo-remote-fs
          name: data
          path: /
      accessModes:
        - ReadOnlyMany
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: JindoRuntime
    metadata:
      name: hostpath-demo-dataset
    spec:
      master:
        nodeSelector:
          demo-remote-fs: "true"
      worker:
        nodeSelector:
          demo-remote-fs: "true"
      fuse:
        nodeSelector:
          demo-remote-fs: "true"
      replicas: 2
      tieredstore:
        levels:
          - mediumtype: MEM
            volumeType: emptyDir
            path: /dev/shm
            quota: 10Gi
            high: "0.99"
            low: "0.99"

    配置文件中资源对象的详细参数说明如下。

    参数

    说明

    mountPoint

    需要挂载的数据源信息。主机目录作为数据源,挂载时支持local://<path>格式。path为挂载的主机目录,需要设置为绝对路径。

    nodeSelector

    设置JindoRuntime的Master组件、Worker组件、FUSE组件的节点调度约束条件,控制各个组件Pod仅在已准备好主机目录的节点上运行。

    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 hostpath-demo-dataset

    预期输出:

    说明

    初次启动JindoFS缓存系统时涉及镜像拉取过程,因为网络环境等因素的影响,可能需要耗时2~3分钟。

    NAME                    UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    hostpath-demo-dataset   1.98GiB          0.00B    20.00GiB         0.0%                Bound   3m54s

    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: hostpath-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   9s
  4. 执行如下命令,查看数据缓存状态。

    kubectl get dataset

    预期输出:

    NAME                    UFS TOTAL SIZE   CACHED    CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    hostpath-demo-dataset   1.98GiB          1.98GiB   20.00GiB         100.0%              Bound   7m24s

    DataLoad缓存预热操作完成后,数据集的已缓存数据量CACHED已更新为整个数据集的大小,代表整个数据集已被缓存,缓存百分比CACHED PERCENTAGE为100.0%。

步骤四:创建应用容器,访问主机目录中数据

  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: hostpath-demo-dataset # 名称需要与Dataset相同。
  2. 执行如下命令,创建应用Pod。

    kubectl create -f pod.yaml
  3. 执行如下命令,登录Pod访问数据。

    $ kubectl exec -it nginx bash

    预期输出:

    # Nginx Pod中,/data目录下有一个名为demo-file的文件,大小为2 GB。
    $ ls -lh /data
    total 2.0G
    -rwxrwxr-x 1 root root 2.0G Jun  9 04:02 demo-file
    
    # 执行cat /data/demofile > /dev/null命令,将demofile文件中的内容读取并写入/dev/null设备中,用时2.061秒。
    $ time cat /data/demofile > /dev/null
    real    0m2.061s
    user    0m0.015s
    sys     0m0.581s

    由于数据集中的数据已经全部缓存在了JindoFS缓存系统中,读取数据时将会从缓存中读取,而不是从远程存储器中读取,从而减少了网络传输,提升了数据访问效率。