我在配置文件中写了这样的东西
<yandex>
<remote_servers>
<clickhouse>
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>s00-r00.clickhouse.xxx.net</host>
<port>9000</port>
</replica>
<replica>
<host>s00-r01.clickhouse.xxx.net</host>
<port>9000</port>
</replica>
</shard>
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>s01-r00.clickhouse.xxx.net</host>
<port>9000</port>
</replica>
<replica>
<host>s01-r01.clickhouse.xxx.net</host>
<port>9000</port>
</replica>
</shard>
</clickhouse>
</remote_servers>
</yandex>
我的负载平衡配置是 nearest_hostname
.
我在cluster clickhouse上创建了一个表,并在其上创建了一个分布式表。
我在s00-r00机器上提交了一个关于这个分布式表的全局查询,预期应该在s00-r00和s01-r00机器上执行本地查询。
但是通过监视几个查询测试,除了s00-r00机器之外,我还能够看到它在不同的时间在s01-r00和s01-r01中执行。
如果我的理解是正确的,配置中的主机名应该符合的文档描述 nearest_hostname
. 为什么不起作用?
或者主机名由这个 nearest_hostname
配置不是中配置的主机名 <remote_servers><clickhouse><shard><replica>
,但还有别的吗?
1条答案
按热度按时间vxqlmq5t1#
需要在s01-r01执行少量请求(<1%),以检查it可用性并收集其他碎片中所有副本的错误统计信息。
另一个原因是:在某个时间点上,远副本的错误数可能会低于近副本的错误数。
https://clickhouse.tech/docs/en/operations/settings/settings/#load_balancing-最近的\u主机名
计算每个复制副本的错误数。每5分钟,错误数被2整除。因此,使用指数平滑法计算最近一段时间的误差数。如果有一个副本的错误数最少(即最近在其他副本上发生的错误),则会向其发送查询。如果存在多个具有相同最小错误数的复制副本,则将查询发送到具有与配置文件中服务器的主机名最相似的主机名的复制副本(对于相同位置中不同字符的数目,最多为两个主机名的最小长度)。
我使用的是最接近的主机名,它的工作原理与预期一样,只是距离公式本身很复杂,它用不同的字母数来计算距离。
s00-r00->s01-r00(距离1)
s00-r00->s01-r01(距离2)
dcx01-->dcx12(距离2)
dcx01-->dcy01(距离1)