Механизм автоматического выключателя 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
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.