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

Настройка Flow Control 2.0 для кластера Elasticsearch

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

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

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

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

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

Таблица 1 Политики управления потоком

Политика

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

Подробности

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

  • Вы можете управлять доступом к кластеру по IP‑адресу клиента или подсети с помощью черного списка или белого списка HTTP/HTTPS. Если IP‑адрес находится в черном списке, клиент сразу отключается, и все его запросы отклоняются. Белый список имеет приоритет над черным списком. Если IP‑адрес клиента присутствует и в черном, и в белом списке, его запросы не будут отклоняться.
  • Управление потоком, основанное на одновременных HTTP/HTTPS соединениях, ограничивает общее количество HTTP/HTTPS соединений к узлу в секунду.
  • Управление потоком, основанное на новых HTTP/HTTPS соединениях, ограничивает количество новых соединений к узлу.

Управление потоком памяти

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

Сэмплирование запросов

Сэмплирование запросов может фиксировать доступ клиентских IP‑адресов и тип запросов от клиента. На основе такой статистики вы можете определить трафик доступа конкретных клиентских IP‑адресов и проанализировать трафик записи и запросов от них.

Блокировка трафика в один клик

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

Управление потоком

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

Логирование доступа

Логи доступа фиксируют URL‑адреса и тела HTTP/HTTPS запросов, полученных узлами за определённый период времени. Вы можете проанализировать текущую нагрузку трафика на основе логов доступа.

Ведение логов доступа в файлах

Любой доступ к кластеру записывается в {Имя кластера_access_log.log} файл. Вы можете использовать функцию резервного копирования логов для просмотра детальных логов доступа в OBS.

Ограничения

  • Elasticsearch 7.6.2 и Elasticsearch 7.10.2 кластеры, созданные после января 2023 года, поддерживают только Flow Control 2.0, тогда как кластеры, созданные ранее, поддерживают только Flow Control 1.0.
  • Flow control может ухудшить производительность некоторых узлов.
  • Если flow control включён, запросы пользователей, превышающие порог flow control, будут отклонены.
  • Включение управления потоком памяти может ухудшить производительность некоторых запросов поиска или привести к сбою некоторых запросов поиска Kibana.
  • Включение журналирования доступа может ухудшить производительность кластера.
  • Управление потоком памяти основано на путях запросов. Избегайте настройки слишком большого количества путей или слишком длинных путей, так как они могут ухудшить производительность кластера.

Вход в Kibana

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

  1. Войдите в консоль управления CSS.
  2. В навигационной панели слева выберите Кластеры > Elasticsearch.
  3. В списке кластеров найдите целевой кластер и нажмите Kibana в Операция столбец, чтобы войти в консоль 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

    Определяет, включено ли управление потоком HTTP/HTTPS. По умолчанию управление потоком HTTP/HTTPS отключено. Включение может повлиять на производительность доступа к узлам.

    Значение: true или false

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

    flowcontrol.http.allow

    List<String>

    Белый список IP-адресов.

    Он может содержать несколько IP-адресов и масок подсети, либо списки IP-адресов. Используйте запятые (,) для разделения разных элементов. Пример: xx.xx.xx.xx/24,xx.xx.xx.xx/24, или xx.xx.xx.xx,xx.xx.xx.xx.

    Значение по умолчанию равно null.

    flowcontrol.http.deny

    List<String>

    Черный список IP-адресов.

    Он может содержать несколько IP-адресов и масок подсети, либо списки IP-адресов. Используйте запятые (,) для разделения разных элементов.

    Значение по умолчанию равно null.

    flowcontrol.http.concurrent

    Целое число

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

    Значение по умолчанию: количество доступных ядер на узле × 600.

    flowcontrol.http.newconnect

    Целое число

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

    Значение по умолчанию: количество доступных ядер на узле × 200.

    flowcontrol.http.warmup_period

    Целое число

    Время, необходимое для того, чтобы скорость установки соединения HTTP/HTTPS достигла максимума. Если flowcontrol.http.newconnect установлен на 100 и flowcontrol.http.warmup_period установлен на 5000ms, это указывает на то, что система может создавать до 100 соединений в секунду через 5 секунд.

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

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

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

    Note

    Если все параметры установлены в null, они будут восстановлены до значений по умолчанию.

  2. Выполните следующую команду, чтобы отключить управление потоком HTTP/HTTPS для узлов кластера:
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.http.enabled": false
    }
    }

