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日志并进行多维度分析。
目录
相关文章
|
1月前
|
消息中间件 分布式计算 大数据
大数据-166 Apache Kylin Cube 流式构建 整体流程详细记录
大数据-166 Apache Kylin Cube 流式构建 整体流程详细记录
63 5
|
16天前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
11天前
|
SQL 存储 Java
Apache Doris 2.1.7 版本正式发布
亲爱的社区小伙伴们,**Apache Doris 2.1.7 版本已于 2024 年 11 月 10 日正式发布。**2.1.7 版本持续升级改进,同时在湖仓一体、异步物化视图、半结构化数据管理、查询优化器、执行引擎、存储管理、以及权限管理等方面完成了若干修复。欢迎大家下载使用。
|
17天前
|
监控 Cloud Native BI
8+ 典型分析场景,25+ 标杆案例,Apache Doris 和 SelectDB 精选案例集(2024版)电子版上线
飞轮科技正式推出 Apache Doris 和 SelectDB 精选案例集 ——《走向现代化的数据仓库(2024 版)》,汇聚了来自各行各业的成功案例与实践经验。该书以行业为划分标准,辅以使用场景标签,旨在为读者提供一个高度整合、全面涵盖、分类清晰且易于查阅的学习资源库。
|
17天前
|
SQL DataWorks 关系型数据库
阿里云 DataWorks 正式支持 SelectDB & Apache Doris 数据源,实现 MySQL 整库实时同步
阿里云数据库 SelectDB 版是阿里云与飞轮科技联合基于 Apache Doris 内核打造的现代化数据仓库,支持大规模实时数据上的极速查询分析。通过实时、统一、弹性、开放的核心能力,能够为企业提供高性价比、简单易用、安全稳定、低成本的实时大数据分析支持。SelectDB 具备世界领先的实时分析能力,能够实现秒级的数据实时导入与同步,在宽表、复杂多表关联、高并发点查等不同场景下,提供超越一众国际知名的同类产品的优秀性能,多次登顶 ClickBench 全球数据库分析性能排行榜。
|
1月前
|
存储 分布式计算 druid
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
53 3
|
1月前
|
存储 SQL 缓存
Apache Doris 3.0 里程碑版本|存算分离架构升级、湖仓一体再进化
从 3.0 系列版本开始,Apache Doris 开始支持存算分离模式,用户可以在集群部署时选择采用存算一体模式或存算分离模式。基于云原生存算分离的架构,用户可以通过多计算集群实现查询负载间的物理隔离以及读写负载隔离,并借助对象存储或 HDFS 等低成本的共享存储系统来大幅降低存储成本。
Apache Doris 3.0 里程碑版本|存算分离架构升级、湖仓一体再进化
|
1月前
|
存储 小程序 Apache
10月26日@杭州,飞轮科技 x 阿里云举办 Apache Doris Meetup,探索保险、游戏、制造及电信领域数据仓库建设实践
10月26日,由飞轮科技与阿里云联手发起的 Apache Doris 杭州站 Meetup 即将开启!
54 0
|
1月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
595 13
Apache Flink 2.0-preview released
|
1月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
68 3

推荐镜像

更多