Механизм автоматического выключателя Elasticsearch и сценарии автоматического выключателя
Механизм автоматического выключателя Elasticsearch и сценарии автоматического выключателя

1. Что такое автоматический выключатель elasticsearch?

Автоматические выключатели — это механизм защиты для эластичного поиска, позволяющий предотвратить чрезмерное потребление ресурсов. Основная цель — предотвратить чрезмерное потребление ресурсов во время бизнес-эластичного поиска и вызвать OutOfMemoryError JVM. Не допускайте слишком высокой загрузки кучи памяти JVM службы elasticsearch, которая может привести к недоступности службы. Благодаря ограничению порогового значения параметра автоматического выключателя кластер elasticsearch перестанет принимать новые запросы и вернет сообщение об ошибке ответа, когда оно превысит заданный порог при ответе на клиентские запросы. Защитите стабильность кластера. Для этой цели Elasticsearch предоставляет различные автоматические выключатели.

2. Классификация упругопоисковых взрывателей

Родительский автоматический выключатель

Родительский предохранитель: В качестве предохранителя самого высокого уровня в автоматическом выключателе кластера эластичного поиска. Используется для мониторинга и управления использованием кучи памяти JVM всего кластера. При срабатывании родительского автоматического выключателя кластер перестает принимать запросы новых клиентов и возвращает исключение автоматического выключателя. Помогает предотвратить истощение ресурсов кластера, накопление запросов и снижение производительности. Улучшение стабильности кластера.

Поддерживаемые параметры:

Язык кода:javascript
копировать
#Максимальный предел памяти кучи, разрешенный родительским предохранителем. Значение по умолчанию — 70 % пространства кучи JVM. Его можно динамически регулировать в соответствии с фактической ситуацией в кластере.
indices.breaker.total.limit: "70%"
#Если родительскому предохранителю необходимо зарезервировать квоту для дочернего предохранителя, значение по умолчанию — true.
indices.breaker.total.use_real_memory: true

Автоматический выключатель полевых данных

Предохранитель данных поля: предохранитель, используемый для оценки объема памяти кучи JVM, необходимой для загрузки данных поля в кэш памяти поля. Это разновидность дополнительного предохранителя. В основном отслеживает ресурсы кучи памяти, потребляемые кэшем полевых данных. При превышении заданного порога возвращается ошибка автоматического выключателя и операция кэша прекращается.

Кэширование данных полей — это механизм, используемый elasticsearch для ускорения таких операций, как агрегированная сортировка. Загрузка данных поля в память для быстрого доступа.

Поддерживаемые параметры:

Язык кода:javascript
копировать
#Верхний предел динамической памяти, которую может использовать автоматический выключатель полевых данных. Значение по умолчанию — 40 % от пространства кучи JVM. Его можно динамически регулировать в соответствии с фактической ситуацией в кластере.
indices.breaker.fielddata.limit:"40%"
#Определите коэффициент использования памяти для кэша полевых данных. Указывает долю дополнительной памяти вне кучи, выделенной для кэша данных поля. Просто используйте значение по умолчанию в популярных бизнес-сценариях.
#Избегайте накладных расходов на память мебели из-за несбалансированных пропорций. Влияет на стабильность и эффективность кэширования полевых данных.
indices.breaker.fielddata.overhead: 1.03

Запросить автоматический выключатель

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

Поддерживаемые параметры:

Язык кода:javascript
копировать
#Запросите верхний предел динамической памяти, которую может использовать автоматический выключатель. Значение по умолчанию — 60 % пространства кучи JVM. Его можно динамически регулировать в соответствии с фактической ситуацией в кластере.
indices.breaker.request.limit: "60%"
#Определяет коэффициент использования памяти для запроса автоматического выключателя. Указывает долю дополнительной памяти вне кучи, выделенной сверх фактической памяти, выделенной для запроса автоматического выключателя. Значение по умолчанию — 1.
indices.breaker.request.overhead : 1

