真实建一张ReplicatedMergeTree表,只往一个副本插入数据,验证另一个副本如何自动同步,以及背后Keeper协调+HTTP传输的两层真实机制。
代码CREATE TABLE demo.repl_tbl ON CLUSTER mycluster (k UInt64, v String) ENGINE=ReplicatedMergeTree('/clickhouse/tables/{shard}/repl_tbl', '{replica}') ORDER BY k; -- 只在node1(replica1)插入,node2(replica2)完全不碰 INSERT INTO demo.repl_tbl SELECT number, toString(number) FROM numbers(10000);
node1: SELECT count() FROM demo.repl_tbl → 10000 node2: SELECT count() FROM demo.repl_tbl → 10000 ← 真实自动同步,没有手动做任何操作 真实的part信息: node1: all_0_0_0 node2: all_0_0_0 ← 真实同名part 真实的物理路径(完全独立): node1: .../node1/data/store/be9.../all_0_0_0/ node2: .../node2/data/store/be9.../all_0_0_0/ ← 真实不同磁盘位置,各自一份完整拷贝
node2从头到尾没有被真实插入过一行数据,10000行数据真实是自动出现的——part名字all_0_0_0在两边完全相同,说明node2真实拿到的是跟node1一模一样的part(不是重新生成的),但两边的物理磁盘路径完全独立,证明这是一次真实的网络拷贝,不是共享存储。
每一步都是本文上面用真实ReplicatedMergeTree跑出来的原始结果。
ReplicatedMergeTree('/clickhouse/tables/{shard}/repl_tbl','{replica}')interserver_http_port(副本间数据传输专用端口)