前言
当前使用 Doris 版本为
0.14
某天观察到线上 Doris 集群资源使用情况,发现整体上内存、CPU 使用率较低,为降低成本进行了一波缩容操作。
缩容之后,大部分业务都能正常运行,但对于一些大吞吐的查询速度慢了很多,或者根本跑不出来。
进一步分析发现分区数据分布不均匀,出现的情况是,一部分节点数据多、一部分节点数据少,当查询计划具体分配到 BE 节点体现为部分节点负载高、部分负载低。
一、分区负载均衡
Doris 默认采用 「BeLoad」均衡策略,是按照磁盘负载来均衡数据。在单表来看,可能存在数据无法均衡到每个节点的问题,如:
官方对副本均衡的解释:
尝试使用「分区均衡」策略,尽可能将每个表的数据均分到各节点上,官方文档说明:
FE 参数配置:
二、问题来了
按照上述文档进行操作后,出现问题:
排查后发现,分区均衡有个已知 bug,Github#doris#7213 (在高版本中修复)
大致意思是,如果某个节点上的 SSD 或者 HDD 磁盘没有数据,统计该盘分区副本数量的时候就置为 0,而这个 0 在后期处理的时候直接抛异常,后续操作无法继续进行 …
我看了下,我们目前 仅 HDD 盘上有数据,处理到 SSD 就出问题了。
注
:HDD 和 SSD 都是逻辑上的划分,并不一定是你实际使用的磁盘介质,比如你可能只使用了 SSD,Doris 在处理时还是两种都会处理。
1. 进一步验证
对比 debug log (需要手动开启)和 0.14 源码逻辑:
1)debug log:
2)均衡逻辑片段:
对比可以发现,确实是已知 bug 导致,它这里是要先把两种介质「待均衡的分区副本」全部找出来,然后再进行迁移。
处理 HDD 是没问题的,到了 SSD 抛了异常,导致整个过程没做任何迁移。
2. 解决
将 Doris 升级到更高版本(1.xx),升级了再考虑分区均衡策略。
Doris 升级至 1.1 之后,采用分区均衡策略,数据已均匀分布,如下: