Apache Doris tablet 副本修复的原理、流程及问题定位

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Apache Doris tablet 副本修复的原理、流程及问题定位

Doris 一个 tablet 有多个副本,可能因为某些情况导致状态不一致。Doris 会尝试自动修复这些状态不一致的副本,让集群尽快从错误状态中恢复。每个副本的状态有以下几种


  1. 1.BAD : 即副本损坏。包括但不限于磁盘故障、BUG等引起的副本不可恢复的损毁状态

  2. 2.VERSION_MISSING : 版本缺失。Doris 中每一批次导入都对应一个数据版本。而一个副本的数据由多个连续的版本组成。而由于导入错误、延迟等原因,可能导致某些副本的数据版本不完整

  3. 3.HEALTHY : 健康副本。即数据正常的副本,并且副本所在的 BE 节点状态正常

Tablet 的状态是有所有副本状态来决定的,状态如下:


  1. 1.REPLICA_MISSING:副本缺失(即存活副本数小于期望副本数)

  2. 2.VERSION_INCOMPLETE:存活副本数大于等于期望副本数,但其中健康副本数小于期望副本数。

  3. 3.REPLICA_RELOCATING :拥有等于 replication num 的版本完整的存活副本数,但是部分副本所在的 BE 节点处于 unavailable 状态

  4. 4.REPLICA_MISSING_IN_CLUSTER : 当使用多 cluster 方式时,健康副本数大于等于期望副本数,但在对应 cluster 内的副本数小于期望副本数

  5. 5.REDUNDANT:副本冗余

  6. 6.COLOCATE_MISMATCH:针对 Colocation 属性的表的分片状态。表示分片副本与 Colocation Group 的指定的分布不一致

  7. 7.COLOCATE_REDUNDANT:针对 Colocation 属性的表的分片状态。表示 Colocation 表的分片副本冗余。

  8. 8.FORCE_REDUNDANT:这是一个特殊状态。只会出现在当期望副本数大于等于可用节点数时,并且 Tablet 处于副本缺失状态时出现。这种情况下,需要先删除一个副本,以保证有可用节点用于创建新副本


  1. 9.HEALTHY:健康分片,即条件[1-8]都不满足。

下面这张图是 Doris 副本检查及副本恢复的整体流程图

微信图片_20231009170105.png

名词解释:


  1. 1.TabletChecker(TC):TabletChecker 作为常驻的后台进程,会定期检查所有分片的状态。对于非健康状态的分片,将会交给 TabletScheduler 进行调度和修复。修复的实际操作,都由 BE 上的 clone 任务完成。FE 只负责生成这些 clone 任务。

  2. 2.TabletScheduler 每5秒进行一次调度

  3. 3.TabletScheduler 每次调度最多 50 个 tablet

  4. 4.最大等待调度任务数和运行中任务数为 2000。当超过 2000 后,TabletChecker 将不再产生新的调度任务给 TabletScheduler。

  5. 5.最大均衡任务数为 500。当超过 500 后,将不再产生新的均衡任务

  6. 6.每块磁盘用于均衡任务的 slot 数目为2。这个 slot 独立于用于副本修复的 slot

  7. 7.一个 clone 任务超时时间范围是 3min ~ 2hour。具体超时时间通过 tablet 的大小计算。计算公式为 (tablet size) / (5MB/s)。当一个 clone 任务运行失败 3 次后,该任务将终止。

  8. 8.TabletScheduler(TS):是一个常驻的后台线程,用于处理由 TabletChecker 发来的需要修复的 Tablet。同时也会进行集群副本均衡的工作。

副本恢复流程


首先是 FE 的 tablet 检查进程,会定期的对所有分片进行检查,然后会不健康的分片,交给Tablet调度进程去完成调度和修复,下面我们主要介绍一下 FE 这边怎么生成调度及BE怎么完成Clone 和修复。


