真实停止一个副本的fetch并插入多批新数据,验证replication_queue如何真实堆积任务,以及恢复后如何几秒内追平数据。
代码-- 真实模拟node2"跟不上"的场景 SYSTEM STOP FETCHES demo.repl_tbl; -- 在node2上执行 -- node1继续真实插入5批新数据 INSERT INTO demo.repl_tbl SELECT number+10000*1, toString(number) FROM numbers(1000); -- ...(重复5次,每次block递增) SELECT queue_size, absolute_delay FROM system.replicas WHERE table='repl_tbl'; -- 在node2上查 SELECT type, source_replica, new_part_name FROM system.replication_queue WHERE table='repl_tbl';
SELECT queue_size, absolute_delay FROM system.replicas WHERE table='repl_tbl'; → queue_size=5 absolute_delay=2 SELECT type, source_replica, new_part_name FROM system.replication_queue; → GET_PART replica1 all_1_1_0 GET_PART replica1 all_2_2_0 GET_PART replica1 all_3_3_0 GET_PART replica1 all_4_4_0 GET_PART replica1 all_5_5_0 node1: count() = 15000 node2: count() = 10000 ← 真实差了5000行,正好是被跳过的5批
每一批新数据在node1插入之后,真实都会在Keeper里留下一条"replica1有一个新part,动作是get"的记录(本系列上一篇《Keeper》验证过的日志结构),node2因为暂停了fetch,没有真实去执行这些指令,它们就真实原样堆积在了system.replication_queue里,每一条都清楚标注了任务类型(GET_PART)、来源副本(replica1)和目标part名。
SYSTEM START FETCHES demo.repl_tbl; -- 几秒后 SELECT queue_size, absolute_delay FROM system.replicas WHERE table='repl_tbl'; → queue_size=0 absolute_delay=0 SELECT count() FROM demo.repl_tbl; → 15000 ← 真实追平了node1
每一步都是本文上面用真实system.replication_queue跑出来的原始结果。
SYSTEM STOP/START FETCHESsystem.replicas(queue_size/absolute_delay)与 system.replication_queue