Doris元数据恢复

元数据目录结构

一个正常运行中的 Doris 集群,元数据的目录结构应该如下:

meta_dir/
            |-- bdb/
            |   |-- 00000000.jdb
            |   |-- je.config.csv
            |   |-- je.info.0
            |   |-- je.info.0.lck
            |   |-- je.lck
            |   `-- je.stat.csv
            `-- image/
                |-- ROLE
                |-- VERSION
                `-- image.xxxx
  1. bdb 目录

    我们将bdbje作为一个分布式的 kv 系统,存放元数据的 journal。这个 bdb 目录相当于 bdbje 的 “数据目录”。

    其中 .jdb 后缀的是 bdbje 的数据文件。这些数据文件会随着元数据 journal 的不断增多而越来越多。当 Doris 定期做完 image 后,旧的日志就会被删除。所以正常情况下,这些数据文件的总大小从几 MB 到几 GB 不等(取决于使用 Doris 的方式,如导入频率等)。当数据文件的总大小大于 10GB,则可能需要怀疑是否是因为 image 没有成功,或者分发 image 失败导致的历史 journal 一直无法删除。

    je.info.0 是 bdbje 的运行日志。通过这个日志,也可以查看一些 bdbje 的运行情况。

  2. image 目录

    image 目录用于存放 Doris 定期生成的元数据镜像文件。通常情况下,你会看到有一个 image.xxxxx 的镜像文件。其中 xxxxx 是一个数字。这个数字表示该镜像包含 xxxxx 号之前的所有元数据 journal。而这个文件的生成时间(通过 ls -al 查看即可)通常就是镜像的生成时间。

    你也可能会看到一个 image.ckpt 文件。这是一个正在生成的元数据镜像。通过 du -sh 命令应该可以看到这个文件大小在不断变大,说明镜像内容正在写入这个文件。当镜像写完后,会自动重名为一个新的 image.xxxxx 并替换旧的 image 文件。

    只有角色为 Master 的 FE 才会主动定期生成 image 文件。每次生成完后,都会推送给其他非 Master 角色的 FE。当确认其他所有 FE 都收到这个 image 后,Master FE 会删除 bdbje 中旧的元数据 journal。所以,如果 image 生成失败,或者 image 推送给其他 FE 失败时,都会导致 bdbje 中的数据不断累积。

    ROLE 文件记录了 FE 的类型(FOLLOWER 或 OBSERVER),是一个文本文件。

    VERSION 文件记录了这个 Doris 集群的 cluster id,以及用于各个节点之间访问认证的 token,也是一个文本文件。

    ROLE 文件和 VERSION 文件只可能同时存在,或同时不存在(如第一次启动时)。

备份数据

  1. 备份doris所有Fe的元数据

  2. 删除Fe master元数据(如果是做测试元数据恢复功能,需要删除元数据)

故障恢复

FE 有可能因为某些原因出现无法启动 bdbje、FE 之间无法同步等问题。现象包括无法进行元数据写操作、没有 MASTER 等等。这时,我们需要手动操作来恢复 FE。手动恢复 FE 的大致原理,是先通过当前 meta_dir 中的元数据,启动一个新的 MASTER,然后再逐台添加其他 FE。请严格按照如下步骤操作:

  1. 首先,停止所有 FE 进程,同时停止一切业务访问。保证在元数据恢复期间,不会因为外部访问导致其他不可预期的问题。

  2. 确认哪个 FE 节点的元数据是最新:

    • 首先,务必先备份所有 FE 的 meta_dir 目录。
    • 通常情况下,Master FE 的元数据是最新的。可以查看 meta_dir/image 目录下,image.xxxx 文件的后缀,数字越大,则表示元数据越新。
    • 通常,通过比较所有 FOLLOWER FE 的 image 文件,找出最新的元数据即可。
    • 之后,我们要使用这个拥有最新元数据的 FE 节点,进行恢复。
    • 如果使用 OBSERVER 节点的元数据进行恢复会比较麻烦,建议尽量选择 FOLLOWER 节点。
  3. 以下操作都在由第2步中选择出来的 FE 节点上进行。

    1. 如果该节点是 FOLLOWER ,直接跳到第二步,如果该节点是一个 OBSERVER,先将 meta_dir/image/ROLE 文件中的 role=OBSERVER 改为 role=FOLLOWER。(从 OBSERVER 节点恢复会比较麻烦,先按这里的步骤操作,后面会有单独说明)
    2. 在 fe.conf 中添加配置:metadata_failure_recovery=true
    3. 执行 sh bin/start_fe.sh 启动这个 FE。
    4. 如果正常,这个 FE 会以 MASTER 的角色启动,类似于前面 启动单节点 FE 一节中的描述。在 fe.log 应该会看到 transfer from XXXX to MASTER 等字样。
    5. 启动完成后,先连接到这个 FE,执行一些查询导入,检查是否能够正常访问。如果不正常,有可能是操作有误,建议仔细阅读以上步骤,用之前备份的元数据再试一次。如果还是不行,问题可能就比较严重了。
    6. 如果成功,通过 show frontends; 命令,应该可以看到之前所添加的所有 FE,并且当前 FE 是 master。
    7. 将 fe.conf 中的 metadata_failure_recovery=true 配置项删除,或者设置为 false,然后重启这个 FE(重要)。
> 如果你是从一个 OBSERVER 节点的元数据进行恢复的,那么完成如上步骤后,通过 `show frontends;` 语句你会发现,当前这个 FE 的角色为 OBSERVER,但是 `IsMaster` 显示为 `true`。这是因为,这里看到的 “OBSERVER” 是记录在 Doris 的元数据中的,而是否是 master,是记录在 bdbje 的元数据中的。因为我们是从一个 OBSERVER 节点恢复的,所以这里出现了不一致。请按如下步骤修复这个问题(官方说明后续会进行修复):

> 1. 先把除了这个 “OBSERVER” 以外的所有 FE 节点 DROP 掉。
> 2. 通过 `ADD FOLLOWER` 命令,添加一个新的 FOLLOWER FE,假设在 hostA 上。
> 3. 在 hostA 上启动一个全新的 FE,通过 `--helper` 的方式加入集群。
> 4. 启动成功后,通过 `show frontends;` 语句,你应该能看到两个 FE,一个是之前的  OBSERVER,一个是新添加的 FOLLOWER,并且 OBSERVER 是 master。
> 5. 确认这个新的 FOLLOWER 是可以正常工作之后,用这个新的 FOLLOWER 的元数据,重新执行一遍故障恢复操作。
> 6. 以上这些步骤的目的,其实就是人为的制造出一个 FOLLOWER 节点的元数据,然后用这个元数据,重新开始故障恢复。这样就避免了从 OBSERVER 恢复元数据所遇到的不一致的问题。

> `metadata_failure_recovery=true` 的含义是,清空 "bdbje" 的元数据。这样 bdbje 就不会再联系之前的其他 FE 了,而作为一个独立的 FE 启动。这个参数只有在恢复启动时才需要设置为 true。恢复完成后,一定要设置为 false,否则一旦重启,bdbje 的元数据又会被清空,导致其他 FE 无法正常工作。
  1. 第3步执行成功后,我们再通过 ALTER SYSTEM DROP FOLLOWER/OBSERVER 命令,将之前的其他的 FE 从元数据删除后,按加入新 FE 的方式,重新把这些 FE 添加一遍。
  2. 如果以上操作正常,则恢复完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值