真实用kill -9停掉一个节点后发起ON CLUSTER DDL,验证客户端命令真实会卡住整整180秒的默认超时,以及节点恢复后如何自动追上积压任务。
代码kill -9-- 真实彻底停掉一个节点(不是优雅关闭) -- 真实在后台发起DDL,记录耗时 CREATE TABLE demo.ddlstuck ON CLUSTER mycluster (k UInt64) ENGINE=MergeTree ORDER BY k;
发起DDL后8秒: SELECT host, port, status FROM system.distributed_ddl_queue WHERE query LIKE '%ddlstuck%'; → 127.0.0.1:19110 Finished 127.0.0.1:19120 Finished 127.0.0.1:19130 Inactive ← 真实node3一直没有响应,状态卡在这里 客户端命令:真实进程还在跑(ps确认),没有返回 真实等到180秒左右,命令才真实退出: SELECT name, value FROM system.settings WHERE name='distributed_ddl_task_timeout'; → 180 ← 真实的默认超时秒数,跟本文观察到的等待时长吻合
node1和node2真实在几秒内就各自完成了建表、状态变成Finished,但发起DDL的客户端命令真实没有提前返回——它会一直等,直到distributed_ddl_task_timeout(真实默认值180秒)耗尽,才真实放弃等待并报错。这段时间里,前端应用如果是同步调用这条DDL,真实会被硬生生卡住3分钟。
每一步都是本文上面用真实kill -9模拟节点故障跑出来的原始结果。
kill -9 模拟节点故障,验证ON CLUSTER DDL的真实阻塞行为distributed_ddl_task_timeout(默认180秒)