# 示例-Dataset数据的的备份与恢复

# 前提条件

在运行该示例之前,请参考 安装文档 完成安装,并检查Fluid各组件正常运行:

$ kubectl get pod -n fluid-system
NAME                                  READY   STATUS    RESTARTS   AGE
alluxioruntime-controller-5b64fdbbb-84pc6   1/1     Running   0          8h
csi-nodeplugin-fluid-fwgjh                  2/2     Running   0          8h
csi-nodeplugin-fluid-ll8bq                  2/2     Running   0          8h
dataset-controller-5b7848dbbb-n44dj         1/1     Running   0          8h

在部署Fluid时,可以通过修改charts中values.yaml中的workdir,配置Fluid工作目录 工作目录主要用于暂存备份过程中的一些中间文件,默认为/tmp目录:

workdir: /tmp

请保证Dataset已经进入Bound状态:

$ kubectl get dataset
NAME    UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
hbase   443.89MiB        0.00B    4.00GiB          0.0%                Bound   23m

# 备份

目前支持两种数据的备份:

  • 数据集的metadata,包括文件系统metadata(例如文件系统inode tree)等
  • 数据集的一些关键统计信息,包括数据量大小和文件数量

# 备份到PVC

首先创建DataBackup文件:

$ cat <<EOF > backup.yaml
apiVersion: data.fluid.io/v1alpha1
kind: DataBackup
metadata:
  name: hbase-backup
spec:
  dataset: hbase
  backupPath: pvc://<pvcName>/subpath1/subpath2/
EOF

用户需要将backPath中的pvcName设置为自己的PVC(需要有写的权限),将subpath设置为需要存储的子路径

创建后,会看到运行了一个backup Pod:

$ kubectl get pods
NAME                   READY   STATUS        RESTARTS   AGE
hbase-databackup-pod   1/1     Running       0          3s
hbase-fuse-krxlb       1/1     Running       0          2m44s
hbase-fuse-mtdmc       1/1     Running       0          2m44s
hbase-master-0         2/2     Running       0          3m16s
hbase-worker-sqrzc     2/2     Running       0          2m44s
hbase-worker-whmnv     2/2     Running       0          2m44s

片刻后,该Pod变为Completed状态:

$ kubectl get pods
NAME                   READY   STATUS        RESTARTS   AGE
hbase-databackup-pod   0/1     Completed     0          23s
hbase-fuse-krxlb       1/1     Running       0          3m4s
hbase-fuse-mtdmc       1/1     Running       0          3m4s
hbase-master-0         2/2     Running       0          3m36s
hbase-worker-sqrzc     2/2     Running       0          3m4s
hbase-worker-whmnv     2/2     Running       0          3m4s

该DataBackup同样变为Complete状态:

$ kubectl get databackup
NAME           DATASET   PHASE      PPATH                                NODENAME     AGE
hbase-backup   hbase     Complete   pvc://<pvcName>/subpath1/subpath2/   NA           30s

进入该PVC,查看对应子目录,发现生成的两个备份文件:

$ ls subpath1/subpath2/
hbase-default.yaml  metadata-backup-hbase-default.gz

其中,gz压缩包中是数据集的metadata,yaml文件中是数据集的一些关键统计信息

# 备份到本地

首先创建DataBackup文件:

$ cat <<EOF > backup.yaml
apiVersion: data.fluid.io/v1alpha1
kind: DataBackup
metadata:
  name: hbase-backup
spec:
  dataset: hbase
  backupPath: local:///data/subpath1/
EOF

用户需要将local://后的路径替换为需要保存备份文件的本地路径

片刻后,查看该DataBackup的状态:

$ kubectl get databackup
NAME           DATASET   PHASE      PATH                      NODENAME                   AGE
hbase-backup   hbase     Complete   local:///data/subpath1/   cn-beijing.192.168.1.146   30s

发现该DataBackup变为Complete状态,同时会显示保存位置所在的路径和NodeName

查询NodeName对应的主机IP:

$ kubectl describe node cn-beijing.192.168.1.146