Включение управления потоком памяти

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

    Элемент конфигурации

    Тип

    Описание

    flowcontrol.memory.enabled

    Boolean

    Указывает, включить ли управление потоками памяти. После включения этой функции использование памяти постоянно мониторится.

    Значение:

    • true
    • false (значение по умолчанию)

    flowcontrol.memory.heap_limit

    String

    Максимальное использование heap memory узла, которое используется в качестве порога для запуска backpressure для flow control.

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

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

    NOTE:
    • Значение по умолчанию 90% от flowcontrol.memory.heap_limit является консервативным порогом. Когда использование heap memory превышает 90%, система прекращает чтение больших запросов, превышающих 64 KB от клиента, пока использование heap memory не уменьшится. Как только использование heap memory снижается до 85%, данные клиента, эквивалентные 5% x максимальная емкость heap memory может быть прочитан. Если использование heap memory остаётся выше 90% в течение длительного времени, запросы клиента не могут обрабатываться. В этом случае запускается алгоритм GC для выполнения сборки мусора, пока использование heap memory не опустится ниже порога.
    • Обычно вы можете установить flowcontrol.memory.heap_limit порог до 80 % или ниже, чтобы гарантировать, что у узла зарезервирована часть памяти кучи для операций, помимо записи данных, таких как запросы Elasticsearch и слияние сегментов.

    flowcontrol.holding.in_flight_factor

    Float

    Коэффициент освобождения обратного давления, который работает аналогично параметру автоматического выключателя network.breaker.inflight_requests.overhead. При превышении использования памяти лимита более высокий показатель этого параметра указывает на более сильное обратное давление, в этом случае запись будет ограничена.

    Диапазон значений: ≥ 0.5

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

    flowcontrol.holding.max

    TimeValue

    Максимальная задержка каждого запроса. Если задержка превышает значение этого параметра, обратное давление может быть прекращено или соединение запроса может быть разорвано. Подробности см. в настройке flowcontrol.holding.max_strategy.

    Диапазон значений: ≥ 15s

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

    flowcontrol.holding.max_strategy

    String

    Политика, применяемая после превышения максимального времени задержки.

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

    • keep (значение по умолчанию): Если использование памяти кучи всё ещё высоко, продолжается обратное давление. Сервер определяет, когда выполнять запрос, исходя из памяти в реальном времени.
    • soft: Запросы будут выполнены, даже если использование памяти кучи всё ещё высоко. The inFlight circuit breaker определит, выполнять запросы или отклонять их.
    • hard: Если использование памяти кучи всё ещё высоко, запросы будут отбрасываться, а клиентские соединения разорвутся.

    flowcontrol.memory.once_free_max

    String

    Максимальный объём памяти, который может быть предоставлен одновременно для приостановленной очереди запросов. Этот параметр помогает предотвратить полную недоступность кластера из‑за низкой доступности памяти при высоком давлении.

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

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

    flowcontrol.memory.nudges_gc

    Boolean

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

    • true (значение по умолчанию)
    • false
    Note

    Если все параметры установлены в null, они будут восстановлены к их значениям по умолчанию.

  2. Выполните следующую команду, чтобы отключить управление потоком памяти:
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.memory.enabled": false
    }
    }

Включение выборки запросов

  1. Выполните следующую команду, чтобы включить выборку запросов:
    PUT _cluster/settings
    {
    "transient": {
    "flowcontrol.log.access.enabled": true
    }
    }
    Таблица 4 Элементы конфигурации для выборки запросов

    Элемент конфигурации

    Тип

    Описание

    flowcontrol.log.access.enabled

    Boolean

    Собирать статистику по IP‑адресам клиентов, которые недавно обращались к кластеру, и количеству запросов от них, включая количество bulk write, search и msearch запросов.

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

    • true
    • false (значение по умолчанию)

    flowcontrol.log.access.count

    Integer

    Количество IP‑адресов клиентов, которые недавно обращались к кластеру. Переключатели статистики IP‑адресов управляют сбором статистики типов запросов и включением журналирования.

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

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

    При включении вы можете проверять соответствующую статистику через Просмотр информации о контроле потока.

    Note

    Если все параметры установлены в null, они будут восстановлены к их значениям по умолчанию.

  2. Выполните следующую команду, чтобы отключить выборку запросов:
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.log.access.enabled": false
    }
    }

