> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-trino-dialect.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Маршрутизация с учетом реплик

> Направляйте связанные запросы на одну и ту же реплику ClickHouse Cloud для временных таблиц, сеансов, повторного использования кэша и согласованности чтения после записи

export const EnterprisePlanFeatureBadge = ({feature = 'Эта возможность', support = false, linking_verb_are = false}) => {
  return <div className="enterprisePlanFeatureContainer">
            <div className="enterprisePlanFeatureBadge">
                Возможность тарифа Enterprise
            </div>
            <div>
                <p>{feature} {linking_verb_are ? 'доступны' : 'доступна'} в тарифе Enterprise. {support ? `Чтобы включить эту возможность, обратитесь в службу поддержки.` : 'Чтобы перейти на другой тариф, откройте страницу тарифных планов в облачной консоли.'}</p>
            </div>
        </div>;
};

export const PrivatePreviewBadge = () => {
  return <div className="privatePreviewBadge">
            <div className="privatePreviewIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path d="M5.33301 6.66667V4.66667V4.66667C5.33301 3.194 6.52701 2 7.99967 2V2C9.47234 2 10.6663 3.194 10.6663 4.66667V4.66667V6.66667" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path d="M8.00033 9.33337V11.3334" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path fillRule="evenodd" clipRule="evenodd" d="M11.333 14H4.66634C3.92967 14 3.33301 13.4033 3.33301 12.6666V7.99996C3.33301 7.26329 3.92967 6.66663 4.66634 6.66663H11.333C12.0697 6.66663 12.6663 7.26329 12.6663 7.99996V12.6666C12.6663 13.4033 12.0697 14 11.333 14Z" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            {'Закрытая предварительная версия в ClickHouse Cloud'}
        </div>;
};

<PrivatePreviewBadge />

<EnterprisePlanFeatureBadge feature="Маршрутизация с учетом реплик" support="true" />

Маршрутизация с учетом реплик (также известная как липкие сеансы, липкая маршрутизация или привязка сеанса) направляет связанные запросы на одну и ту же реплику ClickHouse. Используйте ее, если [временные таблицы](/ru/reference/statements/create/table/temporary-table) или [именованное состояние сеанса](/ru/concepts/features/interfaces/http#using-clickhouse-sessions-in-the-http-protocol) должны оставаться доступными между запросами, если связанные запросы должны повторно использовать локальный кэш одной и той же реплики или если требуется [согласованность чтения после записи](#read-after-write-consistency) между записью и последующими операциями чтения.

Она работает по принципу best-effort и не гарантирует изоляцию. Прокси сопоставляет каждое значение маршрутизации с одной репликой. Сопоставление остается стабильным, пока число реплик не изменяется; при масштабировании сервиса значение может быть сопоставлено с другой репликой.

<Warning>
  **Требуется HTTP-интерфейс**

  Маршрутизация с учетом реплик применяется на уровне прокси через [интерфейс HTTP/HTTPS](/ru/concepts/features/interfaces/http) с использованием заголовка `X-ClickHouse-Replica-Tag`.

  Маршрутизация с учетом реплик **в настоящее время недоступна через собственный протокол** (собственный порт, например драйвер [clickhouse-go](/ru/integrations/language-clients/go/index), работающий в режиме собственного протокола по умолчанию). Клиентам собственного протокола необходимо перейти на HTTP и передавать значение маршрутизации в каждом запросе.
</Warning>

<div id="prerequisites">
  ## Предварительные требования
</div>

* Вашему сервису требуется **2 или более реплики**. В сервисе с одной репликой привязывать попросту не к чему.
* По умолчанию доступно на уровне **Enterprise** после выхода возможности в GA.
* Поддерживается в стандартных сервисах ClickHouse Cloud. [BYOC](/ru/products/cloud/guides/infrastructure/deployment-options/byoc/overview) пока не поддерживается.

<div id="configuring-replica-aware-routing">
  ## Настройка маршрутизации с учетом реплик
</div>

Откройте [тикет в службу поддержки](https://clickhouse.com/support/program) и попросите включить HTTP-маршрутизацию запросов к репликам с закреплением сеанса. Укажите ID вашего сервиса и причину, по которой она вам нужна (временные таблицы, состояние сеанса, повторное использование кэша или согласованность чтения после записи). Перезапуск не требуется.

<div id="http-based-routing">
  ## Маршрутизация на основе HTTP
</div>

Чтобы закрепить рабочую нагрузку за репликой, передавайте заголовок `X-ClickHouse-Replica-Tag` через [HTTPS-интерфейс](/ru/concepts/features/interfaces/http). Прокси применяет согласованное хеширование к значению заголовка, поэтому запросы с одинаковым значением направляются к одной и той же реплике, пока число реплик не меняется. Другое значение хешируется независимо и может попасть на ту же или другую реплику, но выбрать, *какой именно* реплике будет соответствовать значение, нельзя.

Используйте существующее имя хоста сервиса. Специальные закреплённые имена хостов или изменения DNS не требуются. Значением заголовка может быть любая строка на ваш выбор, например имя приложения, идентификатор пользователя или метка рабочей нагрузки. Для запросов без заголовка сохраняется обычная балансировка нагрузки.

Указывайте заголовок `X-ClickHouse-Replica-Tag` в каждом запросе:

```bash theme={null}
echo 'SELECT hostName()' | curl \
  -H 'X-ClickHouse-Replica-Tag: my-workload-1' \
  -H 'X-ClickHouse-User: default' \
  -H 'X-ClickHouse-Key: <password>' \
  'https://<host>:8443/' -d @-
```

Для clickhouse-go (v2) укажите `Protocol: clickhouse.HTTP` и передайте заголовок через [параметр подключения `HttpHeaders`](/ru/integrations/language-clients/go/configuration#connection-settings).

<Info>
  `X-ClickHouse-Replica-Tag` обеспечивает закрепление за репликой без создания HTTP-сеанса ClickHouse. Параллельные запросы могут использовать один и тот же тег, не сталкиваясь с `SESSION_IS_LOCKED`.
</Info>

<div id="read-after-write-consistency">
  ### Согласованность чтения после записи
</div>

В сервисе с несколькими репликами запись, выполненная на одной реплике, может быть не видна на других, пока репликация не завершится. Отправьте запись с заголовком `X-ClickHouse-Replica-Tag`, а затем используйте то же значение заголовка при последующих операциях чтения. Прокси направит оба запроса на одну и ту же реплику, поэтому вы сможете прочитать собственную запись, даже если другие реплики всё ещё отстают. Этот подход подходит для рабочих нагрузок, при которых данные записываются, а затем сразу считываются, например для интерактивных приложений или задач ETL, проверяющих вставки перед продолжением работы.

Для более строгих гарантий на всех репликах можно также установить [`select_sequential_consistency`](/ru/reference/settings/session-settings#select_sequential_consistency) в значение `1` в ClickHouse Cloud.

<div id="check-which-replica">
  ### Проверьте, к какой реплике вы подключены
</div>

Снова выполните пример `SELECT hostName()` с тем же значением `X-ClickHouse-Replica-Tag`. Пока число реплик не изменится, вы должны получить то же имя хоста. Другое значение заголовка может соответствовать другой реплике.

<div id="limitations-of-replica-aware-routing">
  ## Ограничения маршрутизации с учетом реплик
</div>

<div id="replica-aware-routing-does-not-guarantee-isolation">
  ### Привязка меняется при изменении числа реплик
</div>

Масштабирование наружу или внутрь меняет кольцо хеширования маршрутизации. В результате запросы с одинаковым значением маршрутизации могут попасть на другую реплику. Если вы используете временные таблицы или настройки на уровне сеанса, будьте готовы создать их заново после переназначения.

<div id="not-workload-isolation">
  ### Маршрутизация с учетом реплик не является изоляцией рабочих нагрузок
</div>

Липкая маршрутизация определяет только то, *какая* реплика обрабатывает запрос. Эта реплика по-прежнему может обслуживать и другой трафик. Для выделенных вычислительных ресурсов используйте [compute-compute separation](/ru/products/cloud/features/infrastructure/warehouses).

<div id="private-networking">
  ### Частное сетевое подключение
</div>

Маршрутизация на основе HTTP работает с [частным сетевым подключением](/ru/products/cloud/guides/security/connectivity/private-networking) на стандартном имени хоста вашего сервиса. Дополнительные записи DNS не требуются.

<div id="replica-aware-routing-requires-http">
  ### Для маршрутизации с учетом реплик требуется HTTP-протокол
</div>

Липкая маршрутизация использует HTTP-заголовок `X-ClickHouse-Replica-Tag`. Собственный бинарный протокол не передает это значение, по которому HTTP-прокси мог бы вычислить хеш, поэтому маршрутизация с учетом реплик недоступна через собственный протокол. Чтобы использовать эту возможность, клиентам собственного протокола необходимо перенести соответствующую рабочую нагрузку на HTTP-интерфейс.

<div id="troubleshooting">
  ## Устранение неполадок
</div>

**Запросы по-прежнему направляются на разные реплики при одном и том же значении маршрутизации**

* Убедитесь, что каждый запрос содержит заголовок `X-ClickHouse-Replica-Tag`.
* Убедитесь, что во всех запросах используется точно одно и то же значение маршрутизации.
* Немного подождите после включения. Изменения могут вступить в силу менее чем за минуту.
* Проверьте, не изменилось ли недавно количество реплик: после масштабирования ожидается переназначение. Используйте `SELECT hostName()`, чтобы определить новое соответствие.
