doris数据库数据均衡迁移问题
Q、数据库缩容失败,显示剩余分区不满足最少分区,如何快速找到有问题的表
1、表分区大于现场剩余be节点数,缩容会自动停止,需要调整数据库表分区满足大于3个以上小于现场剩余be节点数
ALTER SYSTEM DECOMMISSION BACKEND "be_host:be_heartbeat_service_port"; 开启安全下线be节点 #例如:ALTER SYSTEM DECOMMISSION BACKEND "192.168.10.172:9050"; 开启安全下线be节点 CANCEL DECOMMISSION BACKEND "be_host:be_heartbeat_service_port"; 关闭be安全下线可通过数据库执行命令:
可以查询到是哪张表不满足缩容要求
DECOMMISSION 命令说明:
该命令用于安全删除 BE 节点。命令下发后,Doris 会尝试将该 BE 上的数据向其他 BE 节点迁移,当所有数据都迁移完成后,Doris 会自动删除该节点。
该命令是一个异步操作。执行后,可以通过 SHOW PROC ‘/backends’; 看到该 BE 节点的 isDecommission 状态为 true。表示该节点正在进行下线。
该命令不一定执行成功。比如剩余 BE 存储空间不足以容纳下线 BE 上的数据,或者剩余机器数量不满足最小副本数时,该命令都无法完成,并且 BE 会一直处于 isDecommission 为 true 的状态。
DECOMMISSION 的进度,可以通过 SHOW PROC ‘/backends’; 中的 TabletNum 查看,如果正在进行,TabletNum 将不断减少。
Q、如何调整数据库表分区,修改表分区到
要继续进行缩容,需要调整表的默认表分区和默认分区,需要都进行调整
修改doris partitions 分区命令
#改全局默认副本数 ALTER TABLE t_face_group SET ("replication_num" = "3"); ##改动态分区专属副本数 ALTER TABLE t_face_group SET ("dynamic_partition.replication_num" = "3"); #改已有分区(示例:先查所有分区,再批量改) #先查分区列表 SHOW PARTITIONS FROM t_face_group; #再批量修改(替换成你的分区名) ##替换特定分区分片数量 ALTER TABLE t_face_group MODIFY PARTITION (p20260301, p20260302) SET ("replication_num" = "3"); ##替换该数据表所有分区分片数量 ALTER TABLE your_table_name MODIFY PARTITION (*) SET ("replication_num" = "3");可以通过
show partitions 查看表分区Q、数据缩容执行成功但是迁移速度缓慢,达不到理论上数据迁移速度怎么办
当我们成功在cluster_manger上执行be节点下线后,有可能会出现短时间有数据在均衡,但是长时间会存在无数据在均衡的问题;
通过命令
show backends; #能查看节点状态,需要下线的节点上使用了多少容量,有多少个数据块需要进行迁移 show proc '/cluster_balance'; #能查看数据均衡的相关情况当数据均衡缓慢时,需要进一步了解doris均衡机制
doris负载均衡的主要思想是,对某些分片,先在低负载的节点上创建一个副本,然后再删除这些分片在高负载节点上的副本。同时,因为不同存储介质的存在,在同一个集群内的不同 BE 节点上,可能存在一种或两种存储介质。我们要求存储介质为 A 的分片在均衡后,尽量依然存储在存储介质 A 中。所以我们根据存储介质,对集群的 BE 节点进行划分。然后针对不同的存储介质的 BE 节点集合,进行负载均衡调度。
可以了解图中三个个主要参数代表含义:
pending_tablets 等待被调度的任务
running_tablets 正在运行的任务
history_tablets 已结束任务
可以通过命令查看三种任务运行情况
查看三种被调度的任务
SHOW PROC '/cluster_balance/pending_tablets'; SHOW PROC '/cluster_balance/running_tablets'; SHOW PROC '/cluster_balance/history_tablets';+----------+--------+-----------------+---------+----------+----------+-------+---------+--------+----------+---------+---------------------+---------------------+---------------------+----------+------+-------------+---------------+---------------------+------------+---------------------+--------+---------------------+-------------------------------+ | TabletId | Type | Status | State | OrigPrio | DynmPrio | SrcBe | SrcPath | DestBe | DestPath | Timeout | Create | LstSched | LstVisit | Finished | Rate | FailedSched | FailedRunning | LstAdjPrio | VisibleVer | VisibleVerHash | CmtVer | CmtVerHash | ErrMsg | +----------+--------+-----------------+---------+----------+----------+-------+---------+--------+----------+---------+---------------------+---------------------+---------------------+----------+------+-------------+---------------+---------------------+------------+---------------------+--------+---------------------+-------------------------------+ | 4203036 | REPAIR | REPLICA_MISSING | PENDING | HIGH | LOW | -1 | -1 | -1 | -1 | 0 | 2019-02-21 15:00:20 | 2019-02-24 11:18:41 | 2019-02-24 11:18:41 | N/A | N/A | 2 | 0 | 2019-02-21 15:00:43 | 1 | 0 | 2 | 0 | unable to find source replica | +----------+--------+-----------------+---------+----------+----------+-------+---------+--------+----------+---------+---------------------+---------------------+---------------------+----------+------+-------------+---------------+---------------------+------------+---------------------+--------+---------------------+-------------------------------+各列的具体含义如下:
TabletId:等待调度的 Tablet 的 ID。一个调度任务只针对一个 Tablet
Type:任务类型,可以是 REPAIR(修复)或 BALANCE(均衡)
Status:该 Tablet 当前的状态,如 REPLICA_MISSING(副本缺失)
State:该调度任务的状态,可能为 PENDING/RUNNING/FINISHED/CANCELLED/TIMEOUT/UNEXPECTED
OrigPrio:初始的优先级
DynmPrio:当前动态调整后的优先级,可能为LOW/NORMAL/HIGH
SrcBe:源端 BE 节点的 ID
SrcPath:源端 BE 节点的路径的 hash 值
DestBe:目的端 BE 节点的 ID
DestPath:目的端 BE 节点的路径的 hash 值
Timeout:当任务被调度成功后,这里会显示任务的超时时间,单位秒
Create:任务被创建的时间
LstSched:上一次任务被调度的时间
LstVisit:上一次任务被访问的时间。这里“被访问”指包括被调度,任务执行汇报等和这个任务相关的被处理的时间点
Finished:任务结束时间
Rate:clone 任务的数据拷贝速率
FailedSched:任务调度失败的次数
FailedRunning:任务执行失败的次数
LstAdjPrio:上一次优先级调整的时间
CmtVer/CmtVerHash/VisibleVer/VisibleVerHash:用于执行 clone 任务的 version 信息
ErrMsg:任务被调度和运行过程中,出现的错误信息
可以通过观察三种任务来判断数据是否正在均衡,例如当需要调度的任务在减少,表示任务正在进行处理,如果正在运行的任务一直在变化,也表示任务正在进行处理,但如果需要调度的任务一直处于峰值一般默认为2000个任务左右,在运行任务一直为0,表示doris调度模块已经积压,无法处理需要调度的任务
积压问题存在的原因(doris的副本均衡逻辑):Doris 的副本均衡逻辑会先增加一个正常副本,然后在删除老的副本,以达到副本迁移的目的。而在删除老副本时,Doris 会等待这个副本上已经开始执行的导入任务完成(当存在大分区的时候例如存在100G以上的表副本),以避免均衡任务影响导入任务。但这样会降低均衡逻辑的执行速度。此时可以通过修改以下参数,让 Doris 忽略这个等待,直接删除老副本:
执行命令:
admin set frontend config ("enable_force_drop_redundant_replica"="true");