首先我们要找到一个目标BE,可以用来Clone 一个新的副本


  1. 1.找到一个可用的 BE 及副本存放路径,作为我们副本Clone的目标节点

  2. 2.首先这个 BE 是要 Alive 的

  3. 3.应该将现有副本的 BE 节点排除在外,因为同一个 BE 只能有一个副本。

  4. 4.选择一个 proper tag BE

  • 在副本丢失的情况下,我们要选择一个有副本丢失的 tag

  • 根据副本分步情况,如果没有 副本丢失 tag 的,这种应该抛出异常

  • 为了删除多余的副本,这时候需要找出一个多余副本的标签

  1. 1.这个目标 BE 要有可以使用执行 Clone 任务的 Solt

  2. 2.找到一个可以用来 Clone 副本的合适的路径,这里要考虑磁盘容量和使用百分比

  3. 3.目标是要找到一个负载(ClusterLoadStatistics(CLS))相对低的路径,这里TabletScheduler 会每隔 20s 更新一次 CLS

  4. 4.找到一个适合的副本源

  5. 5.这个副本应该是健康的

  6. 6.源副本所在的BE有可用的Clone solt

  7. 7.向目标 BE 发送克隆任务

  8. 8.目标 BE 提交 Clone task 任务

  9. 9.判断 tablet 副本都否存在,如果不存在开始 Clone 一个新的 tablet

  10. 10.向源 BE 发送一个创建Snapshot的请求,这里源 BE 之所以要创建Snapshot,是因为方式在 clone 修复的时候,这个时候有数据写导致Clone 失败,通过创建快照来避免这个问题。

  11. 11.源 BE 检查 tablet 状态及版本等是否正常

  12. 12.如果源 BE 的tablet 副本状态、版本等都是正常的,执行创建Snapshot,并返回

  13. 13.目标 BE 从源 BE 下载刚才创建的Snapshot到本地,完成副本恢复

实例


用户的操作步骤:


1. 修改已有表字段长度, varchar(60) --> varchar(90) 2. tablet出现损坏 3. 自动修复失败。

下面我们来看一个实例,怎么去定位 Tablet 副本均衡失败的原因


  1. 1.首先我们要通过 show tablet tablet_id 查看这个 tablet 副本的情况

  2. 2.在执行上面命令返回的数据最后一列的命令

类似下面的命令


SHOW PROC'/dbs/10005/17679/partitions/774669/6061262/6061295';

微信图片_20231009170514.png

然后我们可以看到最下面的一行,显示这个副本正Clone,但是过了一会并没有Clone 成功,这个时候我们可能感觉无从下手,不知道为什么了,我们这个时候要去关注 cluster_balance, 通过这个查看副本均衡调度任务执行的情况


  1. 1.查看副本调度的任务情况,执行下面的命令

SHOW PROC '/cluster_balance/pending_tablets'; 或者 SHOW PROC '/cluster_balance/running_tablets';

在返回的结果里我们可以看到:SrcBeDestBe

1.png

这个时候我们就要去目标BE上去查看日志,在日志里搜索这个 Tablet Id,然后我在日志里看到下面的信息

[图片上传失败...(image-d42cdf-1662968106713)]


显示这个目标 BE 在去源 BE 请求创建 tablet 副本快照的时候失败了,这个时候我怀疑可能是其他的副本也是有问题的,正常情况下这个地方不应该失败,我通过

SHOW PROC'/dbs/10005/17679/partitions/774669/6061262/6061299';


注意:


这里因为当时是在查看三个 tablet的问题,所有这个tablet id 前后对不上,都是一样的问题

我去看刚才 Clone 失败的副本均衡任务的源 BE 上副本对应的的哪行数据最后一列:CompactionStatus ,然后将这个URL在浏览器里访问,看一下是不是刚才猜测的这个副本也存在问题。

2.png

然后看到了下面的信息,版本丢失了


因为有三副本,之前只损坏一个副本,是不是另外一个副本也是这种情况呢,我又去看了另外一个be上的副本状态,最后发现也是同样的问题

3.png

最后去看了一下,源 BE 上的日志,搜索了 3341 这个版本号,来确认是否真版本丢失了

4.png

通过上面的日志,确认了这个tablet 三个副本都是损坏的,而且没办法修复


这种情况下,我们就要通过 BE 日志来分析具体的原因,是因为操作不当还是程序存在 Bug,如果是操作不当,可以先从操作上规避,然后将这个问题提交给社区,有社区开发人员定位分析,然后修复


针对这个里面没办法修复的,只能先删除这个分区,重新将这个分区的数据导入进来


正常情况下Doris不会出现某个tablet 副本全部损坏不可修复的问题,


现在Doris 社区发版速度很快,而且在1.1.x版本上维护了一个准LTS版本,所以建议大家及时升级到最新版本,正常按照社区的升级手册,不会出现数据丢失的情况


因为Doris 不支持高版本超低版回退,大家可能比较担心我一旦升级错误怎么办,下一篇文章我来给大家讲解怎么进行升级前的备份,在升级失败后,可以回退到之前的版本,正常运行。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
8天前
|
SQL 消息中间件 关系型数据库
Apache Doris Flink Connector 24.0.0 版本正式发布
该版本新增了对 Flink 1.20 的支持,并支持通过 Arrow Flight SQL 高速读取 Doris 中数据。
|
7天前
|
存储 JSON 物联网
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
本文我们将聚焦企业最普遍使用的 JSON 数据,分别介绍业界传统方案以及 Apache Doris 半结构化数据存储分析的三种方案,并通过图表直观展示这些方案的优势与不足。同时,结合具体应用场景,分享不同需求场景下的使用方式,帮助用户快速选择最合适的 JSON 数据存储及分析方案。
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
|
14天前
|
SQL 消息中间件 Java
兼容Trino Connector,扩展Apache Doris数据源接入能力|Lakehouse 使用手册(四)
通过兼容 Connector 插件,Apache Doris 能够支持 Trino/Presto 可对接的所有数据源,而无需改动 Doris 的内核代码。
兼容Trino Connector,扩展Apache Doris数据源接入能力|Lakehouse 使用手册(四)
|
21天前
|
存储 消息中间件 运维
招联金融基于 Apache Doris 数仓升级:单集群 QPS 超 10w,存储成本降低 70%
招联内部已有 40+ 个项目使用 Apache Doris ,拥有超百台集群节点,个别集群峰值 QPS 可达 10w+ 。通过应用 Doris ,招联金融在多场景中均有显著的收益,比如标签关联计算效率相较之前有 6 倍的提升,同等规模数据存储成本节省超 2/3,真正实现了降本提效。
招联金融基于 Apache Doris 数仓升级:单集群 QPS 超 10w,存储成本降低 70%
|
28天前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
15天前
|
存储 大数据 数据挖掘
【数据新纪元】Apache Doris:重塑实时分析性能,解锁大数据处理新速度,引爆数据价值潜能!
【9月更文挑战第5天】Apache Doris以其卓越的性能、灵活的架构和高效的数据处理能力,正在重塑实时分析的性能极限,解锁大数据处理的新速度,引爆数据价值的无限潜能。在未来的发展中,我们有理由相信Apache Doris将继续引领数据处理的潮流,为企业提供更快速、更准确、更智能的数据洞察和决策支持。让我们携手并进,共同探索数据新纪元的无限可能!
61 11
|
21天前
|
关系型数据库 MySQL API
Apache Doris集群部署
Apache Doris集群部署
|
25天前
|
存储 消息中间件 Java
Apache Flink 实践问题之原生TM UI日志问题如何解决
Apache Flink 实践问题之原生TM UI日志问题如何解决
31 1
|
23天前
|
消息中间件 监控 数据挖掘
基于RabbitMQ与Apache Flink构建实时分析系统
【8月更文第28天】本文将介绍如何利用RabbitMQ作为数据源,结合Apache Flink进行实时数据分析。我们将构建一个简单的实时分析系统,该系统能够接收来自不同来源的数据,对数据进行实时处理,并将结果输出到另一个队列或存储系统中。
86 2
|
25天前
|
消息中间件 分布式计算 Hadoop
Apache Flink 实践问题之Flume与Hadoop之间的物理墙问题如何解决
Apache Flink 实践问题之Flume与Hadoop之间的物理墙问题如何解决
34 3

推荐镜像

更多