当前 Doris 的均衡策略是以节点为单位的。也就是说,是按照节点整体的负载指标(分片数量和总磁盘利用率)来判断集群负载。并且将数据分片从高负载节点迁移到低负载节点。如果每个节点都增加了一块磁盘,则从节点整体角度看,负载并没有改变,所以无法触发均衡逻辑。
此外,Doris 目前并不支持单个节点内部,各个磁盘间的均衡操作。所以新增磁盘后,不会将数据均衡到新的磁盘。
但是,数据在节点之间迁移时,Doris 会考虑磁盘的因素。比如一个分片从 A 节点迁移到 B 节点,会优先选择 B 节点中,磁盘空间利用率较低的磁盘。
这里我们提供 3 种方式解决这个问题:
重建新表
通过 create table like 语句建立新表,然后使用 insert into select 的方式将数据从老表同步到新表。因为创建新表时,新表的数据分片会分布在新的磁盘中,从而数据也会写入新的磁盘。这种方式适用于数据量较小的情况(几十 GB 以内)。
通过 Decommission 命令
decommission 命令用于安全下线一个 BE 节点。该命令会先将该节点上的数据分片迁移到其他节点,然后在删除该节点。前面说过,在数据迁移时,会优先考虑磁盘利用率低的磁盘,因此该方式可以“强制”让数据迁移到其他节点的磁盘上。当数据迁移完成后,我们在 cancel 掉这个 decommission 操作,这样,数据又会重新均衡回这个节点。当我们对所有 BE 节点都执行一遍上述步骤后,数据将会均匀的分布在所有节点的所有磁盘上。
注意,在执行 decommission 命令前,先执行以下命令,以避免节点下线完成后被删除。
admin set frontend config(“drop_backend_after_decommission” = “false”);
使用 API 手动迁移数据
Doris 提供了HTTP API,可以手动指定一个磁盘上的数据分片迁移到另一个磁盘上。