Почему в ClickHouse не работает конфигурация балансировки нагрузки имени_ближайшего_хоста? - PullRequest
0 голосов
/ 15 марта 2020

Я написал что-то подобное в моем файле конфигурации

<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 и распределенную таблицу на нем.

Я отправил глобальный запрос к этой распределенной таблице на машине s00-r00, и ожидалось, что локальные запросы должны быть выполнены на машинах s00-r00 и s01-r00.

Но, наблюдая за несколькими тестами запросов, в дополнение к машине s00-r00, я смог увидеть, как она выполняется в s01-r00 и s01-r01 в разное время.

Если я понимаю правильно, имя хоста в моей конфигурации должно соответствовать описанию документа из nearest_hostname. Почему это не сработало?

Или имя хоста, определенное этой конфигурацией nearest_hostname, не имя хоста, настроенное в <remote_servers><clickhouse><shard><replica>, а что-то еще?

1 Ответ

0 голосов
/ 16 марта 2020

Небольшое количество запросов (<1%) необходимо выполнить на s01-r01, чтобы проверить его доступность и собрать статистику ошибок всех реплик в других шардах. </p>

Другая причина: в какой-то момент времени количество ошибок в удаленной реплике может стать меньше, чем в ближней реплике.

https://clickhouse.tech/docs/en/operations/settings/settings/#load_balancing -nearest_hostname

Количество ошибок подсчитывается для каждой реплики. Каждые 5 минут количество ошибок делится на целое число 2. Таким образом, количество ошибок вычисляется за последнее время с экспоненциальным сглаживанием. Если существует одна реплика с минимальным количеством ошибок (т. Е. Ошибки, произошедшие недавно в других репликах), запрос отправляется на нее. Если существует несколько реплик с одинаковым минимальным количеством ошибок, запрос отправляется в реплику с именем хоста, которое наиболее похоже на имя хоста сервера в файле конфигурации (для числа различных символов в одинаковых позициях, до минимальная длина обоих имен хостов).

Я использую имя_хоста_почты, и оно работает, как и ожидалось, за исключением того, что сама формула расстояния хитрая и вычисляет расстояние как число различных букв.

s00-r00 -> s01-r00 (расстояние 1)

s00-r00 -> s01-r01 (расстояние 2)

dcx01 -> dcx12 (расстояние 2)

dcx01 -> dcy01 (расстояние 1)

...