Doris 磁盘问题全解析:从挂盘到 Trash 问题,一文读懂!

Viewed 57

在使用 Apache Doris 时,磁盘相关的问题时有发生。今天,我们就来系统地梳理一下常见的 Doris 磁盘问题,以及对应的解决方案,帮助大家快速定位并处理问题!

1. 磁盘异常状态

1.1 磁盘总容量为 0,available capacity = 1B

问题原因: 这通常意味着磁盘已经挂了。你可能会看到 replica 被标记为 bad,或者磁盘直接被标记为 offline。

解决方案:

    1. Show tablet xxx => detail command => 拿到出问题replica的backend id 和 path hash(path hash 对应一个具体的路径)。如果path hash = -1, 只是说明fe发生过切主,切主后,tablet 的path hash = -1。
    1. 执行sql 命令 : show proc "/backends/<replica 所在的 backend id>",查看输出结果中是否包含步骤1中的path hash 对应的路径, 如果不存在,说明目录没了。如果目录不存在,或者目录存在,但state = OFFLINE(正常情况状态是ONLINE的),则表示磁盘出问题了。**先查清楚磁盘是什么问题,接着删除 be 节点 be/conf/be_custom.conf 文件(注这个文件不一定存在,因为有可能写这个文件出现失败)**中的 broken_storage_path,(如果be_custom.conf 只有唯一一个broker_storage_path,可以把整个be_custom.conf文件删除),接着重启BE节点;
    1. 不管state 是否等于 OFFLINE, 都去搜下be warning日志: 搜索关键字: "IO Error", 里面会有出错的原因。注意,这个日志在磁盘出问题之后,只打一次,有可能错误很早就发生了,be warning 日志早就被卷过去了。所以可以多搜几个早一些的be warning日志;
      看IO Error, 它有些出错的原因,如果是出现磁盘满的,需要清磁盘。如果是出现fd 数超的,早期版本倒排索引有造成fd数很多的,在2.0.3的某个子版本修了,另外可以把fd limit适当调大, ulimit -a 输出的结果中 file descriptors 就是fd的限制数;

1.2 磁盘空间满了,需要清理 Trash

问题现象: Doris BE 的磁盘空间告急,可能是 Trash 或 catalog recycle bin 没有被及时清理。
解决方案:

注意: Trash 是废弃数据,无法恢复,FE 和 BE 都已经删除了它的元数据。因此,彻底关闭 Trash 也不会对系统造成影响。

1.3 Truncate Table 后磁盘数据未清理

问题描述: Truncate Table 之后,发现磁盘上的数据文件仍然存在。

相关案例: Spark Load 导入后,执行 Truncate Table 但数据未清理的问题。

解决方案:

  • https://github.com/apache/doris/pull/43107 这个pr 更改了 truncate 的行为,有行为变更。行为发生变化了: 1. truncate 的partition 进入catalog recycle bin; 2. truncate 时 tmp partition 不删除,之前是直接删除的。
  • 通过手动删除来解决这个问题

1.4. 删除 Tablet 后,磁盘空间未释放

问题现象: 可能在 Doris 2.0.3 和 2.1.7 版本中遇到该问题。
解决方案:

  • Doris 2.0.3 版本 bug(已在 2.0.5 修复)
  • Doris 2.1.7 版本 可能存在被删除的tablet的文件没有清理
  • Compaction 可能泄漏 Tablet 指针
    • 目前所有版本都有可能遇到此问题,需要重启 BE 才能释放 Tablet 指针。如果遇到了,可以联系社区的同学,协助定位处理问题

2. 磁盘 I/O 错误(IO_ERROR)

2.1 IO_ERROR 及副本标记为 bad

问题现象: 查询报错:failed to initialize storage reader,通常是磁盘 I/O 失败导致的。

解决方案:

  • 在新版本 Doris(3.0.3 及以上)中,BE 会自动把发生 I/O 错误次数过多的 Tablet 标记为 bad。
  • 该功能默认关闭,用户可以在 be.conf 中配置 max_tablet_io_errors > 0 进行开启。
  • 参考修复 PR:https://github.com/apache/doris/pull/42208
  • 如果是低版本 Doris,建议手动执行 SET REPLICA DROP 清理异常副本。

3. 存储介质问题(HDD/SSD)

3.1 Dynamic Partition 的存储介质设置导致问题

**问题现象:**用户设置 dynamic_partition.storage_medium = SSD,导致 hot_partition_num 失效。

解决方案:

  • 已经创建出来的分区,需要手工修改partition 的storage medium 了。 alter table modify partition(xxxx) set ("storage_medium" = "HDD")

3.2 Doris 默认存储介质逻辑异常导致建表失败

问题现象:

  • Doris 默认存储介质为 HDD,但如果系统中只有 SSD,可能导致建表时报错。
  • 报错信息:
    RROR 1105 (HY000): errCode = 2, detailMessage = errCode = 2, detailMessage = errCode = 2, detailMessage = Failed to find enough backend, please check the replication num,replication tag and storage medium and avail capacity of backends or maybe all be on same host.Create failed replications:replication tag: {"location" : "default"}, replication num: 3, storage medium: HDD,
    

解决方案:

3.3 冷热存储数据未下沉

问题现象: 用户配置了冷热介质 ssd -> hdd,冷却时间到之后数据一直保留在ssd,原因是用户一直有导入,而导入会把磁盘挪动任务失败的。

解决方案:

  • 确保导入任务不会影响冷热存储切换。如果有影响的话,可以先停止写入或者重启下BE

3.4 Auto Partition 表存储介质未生效

问题现象:

  • Doris 2.1.8 之前的版本,Auto Partition 机制可能导致 storage_medium 配置失效。

解决方案:

总结

Doris 的磁盘问题涉及存储异常、磁盘清理、I/O 错误、冷热存储等多个方面。对于常见问题,我们可以采取以下策略:

  • 磁盘异常时,优先检查 BE 是否存活,并查看 Replica 状态。
  • 磁盘空间满时,及时清理 Trash 并调整 trash_file_expire_time_sec 配置。
  • 删除 Tablet 后未释放空间,可能是 Doris 版本问题,建议升级或重启 BE。
  • 遇到 I/O 错误,可考虑启用 max_tablet_io_errors 自动标记 bad。
  • 存储介质问题通常与 Doris 版本相关,建议关注最新修复方案。

Doris 仍在持续优化磁盘管理逻辑,如果你在生产环境遇到问题,可联系社区同学协助解决!🚀

1 Answers

磁盘问题排查手册,优先参考上述文档,有其他问题可以联系社区同学