В полете запрашивает автоматический выключатель (запрос предохранителя коробки передач)

Автоматический выключатель запроса на обработку: автоматический выключатель, используемый для управления использованием памяти запросами, передаваемыми в данный момент на уровне HTTP. Это разновидность дополнительного предохранителя. Не допускайте превышения памяти, занимаемой передачей по сети, определенного предела квоты памяти узла.

Запросы на обработку — это запросы, которые передаются и обрабатываются на сетевом уровне. Эти запросы могут включать в себя операции поиска, индексирования, удаления и т. д. При передаче и обработке запросов будут заняты определенные ресурсы памяти.

Поддерживаемые параметры:

Язык кода:javascript
копировать
#Используется для управления объемом динамической памяти, которая может использоваться запросами, передаваемыми в данный момент на уровне HTTP. Значение по умолчанию — 100 % пространства кучи JVM. Ограничено пределом родительского предохранителя.
network.breaker.inflight_requests.limit: "100%"
#Определяет коэффициент накладных расходов памяти для обрабатываемого запроса, который представляет собой долю дополнительной выделенной памяти вне кучи в дополнение к фактической памяти, выделенной для обрабатываемого запроса.
Память #Off-heap используется для обработки метаданных запроса и других служебных данных. Значение по умолчанию — 2.
network.breaker.inflight_requests.overhead: 2

Учет запросов на автоматический выключатель (счетчик запросов на выключатель)

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

Поддерживаемые параметры:

Язык кода:javascript
копировать
#Используется для управления объемом динамической памяти, которую может использовать автоматический выключатель счетчика запросов. Значение по умолчанию — 100 % пространства кучи JVM. Ограничено пределом родительского предохранителя.
indices.breaker.accounting.limit: "100%"
#Определите коэффициент использования памяти для прерывателя счетчика запросов. Указывает долю дополнительной памяти вне кучи, выделенной сверх фактической памяти, выделенной для запроса автоматического выключателя. Значение по умолчанию — 1.
indices.breaker.accounting.overhead: 1

Автомат компиляции скрипта

Автоматический выключатель компиляции скриптов: используется для управления объемом памяти, используемой во время компиляции скриптов.

Скрипт широко используется в различных операциях агрегирования запросов и обновления в elasticsearch. Компиляция скриптов — это процесс преобразования скриптов в исполняемый код. В процессе преобразования будут потребляться определенные ресурсы ЦП и памяти.

Поддерживаемые параметры:

Язык кода:javascript
копировать
#Используется для управления количеством скомпилированных скриптов, разрешенных для клиентских запросов в течение определенного периода времени. Вы можете контролировать скорость компиляции скриптов. Значение по умолчанию — 75/5 м;
# $CONTEXT является заполнителем для определенного имени контекста, например «поиск» или «обновление». В реальном использовании необходимо $CONTEXT Замените соответствующим именем контекста.
script.context.$CONTEXT.max_compilations_rate: "75/5m"

Автоматический выключатель Regex

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

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

Поддерживаемые параметры:

Язык кода:javascript
копировать
#Используется для управления включением обычных сценариев в кластере. Значение по умолчанию ограничено;
script.painless.regex.enabled: "limited"
    -true Включите регулярные выражения без ограничения сложности. Автоматический выключатель регулярного выражения отключен по умолчанию.
    -false Регулярные выражения отключены, использование любого регулярного выражения приведет к ошибке.
    -limited Используя регулярные выражения, задайте сложность регулярных выражений кластера с помощью параметра script.painless.regex.limit-factor.
#Используется для ограничения длины регулярных выражений в скриптах. Elasticsearch рассчитает этот предел на основе длины обычного сценария данных.
#Например: длина символов "foobarbaz" равна 9, если множитель "script.painless.regex.limit-factor" равен 6, то максимальная длина регулярного выражения на основе "foobarbaz" равна 54 (6*9 ), если регулярное выражение. Если выражение превышает этот предел длины, сработает обычный предохранитель и будет возвращено исключение плавкого предохранителя.
script.painless.regex.limit-factor

