
# 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查看磁盘使用情况   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002227332622.png "点击放大") 
2. 从高级别分组中选择合适的Tablet进行迁移。会先尽量取该节点中磁盘占用空间大的Tablet，然后随机选择一个Tablet添加进pending_tablets队列。
   图2查看pending_tablets队列   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002262412005.png "点击放大") 
3. 从pending_tablets队列中选择任务，添加进running_tablets中执行。
   1. 一个Tablet一般有多个副本，尽量选择所在节点分组高的副本向分组低的副本迁移。
   
   2. 向迁移目的BE节点下发任务，由迁移目的BE节点主动从迁移源BE节点拉取数据。
   
   
   图3查看running_tablets   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002227492410.png "点击放大") 
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查看磁盘使用情况   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002262332061.png "点击放大")
   
   
2. 如果存在分组为HIGH的BE节点，则可以执行以下命令查看历史1000条Tablet调度的记录，并观察是否有执行成功的BALANCE任务，即"Type"为"BALANCE"所在行的"State"列的值为"FINISHED"。 
   **show proc '/cluster_balance/history_tablets';**
   - 是，执行[3]。
   
   - 否，执行[4]。
   
   
   图5查看Tablet调度记录   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002227332626.png "点击放大")
   
   
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* **;**命令查询相应的事务详细信息，取消该事务或排查该事务长时间未完成的原因。
   
   
 
