更新时间:2025-12-10 GMT+08:00
分享

Doris支持自动数据均衡功能

Doris支持自动数据均衡功能,FE的Master节点会周期性计算各节点的副本分布情况,根据每个BE节点的磁盘使用率和副本数,选择合适的副本进行迁移,实现数据均衡。

该章节仅适用于MRS 3.6.0-LTS及之后版本。

Doris数据均衡原理

  1. 计算各节点的均衡分数,并分组。
    1. 统计各节点的磁盘使用率和副本数,并计算各节点的磁盘使用率和副本数占整个集群的百分数。
    2. 磁盘使用率和副本数量各有一个权重系数,分别为capacityCoefficient和replicaNumCoefficient,两者之和恒为1。其中capacityCoefficient会根据实际磁盘使用率动态调整,当一个BE的总体磁盘使用率小于50%,则capacityCoefficient值为0.5;如果磁盘使用率大于75%(可通过FE配置项“capacity_used_percent_high_water”调整),则capacityCoefficient值为1;如果磁盘使用率为50%~75%,则该权重系数平滑增加,公式为:

      capacityCoefficient = 2 * 磁盘使用率 - 0.5

      该权重系数保证当磁盘使用率过高时,该Backend的均衡分数(Score)会更高,以保证尽快降低该BE的负载。

    3. 根据各节点的均衡分数(Score)对各节点进行分组(Class)。分组阈值为FE的“balance_load_score_threshold”配置项的值,默认为0.1,即默认Score小于1-0.1=0.9为LOW分组,大于1+0.1=1.1为HIGH分组,否则为MID分组。

    可在MySQL客户端连接Doris后,执行以下命令查看磁盘使用情况:

    show proc '/cluster_balance/cluster_load_stat/location_default/HDD';

    图1 查看磁盘使用情况
  2. 从高级别分组中选择合适的Tablet进行迁移。会先尽量取该节点中磁盘占用空间大的Tablet,然后随机选择一个Tablet添加进pending_tablets队列。
    图2 查看pending_tablets队列
  3. 从pending_tablets队列中选择任务,添加进running_tablets中执行。
    1. 一个Tablet一般有多个副本,尽量选择所在节点分组高的副本向分组低的副本迁移。
    2. 向迁移目的BE节点下发任务,由迁移目的BE节点主动从迁移源BE节点拉取数据。
    图3 查看running_tablets
  4. 迁移完成后,迁移源BE节点的副本不会被立刻删除,而是在FE的Master节点的下一轮扫描中,发现该Tablet的副本数大于建表语句指定的副本数后,才被删除。
    • 删除时,会尽量删除所在节点分组高的副本。
    • 删除时,Master会立刻删除元数据中的该副本,并向相关BE节点下发删除任务。
    • BE节点收到相关删除任务后,会立刻删除该BE节点元数据中的该副本,并将相关数据文件移动到trash目录下,然后按照trash文件的过期机制异步删除。

处理步骤

各BE节点磁盘使用量不均衡可执行以下操作处理:

  1. 在MySQL客户端连接Doris后,执行以下命令:

    show proc '/cluster_balance/cluster_load_stat/location_default/HDD';

    观察回显信息中是否有“Class”列为“HIGH”的节点。如果没有,则说明该集群已较为均衡。如果想进一步均衡,可以在FE的自定义参数“fe.conf.customized.configs”中新增“balance_load_score_threshold”参数,并根据实际情况适当调小该参数值,使一些分组为MID的BE节点变为HIGH分组,然后进行数据均衡。

    例如,命令执行后查看到的均衡分数Score如图4所示,如果调小“balance_load_score_threshold”参数值为“0.04”,则会将Score值大于1.04的磁盘中的数据往Score值小于0.96的磁盘中迁移;如果调小“balance_load_score_threshold”参数值为“0.03”,则会将Score值大于1.03的磁盘中的数据往Score值小于0.97的磁盘中迁移,以此类推。

    图4 查看磁盘使用情况

  2. 如果存在分组为HIGH的BE节点,则可以执行以下命令查看历史1000条Tablet调度的记录,并观察是否有执行成功的BALANCE任务,即“Type”为“BALANCE”所在行的“State”列的值为“FINISHED”。

    show proc '/cluster_balance/history_tablets';

    • 是,执行3
    • 否,执行4
    图5 查看Tablet调度记录

  3. 如果有执行成功的BALANCE任务,则说明正在进行数据均衡,数据均衡速度较慢:

    • Master生产者线程每秒扫描一次,每次默认最多生产50个任务。
    • 每个BE节点默认只能同时进行一个数据均衡任务。
    • BE节点之间底层使用curl直接传输文件,默认限速50Mbps。

  4. 如果“history_tablets”中BALANCE任务状态均为CANCEL,说明数据均衡任务失败,则需要根据相应的报错信息联系运维人员进行处理。

    常见的报错信息为“wait txn before pre watermark txn xxxx to be finished”,处理方法如下:

    数据均衡前,需要等待该Tablet上已有的事务完成。如果该事务处于异常状态,长时间未完成,会阻塞相应的均衡任务。可使用show transaction where id = xxx;命令查询相应的事务详细信息,取消该事务或排查该事务长时间未完成的原因。

相关文档