获得IP地址后,就可以从主机的对应目录取走文件刚刚的两个文件

# 使用non-root身份进行备份

如果用户指定的数据备份目录只能以特定uid访问时,需要通过设置RunAs参数指定特定用户来进行备份

如果您已经参考 示例 - 使用Fluid访问非root用户的数据 为AlluxioRuntime配置了RunAs参数,默认进行备份的用户与启动缓存引擎的用户相同

如果您没有为AlluxioRuntime配置RunAs参数,或者您希望以其他用户进行备份,可以通过为DataBackup配置RunAs参数进行设置

假如每台主机的/data/subpath1/目录都属于fluid-user-1用户

修改刚刚的DataBackup:

$ cat <<EOF > backup.yaml
apiVersion: data.fluid.io/v1alpha1
kind: DataBackup
metadata:
  name: hbase-backup
spec:
  dataset: hbase
  backupPath: local:///data/subpath1/
  runAs:
    uid: 1201
    gid: 1201
    user: fluid-user-1
    group: fluid-user-1
EOF

等待备份完成后,前往指定的备份位置,查看刚刚备份的文件:

$ ls -al
total 217108
drwxr-s--- 2 fluid-user-1 fluid-user-1      4096 Mar 24 18:34 .
drwxr-sr-x 5 root         root              4096 Mar 23 17:02 ..
-rw-r--r-- 1 fluid-user-1 fluid-user-1        79 Mar 24 18:34 hbase-default.yaml
-rw-r--r-- 1 fluid-user-1 fluid-user-1 222303277 Mar 24 18:28 metadata-backup-hbase-default.gz

这表明我们以fluid-user-1的用户身份保存了备份文件

# 恢复

要进行恢复,需要保证Dataset的名称与原来保持一致,否则会找不到备份文件

# 从PVC恢复

在创建Dataset时,在spec中添加dataRestoreLocation,填入刚刚查询到的路径作为恢复路径

如果备份文件被移动过,需要修改路径

$ cat <<EOF > dataset.yaml
apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: hbase
spec:
  dataRestoreLocation:
    path: pvc://pvc-local/subpath1/
  mounts:
    - mountPoint:  https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.2.6/
EOF

创建Dataset资源对象:

$ kubectl create -f dataset.yaml
dataset.data.fluid.io/hbase created

AlluxioRuntime资源对象无需做特殊配置:

$ cat<<EOF >runtime.yaml
apiVersion: data.fluid.io/v1alpha1
kind: AlluxioRuntime
metadata:
  name: hbase
spec:
  replicas: 2
  tieredstore:
    levels:
      - mediumtype: MEM
        path: /dev/shm
        quota: 2Gi
        high: "0.95"
        low: "0.7"
EOF

创建AlluxioRuntime资源对象:

$ kubectl create -f runtime.yaml
alluxioruntime.data.fluid.io/hbase created

数据集加载时,将不再从UFS中加载metadata并统计UFS TOTAL SIZE等信息,而是从备份文件中恢复

片刻后,Dataset进入Bound状态:

$ kubectl get dataset
NAME    UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED  PERCENTAGE   PHASE   AGE
hbase   443.86MiB        0.00B    4.00GiB          0.0%                 Bound   20h

# 从本地恢复

在创建Dataset时,在spec中添加dataRestoreLocation,填入刚刚查询到的路径和备份文件所在主机的nodeName

如果备份文件被移动过,需要修改路径和nodeName

$ cat <<EOF > dataset.yaml
apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: hbase
spec:
  dataRestoreLocation:
    path: local:///data/subpath1/
    nodeName: cn-beijing.192.168.1.146
  mounts:
    - mountPoint:  https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.2.6/
EOF

创建AlluxioRuntime资源对象:

$ kubectl create -f runtime.yaml
alluxioruntime.data.fluid.io/hbase created

片刻后,Dataset进入Bound状态

$ kubectl get dataset
NAME    UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED  PERCENTAGE   PHASE   AGE
hbase   443.86MiB        0.00B    4.00GiB          0.0%                 Bound   20h