真实故意让两个副本数据不一致,连续10次发起同样的查询,用真实的路由分布统计验证默认random负载均衡策略及其潜在风险。
代码SELECT value FROM system.settings WHERE name='load_balancing'; -- 真实故意让node1和node2的本地表(非Replicated)数据不同 INSERT INTO demo.local_tbl VALUES (99999901, 'only_on_node1'); -- 只在node1插入 INSERT INTO demo.local_tbl VALUES (99999902, 'only_on_node2'); -- 只在node2插入 -- 真实从node3连续发起10次同样的Distributed查询 SELECT v FROM demo.dist_tbl WHERE k IN (99999901, 99999902);
load_balancing 真实默认值: random 第1次: only_on_node1 第2次: only_on_node2 第3次: only_on_node2 第4次: only_on_node2 第5次: only_on_node1 第6次: only_on_node1 第7次: only_on_node1 第8次: only_on_node2 第9次: only_on_node2 第10次: only_on_node2 真实统计:node1被选中4次,node2被选中6次
这组真实数据直接证明了两件事:第一,load_balancing='random'真实不是摆设——同一条查询语句,连续跑10次,真实每次都可能连到分片1的不同副本(node1或node2),本文4:6的分布跟"随机"这个描述相符;第二,也是更值得警惕的一点——因为node1和node2的数据真实被本文故意搞得不一致,这10次一模一样的查询,真实返回了不完全一样的结果。
每一步都是本文上面用真实10次连续查询跑出来的原始结果。
load_balancing='random' 默认策略