Язык кода:javascript
копировать
static class MemoryUsage { 
        final long baseUsage; 
        final long totalUsage; 
        final long transientChildUsage; 
        final long permanentChildUsage; 
        MemoryUsage(final long baseUsage, final long totalUsage, final long transientChildUsage, final long permanentChildUsage) { 
            this.baseUsage = baseUsage; 
            this.totalUsage = totalUsage; 
            this.transientChildUsage = transientChildUsage; 
            this.permanentChildUsage = permanentChildUsage; 
        } 
    }

В этом коде класс MemoryUsage используется для представления использования памяти. Он содержит несколько полей, представляющих базовое использование (baseUsage), общее использование (totalUsage), временное дочернее использование (transientChildUsage) и постоянное дочернее использование (permanentChildUsage). Этот статический класс будет вызываться, когда прерыватель подсчитывает использование памяти, чтобы облегчить управление и мониторинг памяти.

Язык кода:javascript
копировать
HierarchyCircuitBreakerService(
        Settings settings,
        List<BreakerSettings> customBreakers,
        ClusterSettings clusterSettings,
        Function<Boolean, OverLimitStrategy> overLimitStrategyFactory
    ) {
        super();
        HashMap<String, CircuitBreaker> childCircuitBreakers = new HashMap<>();
        childCircuitBreakers.put(
            CircuitBreaker.FIELDDATA,
            validateAndCreateBreaker(
                new BreakerSettings(
                    CircuitBreaker.FIELDDATA,
                    FIELDDATA_CIRCUIT_BREAKER_LIMIT_SETTING.get(settings).getBytes(),
                    FIELDDATA_CIRCUIT_BREAKER_OVERHEAD_SETTING.get(settings),
                    FIELDDATA_CIRCUIT_BREAKER_TYPE_SETTING.get(settings),
                    CircuitBreaker.Durability.PERMANENT
                )
            )
        );
        childCircuitBreakers.put(
            CircuitBreaker.IN_FLIGHT_REQUESTS,
            validateAndCreateBreaker(
                new BreakerSettings(
                    CircuitBreaker.IN_FLIGHT_REQUESTS,
                    IN_FLIGHT_REQUESTS_CIRCUIT_BREAKER_LIMIT_SETTING.get(settings).getBytes(),
                    IN_FLIGHT_REQUESTS_CIRCUIT_BREAKER_OVERHEAD_SETTING.get(settings),
                    IN_FLIGHT_REQUESTS_CIRCUIT_BREAKER_TYPE_SETTING.get(settings),
                    CircuitBreaker.Durability.TRANSIENT
                )
            )
        );
        childCircuitBreakers.put(
            CircuitBreaker.REQUEST,
            validateAndCreateBreaker(
                new BreakerSettings(
                    CircuitBreaker.REQUEST,
                    REQUEST_CIRCUIT_BREAKER_LIMIT_SETTING.get(settings).getBytes(),
                    REQUEST_CIRCUIT_BREAKER_OVERHEAD_SETTING.get(settings),
                    REQUEST_CIRCUIT_BREAKER_TYPE_SETTING.get(settings),
                    CircuitBreaker.Durability.TRANSIENT
                )
            )
        );
        for (BreakerSettings breakerSettings : customBreakers) {
            if (childCircuitBreakers.containsKey(breakerSettings.getName())) {
                throw new IllegalArgumentException(
                    "More than one circuit breaker with the name ["
                        + breakerSettings.getName()
                        + "] exists. Circuit breaker names must be unique"
                );
            }
            childCircuitBreakers.put(breakerSettings.getName(), validateAndCreateBreaker(breakerSettings));
        }
        this.breakers = Map.copyOf(childCircuitBreakers);
        this.parentSettings = new BreakerSettings(
            CircuitBreaker.PARENT,
            TOTAL_CIRCUIT_BREAKER_LIMIT_SETTING.get(settings).getBytes(),
            1.0,
            CircuitBreaker.Type.PARENT,
            null
        );
        logger.trace(() -> format("parent circuit breaker with settings %s", this.parentSettings));

        this.trackRealMemoryUsage = USE_REAL_MEMORY_USAGE_SETTING.get(settings);

        clusterSettings.addSettingsUpdateConsumer(
            TOTAL_CIRCUIT_BREAKER_LIMIT_SETTING,
            this::setTotalCircuitBreakerLimit,
            HierarchyCircuitBreakerService::validateTotalCircuitBreakerLimit
        );
        clusterSettings.addSettingsUpdateConsumer(
            FIELDDATA_CIRCUIT_BREAKER_LIMIT_SETTING,
            FIELDDATA_CIRCUIT_BREAKER_OVERHEAD_SETTING,
            (limit, overhead) -> updateCircuitBreakerSettings(CircuitBreaker.FIELDDATA, limit, overhead)
        );
        clusterSettings.addSettingsUpdateConsumer(
            IN_FLIGHT_REQUESTS_CIRCUIT_BREAKER_LIMIT_SETTING,
            IN_FLIGHT_REQUESTS_CIRCUIT_BREAKER_OVERHEAD_SETTING,
            (limit, overhead) -> updateCircuitBreakerSettings(CircuitBreaker.IN_FLIGHT_REQUESTS, limit, overhead)
        );
        clusterSettings.addSettingsUpdateConsumer(
            REQUEST_CIRCUIT_BREAKER_LIMIT_SETTING,
            REQUEST_CIRCUIT_BREAKER_OVERHEAD_SETTING,
            (limit, overhead) -> updateCircuitBreakerSettings(CircuitBreaker.REQUEST, limit, overhead)
        );
        clusterSettings.addAffixUpdateConsumer(
            CIRCUIT_BREAKER_LIMIT_SETTING,
            CIRCUIT_BREAKER_OVERHEAD_SETTING,
            (name, updatedValues) -> updateCircuitBreakerSettings(name, updatedValues.v1(), updatedValues.v2()),
            (s, t) -> {}
        );
        clusterSettings.addSettingsUpdateConsumer(USE_REAL_MEMORY_USAGE_SETTING, this::updateUseRealMemorySetting);

        this.overLimitStrategyFactory = overLimitStrategyFactory;
        this.overLimitStrategy = overLimitStrategyFactory.apply(this.trackRealMemoryUsage);
    }

