执行恢复时storaged或metad服务存在启动失败,报错为:[db/db_impl/db_impl_open.cc:2112] DB::Open() failed: Corruption: Corruption: IO error: No such file or directory: While open a file for random read: /xxx/000024.ldb: No such file or directory in file /xxx/MANIFEST-000020

  • nebula 版本:3.6
  • 部署方式:k8s分布式
  • 安装方式:源码编译
  • 是否上生产环境:Y
  • 硬件信息
    • 机械磁盘
    • 6U15G
  • 问题的具体描述
    我这边生产环境搭建了一个基于nebula的k8s分布式集群,已创建15个图空间,导入5亿点边数据。在服务正常情况下,执行create snapshot进行数据的备份。基于备份的数据,为metad和storaged服务进行恢复时,存在偶先storaged或metad服务启动失败,报错信息为
2024/11/11-21:38:38.656812 140578633020992 [WARN] [db/db_impl/db_impl_open.cc:2112] DB::Open() failed: Corruption: Corruption: IO error: No such file or directory: While open a file for random read: /xxx/000024.ldb: No such file or directory in file /xxx/MANIFEST-000020
2024/11/11-21:38:38.656835 140578633020992 [db/db_impl/db_impl.cc:477] Shutdown: canceling all background work
2024/11/11-21:38:38.656893 140578633020992 [db/db_impl/db_impl.cc:677] Shutdown complete
  • 其他信息:
    (1)通过多次恢复验证,storaged启动失败的概率大于metad
    (2)本集群未使用bragent进行备份恢复,而是自研一套方案。本集群的恢复方案为:1、从远端存储机器中下载snapshot备份文件压缩包到storaged和metad容器中;2、通过nebula.service stop关闭storaged和metad服务,并解压snapshot文件到storaged或metad指定data目录下(storaged存在多个图空间,对应多个snapshot压缩文件,启动多线程并行解压);3、解压完成的服务,执行nebula.service start启动(采用节点粒度启动服务。当节点中的storaged和metad都解压完,一起启动服务)。
    (3)不同节点机器性能存在差异,因此服务启动时间不同,存在时间差(可能10mins)
    (4)当前已验证远端存储机器下载的snapshot文件无破损(md5值验证);所有解压均无失败
  • 问题检索:
    (1)rocksdb github社区,有几个相似问题的issue,均处于open
https://github.com/facebook/rocksdb/issues/10258
https://github.com/facebook/rocksdb/issues/10357

(2)其中https://github.com/facebook/rocksdb/issues/10357贴子最下面,似乎有解决方案

。请帮助分析感谢

1 个赞

是拷贝完一个就启动一个吗?你能全部拷贝完再启动吗?
另外,你是所有都 meta 的目录都替换了不?
storaged 多个 part 你是怎么备份还原的

我们的备份恢复实现方案如下:
备份:
1、metad主节点发起create snapshot任务。
2、create snapshot任务完成后,metad主节点将0号checkpoint文件夹进行压缩,所有storaged服务将所有x号checkpoint文件夹进行压缩。
3、所有服务压缩完成,将snapshot压缩文件夹上传sftp服务器
恢复:
1、storaged和metad服务从sftp服务器下载备份时期自己上传的压缩文件
2、使用md5校验下载文件是否存在破损
3、nebula.service stop关闭storaged和metad服务
4、删除storaged或metad的data目录的所有文件
5、解压snapshot文件夹到storaged或metad指定x目录下(storaged存在多个图空间,对应多个snapshot压缩文件,启动多线程并行解压)
6、当某个节点(部署metad+storaged)解压完成,执行nebula.service start启动metad+storaged。
注意特殊点:

  • 恢复的最后阶段以节点粒度启动服务。具体说一个节点通常会部署metad+storaged容器,只有当metad+storaged均解压完成,才会一起启动。
  • 不同节点机器性能存在差异,因此不同节点间服务启动时间不同,存在时间差(可能10mins)

问题1:是拷贝完一个就启动一个吗?你能全部拷贝完再启动吗?
答复:我们有3台节点机器,每台节点均部署了storaged和metad服务。当一个节点上的storaged和metad服务都完成了解压工作,则启动该节点的storaged和metad服务

问题2:你是所有都 meta 的目录都替换了不?
答复:恢复阶段,使用snapshot压缩文件夹解压替换到每一个metad服务的0号目录

问题3:storaged 多个 part 你是怎么备份还原的
答复见上一个回复贴