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

Настройка Flow Control 1.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 или API мониторинга Elasticsearch не включаются.

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

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

Ведение журнала доступа

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

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

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

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

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

Ограничения

  • Elasticsearch 7.6.2 and Elasticsearch 7.10.2 clusters created after January 2023 support Flow Control 2.0 only, whereas those created before that support Flow Control 1.0 only.
  • Flow control может ухудшить производительность некоторых узлов.
  • Если flow control включен, запросы пользователей, превышающие порог flow control, будут отклонены.
  • Включение memory flow control может ухудшить производительность некоторых запросов поиска или привести к сбоям некоторых запросов поиска в Kibana.
  • Включение access logging может ухудшить производительность кластера.
  • Memory flow control и CPU flow control основаны на путях запросов. Избегайте настройки слишком большого количества путей или слишком длинных путей, так как они могут ухудшить производительность кластера.

Включение HTTP/HTTPS Flow Control для узла

  1. Выполните следующую команду, чтобы включить flow control 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
    }
    }
    Таблица 2 Элементы конфигурации flow control 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

    Integer

    Maximum concurrent HTTP/HTTPS connections.

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

    flowcontrol.http.newconnect

    Integer

    Maximum new connections that can be created for HTTP/HTTPS requests per second.

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

    flowcontrol.http.warmup_period

    Integer

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

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

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

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

    Note

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

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

Включение Memory Flow Control

  1. Включить memory flow control.
    • Выполните следующую команду, чтобы включить memory flow control:
      PUT /_cluster/settings
      {
      "persistent": {
      "flowcontrol.memory.enabled": true,
      "flowcontrol.memory.allow_path": "/index/_search",
      "flowcontrol.memory.heap_limit": "85%"
      }
      }
    • Выполните следующую команду, чтобы включить memory flow control для одного пути запроса.

      Настройте порог использования памяти кучи для пути запроса. Вы можете настроить приоритеты для таких правил порога.

      PUT /_cluster/settings
      {
      "persistent": {
      "flowcontrol.memory.enabled": true,
      "flowcontrol.memory": {
      "flowcontrol_search": {
      "filter_path": "index1/_search",
      "heap_limit": "50%"
      },
      "flowcontrol_bulk": {
      "filter_path": "index*/_bulk",
      "heap_limit": "50%"
      }
      }
      }
      }
    Таблица 3 Элементы конфигурации контроля потока памяти

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

    Тип

    Описание

    flowcontrol.memory.enabled

    Boolean

    Определяет, включать ли контроль потока памяти. Эта функция по умолчанию отключена. Включение контроля потока памяти может незначительно повлиять на производительность узла.

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

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

    flowcontrol.memory.allow_path

    List<String>

    Белый список путей запросов для контроля потока памяти.

    Маршруты из белого списка освобождены от контроля потока памяти. Поддерживаются символы подстановки. По умолчанию API запросов, контролируемые кластером, освобождены от контроля потока памяти. Это предотвращает сбой запросов информации о кластере, когда использование памяти достигает порога.

    Пример:

    • "flowcontrol.memory.allow_path": "/index/_search",
    • "flowcontrol.memory.allow_path": "/index*/_search",
    • "flowcontrol.memory.allow_path": ["/index/_search", "/index1/_bulk"],

    Можно настроить максимум 10 путей. Путь может содержать до 32 символов.

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

    flowcontrol.memory.heap_limit

    String

    Максимальное глобальное использование кучи памяти узлом до срабатывания контроля потока. Значение не может быть меньше 10% от памяти кучи.

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

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

    flowcontrol.memory.*.filter_path

    String

    Пути под контролем памяти потока.

    Значение по умолчанию **, указывая все пути. Если flowcontrol.memory.heap_limit настроено и flowcontrol.memory.*.filter_path не установлен, это указывает, что все пути, кроме путей в whitelist, находятся под контролем. whitelist имеет приоритет над правилом единственного пути. Если путь указан в обоих flowcontrol.memory.allow_path и flowcontrol.memory.*.filter_path, запросы из пути будут разрешены.

    Например, если flowcontrol.memory.allow_path и flowcontrol.memory.*.filter_path установлены в abc/_search, затем abc/_search не будет находиться под контролем потока.

    Максимальная длина: 32 символов

    flowcontrol.memory.*.heap_limit

    String

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

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

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

    Note

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

  2. Выполните следующую команду, чтобы отключить управление памятью потока:
    • Выполните следующую команду, чтобы удалить управление потоками памяти для отдельного пути запроса.

      Перед отключением управления потоком памяти необходимо удалить конфигурацию управления потоком памяти для пути per-request.

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

Добавление глобального белого списка путей для управления потоком

Выполните следующую команду, чтобы добавить глобальный белый список путей для управления потоком:

PUT _cluster/settings
{
"persistent": {
"flowcontrol.path.white_list": "xxxx"
}
}

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

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

Тип

Описание

flowcontrol.path.white_list

List<String>

Пути, освобожденные от управления потоком. Эти пути не затрагиваются управлением потоком памяти, управлением потоком CPU или блокировкой в один клик, но находятся под управлением потока на основе IP‑адреса.

Можно настроить максимум 10 путей. Путь может содержать до 32 символов.

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

ПРИМЕЧАНИЕ:

Рекомендуется не настраивать этот параметр, если он не требуется плагинами.

Note

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

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

  1. Выполните следующую команду, чтобы включить выборку запросов:
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.statics.enabled": true,
    "flowcontrol.statics.threshold": 100,
    "flowcontrol.statics.sample_frequency": 50
    }
    }
    Таблица 5 Элементы конфигурации для выборки запросов

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

    Тип

    Описание

    flowcontrol.statics.enabled

    Boolean

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

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

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

    flowcontrol.statics.threshold

    Целое

    Количество недавних запросов доступа, статистика которых собирается. Значение 100 указывает, что статистика будет собираться для 100 IP-адресов и 100 URL-адресов, которые наиболее часто запрашиваются.

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

    Максимальное значение: 1000

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

    NOTE:
    • Статистика IP-адресов и статистика выборки URL кэшируются на основе времени их доступа. Если количество кэшированных записей достигает порога, настроенного с помощью flowcontrol.statics.threshold, самые ранние записи будут удалены.
    • При выборке URL путь доступа уникально идентифицируется по хешу URL.

    flowcontrol.statics.sample_frequency

    Целое

    Частота выборки пути. Если этот параметр установлен в 100, образцы собираются каждый 100 запросов.

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

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

    Note

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

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

Enable One-Click Traffic Blocking

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

Viewing Flow Control Information

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

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

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

Note

В ответе информация каждого узла разделена. The http поле фиксирует количество одновременных соединений и новых соединений. The memory фиксирует статистику управления потоком памяти. The ip_address поле фиксирует последние IP-адреса клиентов, к которым обращались недавно. The url_sample поле фиксирует последние URL-адреса, которые запрашивались наиболее часто. The cpu поле фиксирует статистику управления потоком CPU.

{
"_nodes" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"cluster_name" : "css-flowcontroller",
"nodes" : {
"ElBRNCMbTj6L1C-Wke-Dnw" : {
"name" : "css-flowcontroller-ess-esn-1-1",
"host" : "10.0.0.133",
"timestamp" : 1613979513747,
"flow_control" : {
"transport" : {
"concurrent_req" : 0,
"rejected_concurrent" : 0,
"rejected_new" : 0,
"rejected_deny" : 0
},
"http" : {
"concurrent_req" : 0,
"rejected_concurrent" : 0,
"rejected_new" : 0,
"rejected_deny" : 0
},
"memory" : {
"memory_allow" : 41,
"memory_rejected" : 0
},
"cpu": {
"rejected_cpu" : 0
}
"ip_address" : [
{
"ip" : "/10.0.0.198",
"count" : 453
},
{
"ip" : "/198.19.49.1",
"count" : 42
}
],
"url_sample" : [
{
"url" : "/*/_search?pretty=true",
"method" : "GET",
"remote_address" : "/10.0.0.198:16763",
"count" : 1
}
]
}
}
}

Таблица 6 Параметры ответа

Параметр

Описание

concurrent_req

Количество TCP‑соединений узла, которое фиксируется независимо от того, включено ли управление потоком. Это значение похоже на значение current_open из GET /_nodes/stats/http API, но меньше, потому что IP‑адреса в белом списке и внутренние IP‑адреса узла не учитываются.

rejected_concurrent

Количество одновременных соединений, отклонённых во время управления потоком HTTP. Отключение управления потоком HTTP не очищает эту запись.

rejected_new

Количество новых соединений, отклонённых во время управления потоком HTTP. Отключение управления потоком HTTP не очищает эту запись.

rejected_deny

Количество запросов, отклонённых на основе чёрного списка во время управления потоком HTTP. Отключение управления потоком HTTP не очищает эту запись.

memory_allow

Количество разрешенных запросов во время контроля потоков памяти. Этот параметр применяется, когда контроль потоков памяти включён, и его значение не очищается после отключения контроля потоков памяти. Запросы из путей в allow_path белый список не записывается. Если allow_path установлен в **, запросы не записываются.

memory_rejected

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

rejected_cpu

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

ip_address

IP‑адреса и количество запросов. Для получения подробностей см Table 7Table 7.

url_sample

Отбор путей запросов. Количество URL‑адресов запроса собирается в соответствии с настроенным временем и интервалом отбора. Для получения подробностей см Table 8.

Table 7 ip_address

Параметр

Описание

ip

IP‑адрес источника для доступа к узлу.

метод

Количество запросов доступа с IP‑адреса.

Таблица 8 url_sample

Параметр

Описание

url

Запрос URL

метод

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

remote_address

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

количество

Сколько раз путь отбирается

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

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

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

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

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

    Тип

    Описание

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

    Параметр

    Описание

    имя

    Имя узла

    хост

    IP-адрес узла

    количество

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

    доступ

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

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

    Параметр

    Описание

    время

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

    remote_address

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

    url

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

    метод

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

    содержание

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

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

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

    DELETE /_access_log

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

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

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

    Параметр

    Тип

    Описание

    flowcontrol.log.file.enabled

    Boolean

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

    Значение:

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

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

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

  1. Выполните следующую команду, чтобы включить управление потоком CPU:
    PUT /_cluster/settings
    {
    "persistent": {
    "flowcontrol.cpu.enabled": true,
    "flowcontrol.cpu.percent_limit": 80,
    "flowcontrol.cpu.allow_path": ["index/_search"]
    }
    }
    Таблица 13 Элементы конфигурации для настройки ведения журнала доступа

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

    Тип

    Описание

    flowcontrol.cpu.enabled

    Булево

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

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

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

    flowcontrol.cpu.percent_limit

    Целое

    Максимальное использование CPU (%) узлом до срабатывания управления потоком.

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

    flowcontrol.cpu.allow_path

    List<String>

    Белый список путей для контроля CPU.

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

    Пример:

    • "flowcontrol.memory.allow_path": "/index/_search",
    • "flowcontrol.memory.allow_path": "/index*/_search",
    • "flowcontrol.memory.allow_path": ["/index/_search", "/index1/_bulk"],

    Можно настроить максимум 10 путей. Путь может содержать до 32 символов.

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

    Note

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

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