Класс HierarchyCircuitBreakerService наследует класс CircuitBreakerService и используется для управления и контроля предохранителей. В этом классе родительский предохранитель и каждый дочерний предохранитель определяются в конструкторе. Используется для инициализации объекта автоматического выключателя.

3. Анализ сценария автоматического выключателя

1. Слишком много запросов на агрегирование данных полей данных, что превышает пороговое значение автоматического выключателя.

После того, как кластер активирует автоматический выключатель, мы обычно видим следующую информацию журнала в журнале кластера elasticsearch или информацию об исключении, возвращаемую клиентским API:

Язык кода:javascript
копировать
error:elastic: Error 503 (Service Unavailable): 
[parent] Data too large, data for [<http_request>] would be [34212596438/31.8gb],
 which is larger than the limit of [30804738048/28.6gb], 
 real usage: [34211774560/31.8gb], 
new bytes reserved: [821878/802.6kb] [type=circuit_breaking_exception]

Идеи анализа:

Мы передаем следующееGET _cluster/settingsПолучить параметры автоматического выключателя кластера,Сначала проверим параметры. Проанализируйте, правильно ли настроены параметры.

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

2. Большой объем данных, записанных в индекс, приводит к срабатыванию родительского прерывателя кластера.

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

я участвуюНа третьем этапе специального тренировочного лагеря Tencent Technology Creation 2023 года будет проводиться конкурс сочинений. Соберите команду, чтобы выиграть приз!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose