真实搭建一个2分片(分片1双副本)的3节点集群,插入数据后对比本地表行数与Distributed表汇总结果,揭示分片与副本真实不同的数据分布方式。
代码-- 集群拓扑:分片1(node1+node2两个副本),分片2(node3单副本) CREATE TABLE demo.local_tbl ON CLUSTER mycluster (k UInt64, v String) ENGINE=MergeTree ORDER BY k; CREATE TABLE demo.dist_tbl ON CLUSTER mycluster AS demo.local_tbl ENGINE=Distributed(mycluster, demo, local_tbl, k); INSERT INTO demo.dist_tbl SELECT number, toString(number) FROM numbers(100);
node1本地(demo.local_tbl):count() = 50 node2本地(demo.local_tbl):count() = 50 node3本地(demo.local_tbl):count() = 50 Distributed表汇总:SELECT count() FROM demo.dist_tbl = 100 ← 不是150!
三个节点的本地表加起来是150行,但通过Distributed表查询到的总数真实是100——如果只看本地行数简单相加,很容易得出错误的总量。
node1: min(k)=0 max(k)=98 sum(k)=2450 node2: min(k)=0 max(k)=98 sum(k)=2450 ← 跟node1真实完全一样 node3: min(k)=1 max(k)=99 sum(k)=2500 ← 真实是另外一批数据(奇数k)
每一步都是本文上面用真实3节点集群跑出来的原始结果。
Distributed 表引擎,对比本地行数与集群汇总行数