为什么 nearest_hostname 负载均衡配置在 ClickHouse 中不起作用?
Why does nearest_hostname loadbalancing configuration not work in ClickHouse?
我在配置文件里写了这样的东西
<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>
我的 load_balancing 配置是 nearest_hostname
。
我在集群 clickhouse 上创建了一个 table 并在其上创建了一个分布式 table。
我在s00-r00机器上提交了这个分布式table的全局查询,预计本地查询应该在s00-r00和s01-r00机器上执行。
但是通过监控几个查询测试,除了 s00-r00 机器,我还能够看到它在不同时间在 s01-r00 和 s01-r01 中执行。
如果我的理解是正确的,我配置中的主机名应该符合nearest_hostname
的document description。
为什么它不起作用?
或者这个nearest_hostname
配置标识的主机名不是<remote_servers><clickhouse><shard><replica>
中配置的主机名,而是别的?
需要在 s01-r01 执行少量请求 (<1%) 以检查其可用性并收集其他分片中所有副本的错误统计信息。
另一个原因:在某个时间点,远端副本的错误数量可能会低于近端副本。
https://clickhouse.tech/docs/en/operations/settings/settings/#load_balancing-nearest_hostname
为每个副本计算错误数。每5分钟,将错误数除以2。这样,通过指数平滑计算最近一次的错误数。如果有一个副本的错误数量最少(即最近在其他副本上发生错误),则将查询发送给它。如果有多个副本具有相同的最小错误数,则将查询发送到主机名与配置文件中服务器主机名最相似的副本(对于相同位置的不同字符数,最多两个主机名的最小长度)。
我使用 nearest_hostname 并且它按预期工作,除了距离公式本身很棘手并且将距离计算为许多不同的字母。
s00-r00 -> s01-r00(距离 1)
s00-r00 -> s01-r01(距离 2)
dcx01 --> dcx12 (距离2)
dcx01 --> dcy01 (距离1)
我在配置文件里写了这样的东西
<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>
我的 load_balancing 配置是 nearest_hostname
。
我在集群 clickhouse 上创建了一个 table 并在其上创建了一个分布式 table。
我在s00-r00机器上提交了这个分布式table的全局查询,预计本地查询应该在s00-r00和s01-r00机器上执行。
但是通过监控几个查询测试,除了 s00-r00 机器,我还能够看到它在不同时间在 s01-r00 和 s01-r01 中执行。
如果我的理解是正确的,我配置中的主机名应该符合nearest_hostname
的document description。
为什么它不起作用?
或者这个nearest_hostname
配置标识的主机名不是<remote_servers><clickhouse><shard><replica>
中配置的主机名,而是别的?
需要在 s01-r01 执行少量请求 (<1%) 以检查其可用性并收集其他分片中所有副本的错误统计信息。
另一个原因:在某个时间点,远端副本的错误数量可能会低于近端副本。
https://clickhouse.tech/docs/en/operations/settings/settings/#load_balancing-nearest_hostname
为每个副本计算错误数。每5分钟,将错误数除以2。这样,通过指数平滑计算最近一次的错误数。如果有一个副本的错误数量最少(即最近在其他副本上发生错误),则将查询发送给它。如果有多个副本具有相同的最小错误数,则将查询发送到主机名与配置文件中服务器主机名最相似的副本(对于相同位置的不同字符数,最多两个主机名的最小长度)。
我使用 nearest_hostname 并且它按预期工作,除了距离公式本身很棘手并且将距离计算为许多不同的字母。
s00-r00 -> s01-r00(距离 1)
s00-r00 -> s01-r01(距离 2)
dcx01 --> dcx12 (距离2)
dcx01 --> dcy01 (距离1)