Включить блокировку трафика One-Click

  1. Выполните следующую команду, чтобы включить блокировку трафика one-click:
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.break.enabled": true
    }
    }
  2. Выполните следующую команду, чтобы отключить блокировку трафика one-click:
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.break.enabled": false
    }
    }

Просмотр информации о контроле потока

  • Проверьте статус контроля потока всех узлов.
    GET /_nodes/stats/filter/v2
  • Просмотрите детали контроля потока всех узлов.
    GET /_nodes/stats/filter/v2?detail
  • Просмотрите статус контроля потока конкретного узла.
    GET /_nodes/{nodeId}/stats/filter/v2

    {nodeId} указывает ID узла, который вы хотите проверить.

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

{
"_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
}
}
}
}
Таблица 5 Параметры ответа

Параметр

Описание

current_connect

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

rejected_concurrent

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

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

rejected_rate

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

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

rejected_black

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

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

rejected_breaker

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

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

access_items

IP‑адреса клиентов, которые недавно обращались к кластеру.

Значение определяется flowcontrol.log.access.count.

remote_address

IP‑адреса удалённого доступа и количество запросов от них.

search_count

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

bulk_count

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

other_count

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

holding_requests

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

Включение и просмотр журналов доступа

  1. Выполните следующую команду, чтобы включить журналирование доступа:
    • Включить журналирование доступа для всех узлов в кластере.
      PUT /_access_log?duration_limit=30s&capacity_limit=1mb
    • Включить журналирование доступа для указанного узла в кластере.
      PUT /_access_log/{nodeId}?duration_limit=30s&capacity_limit=1mb

      {nodeId} указывает ID узла.

    Таблица 6 Элементы конфигурации для настройки журналирования доступа

    Элемент конфигурации

    Тип

    Описание

    duration_limit

    String

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

    Диапазон значений: 10 до 120

    Единица: s

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

    capacity_limit

    String

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

    Диапазон значений: 1 до 5

    Единица: MB

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

    Note
    • Запись доступа останавливается, когда duration_limit или capacity_limit достигнут.
    • Если все параметры установлены в null, они будут восстановлены к их значениям по умолчанию.
  2. Выполните следующую команду для проверки журналов доступа:
    • API для проверки журналов доступа всех узлов в кластере
      GET /_access_log
    • API для проверки журналов доступа указанного узла в кластере
      GET /_access_log/{nodeId}

      {nodeId} указывает 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" : ""
    }
    ]
    }
    }
    }
    Таблица 7 Параметры ответа

    Параметр

    Описание

    Имя

    Имя узла

    Хост

    IP-адрес узла

    Количество

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

    Доступ

    Подробные сведения о запросах доступа к узлам за статистический период Для получения деталей см Таблица 8.

    Таблица 8 доступ

    Параметр

    Описание

    время

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

    remote_address

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

    url

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

    метод

    Метод, соответствующий пути запроса

    содержание

    Содержание запроса

  3. Выполните следующие команды для удаления журналов доступа.

    API для удаления журналов доступа всех узлов:

    DELETE /_access_log

Включение журналирования доступа в файлах

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

  1. Выполните следующую команду для включения записи журналов доступа в файлы:
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.log.file.enabled": true
    }
    }
    Таблица 9 Элементы конфигурации для включения записи журналов доступа в файлы

    Параметр

    Тип

    Описание

    flowcontrol.log.file.enabled

    Boolean

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

    Значение:

    • true
    • false (значение по умолчанию)

  2. Выполните следующую команду для отключения записи журналов доступа в файлы:
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.log.file.enabled": false
    }
    }