Skip to main content
这些设置可在 system.settings 中查看,并根据 源码 自动生成。

load_balancing

指定在分布式查询处理中使用的副本选择算法。 ClickHouse 支持以下副本选择算法: 另请参阅:

Random (默认)

会统计每个副本的错误次数。查询会发送到错误最少的副本;如果有多个副本都满足这一条件,则会发送到其中任意一个。 缺点:不考虑服务器的距离;如果各副本中的数据不同,得到的数据也会不同。

最近的主机名

每个副本都会统计错误数。每 5 分钟,错误数都会整除 2。这样一来,近期一段时间内的错误数就会以指数平滑平均值的方式计算出来。如果某个副本的错误数最少 (即其他副本最近出现过错误) ,则查询会发送到该副本。如果有多个副本的最少错误数相同,则查询会发送到这样一个副本:其主机名与配置文件中服务器的主机名最为相似 (依据是两个主机名在相同位置上不同字符的数量,比较长度不超过两者中的较小值) 。 例如,example01-01-1 和 example01-01-2 只有 1 个位置不同,而 example01-01-1 和 example01-02-2 则有 2 个位置不同。 这种方法看起来可能比较简单,但它不需要关于网络拓扑的外部数据,也不比较 IP 地址;而对于我们的 IPv6 地址来说,比较 IP 地址会很复杂。 因此,如果存在等效的副本,则会优先选择名称最接近的那个。 我们还可以认为,在没有发生故障的情况下,如果将查询发送到同一台服务器,那么分布式查询也会发送到相同的服务器。因此,即使不同的数据存放在各个副本上,查询返回的结果通常也会基本相同。

主机名的 Levenshtein 距离

nearest_hostname 类似,但它会根据 Levenshtein 距离 来比较主机名。例如:

主机名最长公共前缀

nearest_hostname 类似,但会优先选择主机名与本地主机名具有最长公共前缀的副本 (公共前缀越长,优先级越高) 。不同于 nearest_hostname 按字符位置逐一统计差异,这种策略不会因主机名中数字分段的长度不同而受到干扰。例如,对于本地主机名 sfe301
这里会优先选择 sfe10101,因为它与 sfe301 具有最长的公共前缀 (sfe,长度为 3) 。 公共前缀长度相同的副本会被随机选中。特别是,当没有任何副本与本地主机名共享前缀时 (即所有公共前缀长度都为 0) ,此策略的行为与 random 完全相同。

主机名最长公共后缀

hostname_longest_common_prefix 类似,但这里比较的是最长公共 后缀,而不是前缀。当数据中心标识被编码到主机名的后缀中时,这一点会很有用。例如,对于本地主机名 et46gtghn.qc.localdomain
这里会优先选择 ab999.qc.localdomain,因为它与 et46gtghn.qc.localdomain 共享最长的公共后缀 (.qc.localdomain,长度为 15) 。 如果副本的公共后缀长度相同,则会随机选择。特别是,当没有任何副本与本地主机名共享任何后缀时 (即所有公共后缀长度都为 0) ,此策略的行为与 random 完全一致。

按顺序

错误数量相同的副本将按照它们在配置中声明的顺序依次访问。 当你明确知道哪个副本更优先时,这种方法比较合适。

第一个或随机

该算法会选择集合中的第一个副本;如果第一个不可用,则随机选择一个副本。它在交叉复制拓扑中效果很好,但在其他配置中则没有什么作用。 first_or_random 算法解决了 in_order 算法存在的问题。使用 in_order 时,如果某个副本宕机,下一个副本会承受双倍负载,而其余副本仍处理平常的流量。使用 first_or_random 算法时,负载会在仍然可用的副本之间均匀分配。 可以通过设置 load_balancing_first_offset 来显式指定哪个副本是第一个副本。这样可以更好地控制在各副本之间重新平衡查询工作负载。

轮询

该算法会在错误数相同的副本之间采用轮询策略 (仅将采用 round_robin 策略的查询计入统计) 。

load_balancing_first_offset

在使用 FIRST_OR_RANDOM 负载均衡策略时,优先将查询发送到哪个副本。
最后修改于 2026年7月23日