Облачная платформаAdvanced

Настройка Flow Control 2.0

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Настройте политики управления потоком для вашего Elasticsearch кластера как во входящем, так и в исходящем направлениях, обеспечивая стабильность кластера за счёт защиты от аномального трафика.

Кластер Elasticsearch может быть перегружен из‑за всплесков трафика, вредоносных запросов и внутренней конкуренции за ресурсы, что может привести к сбоям узлов. С помощью таких политик, как ограничение запросов клиентов, обратное давление и анализ шаблонов трафика, управление потоком обеспечивает правильное распределение ресурсов, тем самым защищая кластеры от перегрузки. Это охватывает следующие сценарии:

  • Обработка записей с высокой конкуренцией: снижает риск исключений out-of-memory (OOM) при больших нагрузках записи.
  • Защита безопасности: контролирует доступ по IP‑address, используя чёрные и белые списки.
  • Экстренный ответ: блокирует вредоносный или аномальный трафик одним щелчком.
  • Оптимизация производительности: оптимизирует пороги управления потоком и политики на основе собранной статистики.

Как работает функция

Table 1 политики управления потоком

Политика

Как это работает

Details

HTTP/HTTPS управление потоком

Контролирует трафик доступа клиентов, используя чёрные и белые списки, верхний предел одновременных соединений и ограничение скорости новых попыток соединения.

  • Чёрные и белые списки: белый список имеет приоритет над чёрным. Если IP‑address присутствует в обоих списках, доступ разрешён. Запросы, отправленные через чёрные списки соединений, будут игнорироваться.
  • Concurrent connection limit: Ограничивает общее количество одновременных HTTP‑соединений, чтобы предотвратить перегрузку.
  • New connection limit: Ограничивает количество новых соединений, которые могут устанавливаться в секунду. Параметр warmup_period защищает от всплесков соединений, позволяя трафику расти постепенно и стабильно.

Когда включён HTTP/HTTPS flow control, запросы от IP‑адресов из черного списка всегда отклоняются; для IP‑адресов из белого списка правила flow control не применяются; для остальных IP‑адресов, когда достигается либо concurrent connection limit, либо new connection limit, их запросы отклоняются.

Настройка HTTP/HTTPS Flow Control

Memory-based flow control

Когда использование heap memory превышает предопределённый порог (например, 80 %), система прекращает приём больших запросов, и запускается сборка мусора (GC) для освобождения памяти.

Трафик записи ограничивается путем установки коэффициента backpressure (in_flight_factor) и максимальной задержки обработки запросов (max).

Когда включён memory-based flow control, большие запросы могут задерживаться длительное время, если использование heap memory кластера превышает настроенный порог.

Настройка Memory-based Flow Control

One-click traffic blocking

При срабатывании система немедленно разрывает все клиентские соединения, не включённые в белый список, за исключением соединений, используемых для доступа к Kibana или API O&M и мониторинга, с целью восстановления кластера.

Настройка One-Click Traffic Blocking

Сборка и анализ статистики запросов

Записывает метрики запросов (например, bulk writes и queries) по IP‑адресу клиента и предоставляет их через statistics API для оценки нагрузки кластера и проактивного выявления аномальных шаблонов трафика.

Настройка Request Statistics Sampling and Analysis

Access logging

Записывает URL‑адреса и тела HTTP/HTTPS запросов для анализа нагрузки кластера и клиентских запросов.

Журналы доступа также могут сохраняться в файлы (то есть сохраняться на диск) для упрощения устранения неполадок и анализа производительности.

Включение ведения журнала доступа приводит к дополнительным затратам CPU и памяти, что может замедлить обработку запросов.

Ограничения

Кластеры Elasticsearch 7.6.2 и 7.10.2, созданные после февраля 2023 г., поддерживают только Flow Control 2.0, тогда как кластеры, созданные ранее, поддерживают только Flow Control 1.0.

Вход в Kibana

Войдите в Kibana и перейдите на страницу выполнения команд. Кластеры Elasticsearch поддерживают несколько методов доступа. В этом разделе Kibana используется в качестве примера для описания процедур выполнения.

  1. Войдите в консоль управления CSS.
  2. В панели навигации слева выберите Clusters > Elasticsearch.
  3. В списке кластеров найдите целевой кластер и нажмите Kibana в столбце Operation, чтобы войти в консоль Kibana.
  4. В левой панели навигации выберите Dev Tools.

    Левая часть консоли представляет собой поле ввода команд, а треугольный значок в её правом верхнем углу является кнопкой выполнения. Правая часть отображает результат выполнения.

Настройка управления потоком HTTP/HTTPS

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

  1. Включить управление потоком HTTP/HTTPS.
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.http.enabled": true,
    "flowcontrol.http.allow": ["192.168.0.1/24", "192.168.2.1/24"],
    "flowcontrol.http.deny": "192.168.1.1/24",
    "flowcontrol.http.concurrent": 1000,
    "flowcontrol.http.newconnect": 1000,
    "flowcontrol.http.warmup_period": 0
    }
    }
    Table 2 Параметры настройки управления потоком HTTP/HTTPS

    Параметр

    Тип

    Значение по умолчанию

    Описание

    flowcontrol.http.enabled

    Boolean

    false

    Включить или отключить управление потоком HTTP/HTTPS. При включении управление потоком будет выполняться на основе соответствующих настроек.

    Значение может быть:

    • true: Включить управление потоком HTTP/HTTPS.
    • false: Отключить управление потоком HTTP/HTTPS.

    flowcontrol.http.allow

    List<String>

    Null (no whitelist)

    Белый список IP‑адресов клиентов или CIDR‑блоков, разрешённых для доступа к кластеру, поддерживает:

    • Отдельные IP‑адреса, например, 192.18.0.1.
    • CIDR‑блоки, например, 192.168.0.0/24.
    • Несколько IP‑адресов или CIDR‑блоков, разделённых запятыми (,), например, 192.168.0.1/24, 192.168.2.1/24.

    Setting this parameter to null restores the default value.

    flowcontrol.http.deny

    List<String>

    Null (no blacklist)

    Чёрный список IP‑адресов клиентов или CIDR‑блоков, которым запрещён доступ к кластеру. Белый список имеет приоритет над чёрным списком. Чёрный список поддерживает следующее:

    • Отдельные IP‑адреса, например, 192.18.0.1.
    • CIDR‑блоки, например, 192.168.0.0/24.
    • Несколько IP‑адресов или CIDR‑блоков, разделённых запятыми (,), например, 192.168.0.1/24, 192.168.2.1/24.

    Установка этого параметра в null восстанавливает значение по умолчанию.

    flowcontrol.http.concurrent

    Integer

    Node vCPUs x 600

    Максимальное количество одновременных соединений HTTP/HTTPS, которые может обрабатывать узел.

    Минимальное значение: 10

    Установка этого параметра в null восстанавливает значение по умолчанию.

    flowcontrol.http.newconnect

    Integer

    Node vCPUs x 200

    Максимальное количество новых соединений HTTP/HTTPS, которые могут быть созданы в секунду на узел.

    Минимальное значение: 10

    Установка этого параметра в null восстанавливает значение по умолчанию.

    flowcontrol.http.warmup_period

    Integer

    0 (нет периода грации до достижения полной ёмкости)

    Период грации, в течение которого система постепенно увеличивает нагрузку от нулевого количества HTTP/HTTPS запросов до своей полной, максимальной ёмкости.

    Диапазон значений: 0–10000

    Единица измерения: ms

    Например, если flowcontrol.http.newconnect установлен в 100 и flowcontrol.http.warmup_period установлен в 5000ms, системе требуется 5 секунд, чтобы достичь 100 новых соединений в секунду.

    Установка этого параметра в null восстанавливает значение по умолчанию.

  2. Отключить управление потоком HTTP/HTTPS.
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.http.enabled": false
    }
    }

Настройка управления потоком на основе памяти

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

  1. Включить управление потоком на основе памяти.
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.memory.enabled": true,
    "flowcontrol.memory.heap_limit": "80%"
    }
    }
    Table 3 Параметры управления потоком на основе памяти

    Параметр

    Тип

    Значение по умолчанию

    Описание

    flowcontrol.memory.enabled

    Boolean

    true

    Определяет, включено ли управление потоком на основе памяти. При включении используется мониторинг использования кучи памяти узла, устанавливается порог, и записи ограничиваются, когда достигается этот порог.

    Значение может быть:

    • true: Включить управление потоком на основе памяти.
    • false: Отключить управление потоком на основе памяти.

    flowcontrol.memory.heap_limit

    String

    90% (консервативный порог)

    Порог использования кучи памяти узла. При превышении этого порога активируется механизм обратного давления.

    Диапазон значений: 10%–100%

    • Когда использование кучи памяти превышает этот порог, система прекращает обработку клиентских запросов размером более 64 КБ. Обработка возобновляется только после того, как использование кучи памяти опустится ниже порога.
    • Когда использование кучи памяти находится на пять процентных пунктов ниже этого порога, система продолжает обработку запросов. Однако она ограничивает общий объём читаемых данных до 5% от общей ёмкости кучи памяти за цикл. Этот лимит, который настраивается параметром flowcontrol.memory.once_free_max, создаёт буфер памяти, чтобы предотвратить мгновенное исчерпание ресурсов при возобновлении обработки.
    • Пока использование кучи памяти остаётся выше этого порога, система не может принимать новые клиентские запросы. Если параметр flowcontrol.memory.nudges_gc установлен в true, система будет активно инициировать сборку мусора (GC) и многократно пытаться освободить память, пока использование не опустится ниже порога. Это помогает предотвратить сбой системы, вызванный потенциальными утечками памяти.

    На практике рекомендуется установить этот параметр на 80% или ниже, чтобы зарезервировать heap‑память для задач, не связанных с чтением, например, слияния сегментов.

    Установка этого параметра в null восстанавливает значение по умолчанию.

    flowcontrol.holding.in_flight_factor

    Float

    1.0 (recommended)

    Фактор обратного давления, который контролирует чувствительность memory‑based backpressure. Большее значение указывает на более мощное ограничение записи.

    Value range: ≥ 0.5

    Этот параметр оценивает потенциальное влияние большого входящего запроса на heap‑память. Расчёт выполняется следующим образом: in_flight_factor x Request body size. Полученная оценка затем используется для применения memory‑based backpressure и ограничения пропускной способности.

    Установка этого параметра в null восстанавливает значение по умолчанию.

    flowcontrol.holding.max

    TimeValue

    60s

    Максимальная задержка обработки запросов, допускаемая до того, как запросы будут обрабатываться в соответствии с политикой, определённой параметром flowcontrol.holding.max_strategy.

    Value range: ≥ 15s

    Unit: секунда

    Как правило, вы должны настраивать этот параметр, исходя из настройки flowcontrol.holding.max_strategy.

    • Когда flowcontrol.holding.max_strategy установлен в soft, держите значение этого параметра ниже таймаута запроса клиента. Кроме того, зарезервируйте некоторое время выполнения запроса.
    • Когда flowcontrol.holding.max_strategy установлен в hard, держите значение этого параметра выше таймаута запроса клиента.
    • Когда flowcontrol.holding.max_strategy установлен в keep, этот параметр недействителен.

    Установка этого параметра в null восстанавливает значение по умолчанию.

    flowcontrol.holding.max_strategy

    String

    keep

    Политика обработки или действие, предпринимаемое для запросов, задержанных дольше, чем flowcontrol.holding.max.

    Значение может быть:

    • keep: Сохраняйте состояние обратного давления и ожидайте снижения использования кучи памяти. Сервер определяет, следует ли освобождать запросы, исходя из использования памяти в реальном времени. В этом режиме запросы будут задерживаться, пока использование памяти не упадёт до уровня, позволяющего возобновить обработку. Это может привести к таймауту запроса.
    • soft: Принудительно выполнять запросы, но inFlight circuit breaker решает, отклонять их или нет. inFlight — это встроенный circuit breaker Elasticsearch, предназначенный для предотвращения перегрузки системы. Подробности см. в Circuit breaker settings. Этот режим позволяет запросам, задержанным дольше, чем flowcontrol.holding.max, продолжить выполнение. Однако это всё равно может вызвать всплеск использования памяти и в конечном итоге привести к переполнению памяти.
    • hard: Отклонять запросы немедленно и разрывать соединения клиентов. Это приведёт к потере некоторых запросов.

    Установка этого параметра в null восстанавливает значение по умолчанию.

    flowcontrol.memory.once_free_max

    Строка

    5%

    Максимальный объём памяти (в виде процента от памяти узла), который flow control может освободить за один цикл освобождения. Этот параметр предотвращает чрезмерно агрессивное освобождение памяти, которое может привести к резкому всплеску запросов после снижения давления памяти.

    Диапазон значений: 1%–50%

    Установка этого параметра в null восстанавливает значение по умолчанию.

    flowcontrol.memory.nudges_gc

    Boolean

    true (рекомендовано)

    Определяет, следует ли инициировать сборку мусора (GC) для освобождения памяти, когда давление записи слишком высоко. (Пул соединений backpressure проверяется каждую секунду. Давление записи считается высоким, если все существующие соединения заблокированы и новые запросы записи не могут быть приняты.)

    Значение может быть:

    • true: Инициировать GC.
    • false: Не инициировать GC.

    Установка этого параметра в null восстанавливает значение по умолчанию.

  2. Отключить flow control, основанный на памяти.
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.memory.enabled": false
    }
    }

Настройка One-Click Traffic Blocking

При срабатывании система немедленно разрывает все клиентские соединения, за исключением тех, которые используются для доступа к Kibana или API O&M и мониторинга, в попытке восстановить кластер.

  1. Включить блокировку трафика одним щелчком.
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.break.enabled": true
    }
    }
    Table 4 Параметры настройки блокировки трафика одним щелчком

    Параметр

    Тип

    Значение по умолчанию

    Описание

    flowcontrol.break.enabled

    Boolean

    false

    Включает ли блокировку трафика одним щелчком (аналог circuit breaker). При включении система немедленно разрывает все клиентские соединения, за исключением соединений, используемых для доступа к Kibana или API O&M и мониторинга.

    Значение может быть:

    • true: Включить блокировку одним щелчком.
    • false: Отключить блокировку одним щелчком.
  2. Отключить блокировку трафика одним щелчком.
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.break.enabled": false
    }
    }

Настройка выборки и анализа статистики запросов

Собирать метрики запросов по IP-адресу клиента, чтобы помочь выявлять аномальные шаблоны трафика.

  1. Включить выборку статистики запросов.
    PUT _cluster/settings
    {
    "transient": {
    "flowcontrol.log.access.enabled": true
    }
    }
    Table 5 Параметры для выборки статистики запросов

    Параметр

    Тип

    Значение по умолчанию

    Описание

    flowcontrol.log.access.enabled

    Boolean

    false

    Определяет, включена ли выборка статистики запросов, то есть собираются ли метрики запросов (например, массовые записи и запросы search/msearch) по IP-адресу клиента.

    Значение может быть:

    • true: Включить выборку статистики запросов.
    • false (по умолчанию): Отключить выборку статистики запросов.

    flowcontrol.log.access.count

    Целое

    10

    Максимальное количество клиентских IP-адресов, отбираемых для выборки.

    Диапазон значений: 0–100

    Установка этого параметра в null восстанавливает значение по умолчанию.

  2. Проверьте отобранную статистику, чтобы проанализировать шаблон трафика и статус управления потоком по клиентскому IP-адресу.
    • Проверьте статус управления потоком всех узлов.
      GET /_nodes/stats/filter/v2
    • Проверьте детали управления потоком всех узлов.
      GET /_nodes/stats/filter/v2?detail
    • Проверьте статус управления потоком указанного узла.
      GET /_nodes/{node_id}/stats/filter/v2
      Table 6 Описание параметра

      Параметр

      Тип

      Значение по умолчанию

      Описание

      node_id

      Строка

      N/A

      Указывает один или несколько узлов кластера.

      • Один узел: введите ID узла.
      • Несколько узлов: введите несколько ID узлов и используйте запятую (,) для их разделения.

      Вы можете выполнить следующую команду для получения ID узлов:

      GET _cat/nodes?s=n&h=n,id&v=true&full_id=true

    Пример ответа:

    {
    "_nodes" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
    },
    "cluster_name" : "css-xxxx",
    "nodes" : {
    "d3qnVIpPTtSoadkV0LQEkA" : {
    "name" : "css-xxxx-ess-esn-1-1",
    "host" : "192.168.x.x",
    "timestamp" : 1672236425112,
    "flow_control" : {
    "http" : {
    "current_connect" : 52,
    "rejected_concurrent" : 0,
    "rejected_rate" : 0,
    "rejected_black" : 0,
    "rejected_breaker" : 0
    },
    "access_items" : [
    {
    "remote_address" : "10.0.0.x",
    "search_count" : 0,
    "bulk_count" : 0,
    "other_count" : 4
    }
    ],
    "holding_requests" : 0
    }
    }
    }
    }
    Table 7 Response parameters

    Parameter

    Description

    current_connect

    Количество HTTP‑соединений с узлом, которое фиксируется независимо от того, включено ли управление потоком. Это значение эквивалентно значению current_open API GET /_nodes/stats/http. Оно отображает текущие клиентские соединения каждого узла.

    rejected_concurrent

    Количество одновременных соединений, отклонённых во время управления потоком.

    Эта метрика доступна только когда flowcontrol.http.enabled установлена в true. Счётчик не будет сбрасываться при отключении управления потоком.

    rejected_rate

    Количество новых соединений, отклонённых во время flow control.

    Этот показатель доступен только когда flowcontrol.http.enabled установлен в true. Счётчик не будет сбрасываться, когда flow control отключён.

    rejected_black

    Количество новых соединений, отклонённых преднастроенным чёрным списком во время flow control.

    Этот показатель доступен только когда flowcontrol.http.enabled установлен в true. Счётчик не будет сбрасываться, когда flow control отключён.

    rejected_breaker

    Количество новых соединений, отклонённых во время one-click traffic blocking.

    Этот показатель доступен только когда flowcontrol.break.enabled установлен в true. Счётчик не будет сбрасываться, когда one-click traffic blocking отключён.

    access_items

    IP-адреса клиентов, недавно получивших доступ к кластеру.

    Количество отобранных IP-адресов клиентов определяется параметром flowcontrol.log.access.count.

    remote_address

    IP-адреса и количество запросов.

    search_count

    Количество раз, когда клиент обращался к базе данных с использованием _search и _msearch.

    bulk_count

    Количество раз, когда клиент обращался к базе данных, используя _bulk.

    other_count

    Количество раз, когда клиент обращался к базе данных, используя другие методы запросов.

    holding_requests

    Количество соединений с текущим узлом, где записи приостановлены из‑за управления потоком.

  3. Отключить выборку статистики запросов.
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.log.access.enabled": false
    }
    }

Настройка Access Logging

Когда Access Logging включён, система записывает URL‑адреса и тела запросов HTTP/HTTPS для анализа нагрузки кластера и запросов. Затем вы можете использовать результат для оптимизации производительности кластера.

  1. Включить Access Logging.
    • Включить Access Logging для всех узлов кластера.
      PUT /_access_log?duration_limit=30s&capacity_limit=1mb
    • Включить Access Logging для указанного узла кластера.
      PUT /_access_log/{node_id}?duration_limit=30s&capacity_limit=1mb
    Table 8 Параметры включения Access Logging

    Параметр

    Тип

    Default Value

    Description

    duration_limit

    String

    30

    Максимальная продолжительность записи доступа. Когда достигается этот предел, запись доступа прекращается.

    Value range: 10 to 120

    Unit: s

    Установка этого параметра в null восстанавливает значение по умолчанию.

    Запись доступа прекращается, когда достигается duration_limit или capacity_limit.

    capacity_limit

    String

    1

    Максимальный размер журнала доступа. Когда размер журнала доступа достигает этого предела, запись доступа прекращается.

    Value range: 1 to 5

    Unit: MB

    Установка этого параметра в null восстанавливает значение по умолчанию.

    Access logging stops when either duration_limit or capacity_limit is reached.

  2. Проверьте журналы доступа.
    • Проверьте журналы доступа всех узлов в кластере.
      GET /_access_log
    • Проверьте журналы доступа указанного узла кластера.
      GET /_access_log/{node_id}

    Пример ответа:

    {
    "_nodes" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
    },
    "cluster_name" : "css-flowcontroller",
    "nodes" : {
    "8x-ZHu-wTemBQwpcGivFKg" : {
    "name" : "css-flowcontroller-ess-esn-1-1",
    "host" : "10.0.0.98",
    "count" : 2,
    "access" : [
    {
    "time" : "2021-02-23 02:09:50",
    "remote_address" : "/10.0.0.98:28191",
    "url" : "/_access/security/log?pretty",
    "method" : "GET",
    "content" : ""
    },
    {
    "time" : "2021-02-23 02:09:52",
    "remote_address" : "/10.0.0.98:28193",
    "url" : "/_access/security/log?pretty",
    "method" : "GET",
    "content" : ""
    }
    ]
    }
    }
    }
    Table 9 Параметры ответа

    Параметр

    Описание

    name

    Имя узла

    host

    IP-адрес узла

    count

    Количество запросов доступа к узлу за статистический период

    access

    Подробная информация о запросах доступа к узлам за статистический период

    время

    Время запроса

    remote_address

    IP-адрес источника и номер порта в запросе

    url

    Исходный URL запроса

    method

    Метод запроса

    content

    Содержимое запроса. Если значение — пустая строка (""), тело запроса отсутствует.

  3. Удалить журналы доступа. Журналы хранятся в памяти. После просмотра журналов их следует быстро удалить, чтобы освободить ресурсы памяти и избежать влияния на производительность системы.
    1. Удалить журналы доступа для всех узлов.
      DELETE /_access_log
    2. Проверьте журналы доступа еще раз, чтобы подтвердить успешное удаление.
      GET /_access_log

Настройка журналирования доступа в файлах

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

  1. Включите журналирование доступа в файлах.
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.log.file.enabled": true
    }
    }
    Table 10 Включение журналирования доступа в файлах

    Параметр

    Тип

    Значение по умолчанию

    Описание

    flowcontrol.log.file.enabled

    Boolean

    false

    Определяет, записывать ли журналы доступа в файлы. При включении журнал каждой запросa доступа записывается в файлы.

    Имя файла журнала: Cluster name_access_log.log. Вы можете просматривать этот файл только через функцию резервного копирования журналов. Подробную информацию о резервном копировании журналов см. в Enabling Log Backup.

    Значение может быть:

    • true: Записывать журналы доступа в файлы.
    • false: Не записывать журналы доступа в файлы.
  2. Отключить логирование доступа в файлах.
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.log.file.enabled": false
    }
    }