API анализа репозиториев
Анализирует репозиторий, сообщая о его характеристиках производительности и любых обнаруженных ошибках поведения.
resp = client.perform_request(
"POST",
"/_snapshot/my_repository/_analyze",
params={
"blob_count": "10",
"max_blob_size": "1mb",
"timeout": "120s"
},
)
print(resp) response = client.snapshot.repository_analyze( repository: 'my_repository', blob_count: 10, max_blob_size: '1mb', timeout: '120s' ) puts response
const response = await client.transport.request({
method: "POST",
path: "/_snapshot/my_repository/_analyze",
querystring: {
blob_count: "10",
max_blob_size: "1mb",
timeout: "120s",
},
});
console.log(response); POST /_snapshot/my_repository/_analyze?blob_count=10&max_blob_size=1mb&timeout=120s
Запрос
POST /_snapshot/<repository>/_analyze
Предварительные условия
- Если функции безопасности Elasticsearch включены, у вас должна быть
manageправо доступа к кластеру, чтобы использовать этот API. Дополнительную информацию см. в разделе Права доступа к безопасности.
Описание
Существует множество сторонних систем хранения данных, не все из которых подходят для использования в качестве репозитория снимков Elasticsearch. Некоторые системы хранения данных ведут себя неправильно или имеют низкую производительность, особенно при одновременном доступе нескольких клиентов, как в узлах кластера Elasticsearch.
API анализа репозитория выполняет набор операций чтения и записи в вашем репозитории, которые предназначены для обнаружения неправильного поведения и измерения характеристик производительности вашей системы хранения данных.
Значения параметров по умолчанию для этого API специально низкие, чтобы уменьшить влияние случайного запуска анализа и предоставить разумную отправную точку для ваших исследований. Запустите свой первый анализ со значениями параметров по умолчанию, чтобы проверить наличие простых проблем. При успешном выполнении запустите последовательность анализов с возрастающими размерами, пока не столкнётесь с ошибкой или не достигнете blob_count по крайней мере 2000, max_blob_size по крайней мере 2gb, max_total_data_size по крайней мере 1tb и register_operation_count по крайней мере 100. Всегда указывайте достаточно большой таймаут, возможно, 1h или больше, чтобы дать время каждому анализу завершиться. Выполняйте анализы с использованием многоузлового кластера, аналогичного по размеру вашему производственному кластеру, чтобы обнаружить любые проблемы, возникающие только при доступе к репозиторию сразу многими узлами.
Если анализ завершится с ошибкой, Elasticsearch обнаружил, что ваш репозиторий вел себя неожиданно. Это обычно означает, что вы используете стороннюю систему хранения данных с неправильной или несовместимой реализацией API, который она, как утверждается, поддерживает. В таком случае эта система хранения данных не подходит для использования в качестве репозитория снимков. Вам нужно будет обратиться к поставщику вашей системы хранения данных, чтобы устранить несовместимости, которые обнаруживает Elasticsearch. См. Типы самообслуживаемых репозиториев для получения дополнительной информации.
Если анализ завершится успешно, этот API вернёт подробную информацию о процессе тестирования, включая время выполнения каждой операции (по желанию). Вы можете использовать эту информацию для определения производительности вашей системы хранения данных. Если какая-либо операция завершится с ошибкой или вернёт неверный результат, этот API вернёт ошибку. Если API вернёт ошибку, возможно, он не удалил все данные, которые он записал в репозиторий. В ошибке будет указано местоположение любых оставшихся данных, и этот путь также записывается в журналы Elasticsearch. Вы должны самостоятельно проверить, что это место было очищено правильно. Если в указанном месте всё ещё есть оставшиеся данные, вы должны удалить их вручную.
Если соединение от вашего клиента к Elasticsearch будет закрыто, в то время как клиент ожидает результата анализа, тест будет отменён. Некоторые клиенты настроены на закрытие соединения, если ответ не получен в течение определённого времени ожидания. Анализ занимает много времени, поэтому вам может потребоваться увеличить время ожидания на стороне клиента. При отмене анализа он пытается очистить данные, которые записывал, но может не удалиться все. Путь к оставшимся данным записывается в журналы Elasticsearch. Вы должны самостоятельно проверить, что это место было очищено правильно. Если в указанном месте всё ещё есть оставшиеся данные, вы должны удалить их вручную.
Если анализ завершится успешно, это означает, что он не обнаружил неправильного поведения, но это не гарантирует правильное поведение. Анализ пытается обнаружить распространённые ошибки, но он, безусловно, не обеспечивает 100% охвата. Кроме того, он не тестирует следующее:
- Ваш репозиторий должен выполнять надёжные записи. После записи фрагмента он должен оставаться на месте до его удаления, даже после потери питания или аналогичных катастроф.
- Ваш репозиторий не должен страдать от тихих повреждений данных. После записи фрагмента его содержимое должно оставаться неизменным до тех пор, пока оно не будет преднамеренно изменено или удалено.
- Ваш репозиторий должен работать правильно даже при прерывании связи из кластера. Чтение и запись могут завершиться с ошибкой в этом случае, но они не должны возвращать неверные результаты.
Анализ записывает значительное количество данных в ваш репозиторий, а затем считывает их обратно. Это потребляет пропускную способность сети между кластером и репозиторием, а также объём хранилища и пропускную способность ввода-вывода на сам репозиторий. Вы должны убедиться, что эта нагрузка не влияет на других пользователей этих систем. Анализы учитывают параметры репозитория max_snapshot_bytes_per_sec и max_restore_bytes_per_sec, если они доступны, и параметр кластера indices.recovery.max_bytes_per_sec, который вы можете использовать для ограничения потребляемой ими пропускной способности.
Этот API предназначен для использования людьми в исследовательских целях. Вы должны ожидать изменения параметров запроса и формата ответа в будущих версиях.
Разные версии Elasticsearch могут выполнять разные проверки совместимости репозитория, при этом более новые версии обычно более строги, чем старые. Система хранения данных, прошедшая анализ репозитория с одной версией Elasticsearch, может потерпеть неудачу с другой версией. Это указывает на неправильное поведение, которое не обнаруживалась предыдущей версией. Вам необходимо обратиться к поставщику вашей системы хранения данных, чтобы устранить несовместимости, обнаруженные API анализа репозитория в любой версии Elasticsearch.
Этот API может не работать правильно в кластере смешанных версий.
Детали реализации
Этот раздел документации описывает работу API анализа репозитория в этой версии Elasticsearch, но вы должны ожидать различий в реализации между версиями. Параметры запроса и формат ответа зависят от деталей реализации, поэтому они также могут отличаться в новых версиях.
Анализ состоит из ряда задач на уровне фрагментов, как задано параметром blob_count, и ряда операций сравнения и обмена в линейно упорядоченных регистрах, как задано параметром register_operation_count. Эти задачи распределяются по узлам данных и узлам-мастерам кластера для выполнения.
Для большинства задач на уровне фрагментов исполняющий узел сначала записывает фрагмент в репозиторий, а затем инструктирует некоторые другие узлы в кластере попробовать прочитать только что записанные данные. Размер фрагмента выбирается случайным образом в соответствии с параметрами max_blob_size и max_total_data_size. Если какое-либо из этих чтений завершится неудачей, репозиторий не реализует необходимые семантику чтения после записи, которые требуются Elasticsearch.
Для некоторых задач на уровне фрагментов исполняющий узел будет инструктировать некоторых своих коллег попробовать прочитать данные до завершения процесса записи. Эти чтения допускаются, чтобы завершиться неудачей, но не должны возвращать частичные данные. Если какое-либо чтение возвращает частичные данные, репозиторий не реализует необходимые семантику атомарности, которые требуются Elasticsearch.
Для некоторых задач на уровне фрагментов исполняющий узел перезапишет фрагмент, в то время как его коллеги читают его. В этом случае считанные данные могут исходить как из исходного, так и из перезаписанного фрагмента, но операция чтения не должна возвращать частичные данные или смесь данных из двух фрагментов. Если какое-либо из этих чтений возвращает частичные данные или смесь двух фрагментов, репозиторий не реализует необходимые семантику атомарности, которые требуются Elasticsearch для перезаписи.
Исполняющий узел будет использовать различные методы для записи фрагмента. Например, где это возможно, он будет использовать как однократную, так и многократную загрузку. Аналогичным образом, узлы чтения будут использовать различные методы для считывания данных обратно. Например, они могут считывать весь фрагмент от начала до конца или могут считывать только подмножество данных.
Для некоторых задач на уровне фрагментов исполняющий узел прервёт запись до её завершения. В этом случае он по-прежнему инструктирует некоторых других узлов в кластере попробовать прочитать фрагмент, но все эти чтения должны завершиться неудачей, не найдя фрагмент.
Линейно упорядоченные регистры — это специальные фрагменты, которые Elasticsearch обрабатывает с помощью атомарной операции сравнения и обмена. Эта операция гарантирует правильное и строго согласованное поведение, даже когда к фрагменту обращаются несколько узлов одновременно. Подробная реализация операции сравнения и обмена в линейно упорядоченных регистрах различается в зависимости от типа репозитория. Анализ репозитория проверяет, что неконкурентные операции сравнения и обмена в линейно упорядоченном фрагменте регистра всегда завершаются успешно. Анализ репозитория также проверяет, что конкурентные операции либо завершаются успешно, либо сообщают о конфликте, но не возвращают неверные результаты. Если операция завершается неудачей из-за конфликта, Elasticsearch повторяет операцию до тех пор, пока она не завершится успешно. Большинство операций сравнения и обмена, выполняемых анализом репозитория, атомарно увеличивают счётчик, который представлен фрагментом размером 8 байт. Некоторые операции также проверяют поведение на небольших фрагментах с размерами, отличными от 8 байт.
Параметры пути
-
<repository> - (Обязательно, строка) Имя репозитория снимка для тестирования.
Параметры запроса
-
blob_count - (Необязательно, целое число) Общее количество блобов, которые необходимо записать в репозиторий во время тестирования. По умолчанию значение равно
100. Для реалистичных экспериментов следует установить это значение как минимум на2000. -
max_blob_size - (Необязательно, единицы измерения размера) Максимальный размер блоба, который необходимо записать во время тестирования. По умолчанию значение равно
10mb. Для реалистичных экспериментов следует установить это значение как минимум на2gb. -
max_total_data_size - (Необязательно, единицы измерения размера) Максимальный общий размер всех блобов, записываемых во время тестирования. По умолчанию значение равно
1gb. Для реалистичных экспериментов следует установить это значение как минимум на1tb. -
register_operation_count - (Необязательно, целое число) Минимальное количество линейно выполняемых операций регистрации. По умолчанию значение равно
10. Для реалистичных экспериментов следует установить это значение как минимум на100. -
timeout - (Необязательно, единицы измерения времени) Указывает период времени, в течение которого следует ожидать завершения теста. Если ответ не будет получен до истечения времени ожидания, тест будет отменён и возвращено сообщение об ошибке. По умолчанию значение равно
30s.
Дополнительные параметры запроса
Следующие параметры позволяют дополнительно управлять анализом, но обычно их корректировать не требуется.
-
concurrency - (Необязательно, целое число) Количество операций записи, выполняемых одновременно. По умолчанию значение равно
10. -
read_node_count - (Необязательно, целое число) Количество узлов, на которых выполняется операция чтения после записи каждого блоба. По умолчанию значение равно
10. -
early_read_node_count - (Необязательно, целое число) Количество узлов, на которых выполняется предварительная операция чтения во время записи каждого блоба. По умолчанию значение равно
2. Предварительные операции чтения выполняются лишь в редких случаях. -
rare_action_probability - (Необязательно, double) Вероятность выполнения редкого действия (предварительного чтения, перезаписи или прерванной записи) для каждого блоба. По умолчанию значение равно
0.02. -
seed - (Необязательно, целое число) Зерно для генератора псевдослучайных чисел, используемого для генерации списка операций, выполняемых во время теста. Чтобы повторить один и тот же набор операций в нескольких экспериментах, используйте одно и то же зерно в каждом эксперименте. Обратите внимание, что операции выполняются одновременно, поэтому они могут не всегда происходить в одном и том же порядке при каждом запуске.
-
detailed - (Необязательно, boolean) Возвращать ли подробные результаты, включая информацию о времени выполнения каждой операции, проведённой во время анализа. По умолчанию значение равно
false, что означает возвращение только сводки анализа. -
rarely_abort_writes - (Необязательно, boolean) Периодически ли прерывать некоторые запросы на запись. По умолчанию значение равно
true.
Тело ответа
Ответ раскрывает детали реализации анализа, которые могут изменяться от версии к версии. Поэтому формат тела ответа не считается стабильным и может отличаться в новых версиях.
-
coordinating_node -
(объект) Идентифицирует узел, который координировал анализ и выполнил окончательную очистку.
Свойства
coordinating_node-
id - (строка) Идентификатор координирующего узла.
-
name - (строка) Название координирующего узла
-
-
repository - (строка) Название репозитория, который был объектом анализа.
-
blob_count - (целое число) Количество блоков, записанных в репозиторий во время теста, равно параметру запроса
?blob_count. -
concurrency - (целое число) Количество операций записи, выполняемых одновременно во время теста, равно параметру запроса
?concurrency. -
read_node_count - (целое число) Ограничение на количество узлов, на которых выполнялись операции чтения после записи каждого блока, равно параметру запроса
?read_node_count. -
early_read_node_count - (целое число) Ограничение на количество узлов, на которых выполнялись ранние операции чтения после записи каждого блока, равно параметру запроса
?early_read_node_count. -
max_blob_size - (строка) Ограничение на размер блока, записанного во время теста, равно параметру
?max_blob_size. -
max_blob_size_bytes - (длинное целое число) Ограничение в байтах на размер блока, записанного во время теста, равно параметру
?max_blob_size. -
max_total_data_size - (строка) Ограничение на общий размер всех блоков, записанных во время теста, равно параметру
?max_total_data_size. -
max_total_data_size_bytes - (длинное целое число) Ограничение в байтах на общий размер всех блоков, записанных во время теста, равно параметру
?max_total_data_size. -
seed - (длинное целое число) Зерно для генератора псевдослучайных чисел, используемого для генерации операций, используемых во время теста. Равно параметру запроса
?seed, если он задан. -
rare_action_probability - (двойное число) Вероятность выполнения редких действий во время теста. Равно параметру запроса
?rare_action_probability. -
blob_path - (строка) Путь в репозитории, в котором все блоки были записаны во время теста.
-
issues_detected - (список) Список выявленных проблем корректности, который будет пустым, если API успешно выполнился. Включено для подчеркивания того, что успешный ответ не гарантирует правильного поведения в будущем.
-
summary -
(объект) Коллекция статистических данных, которые обобщают результаты теста.
Свойства
summary-
write -
(объект) Коллекция статистических данных, которые обобщают результаты операций записи в тесте.
Свойства
write-
count - (целое число) Количество операций записи, выполненных в тесте.
-
total_size - (строка) Общий размер всех блоков, записанных в тесте.
-
total_size_bytes - (длинное целое число) Общий размер всех блоков, записанных в тесте, в байтах.
-
total_throttled - (строка) Общее время ожидания из-за ограничения
max_snapshot_bytes_per_sec. -
total_throttled_nanos - (длинное целое число) Общее время ожидания из-за ограничения
max_snapshot_bytes_per_secв наносекундах. -
total_elapsed - (строка) Общее время, затраченное на запись блоков в тесте.
-
total_elapsed_nanos - (длинное целое число) Общее время, затраченное на запись блоков в тесте, в наносекундах.
-
-
read -
(объект) Коллекция статистических данных, которые обобщают результаты операций чтения в тесте.
Свойства
read-
count - (целое число) Количество операций чтения, выполненных в тесте.
-
total_size - (строка) Общий размер всех блоков или частичных блоков, прочитанных в тесте.
-
total_size_bytes - (длинное целое число) Общий размер всех блоков или частичных блоков, прочитанных в тесте, в байтах.
-
total_wait - (строка) Общее время ожидания первого байта каждого запроса чтения.
-
total_wait_nanos - (длинное целое число) Общее время ожидания первого байта каждого запроса чтения в наносекундах.
-
max_wait - (строка) Максимальное время ожидания первого байта любого запроса чтения.
-
max_wait_nanos - (длинное целое число) Максимальное время ожидания первого байта любого запроса чтения в наносекундах.
-
total_throttled - (строка) Общее время ожидания из-за ограничений
max_restore_bytes_per_secилиindices.recovery.max_bytes_per_sec. -
total_throttled_nanos - (длинное целое число) Общее время ожидания из-за ограничений
max_restore_bytes_per_secилиindices.recovery.max_bytes_per_secв наносекундах. -
total_elapsed - (строка) Общее время, затраченное на чтение блоков в тесте.
-
total_elapsed_nanos - (длинное целое число) Общее время, затраченное на чтение блоков в тесте, в наносекундах.
-
-
-
details
-
(массив) Описание каждой операции чтения и записи, выполненной во время теста. Возвращается только в том случае, если параметр запроса
?detailedимеет значениеtrue.Свойства элементов в
details-
blob -
(объект) Описание фрагмента, который был записан и прочитан.
Свойства
blob-
name - (строка) Имя фрагмента.
-
size - (строка) Размер фрагмента.
-
size_bytes - (целое) Размер фрагмента в байтах.
-
read_start - (целое) Позиция, в байтах, с которой начались операции чтения.
-
read_end - (целое) Позиция, в байтах, по которой завершились операции чтения.
-
read_early - (булево) Были ли начаты какие-либо операции чтения до завершения операции записи?
-
overwritten - (булево) Было ли фрагмент перезаписан во время выполнения операций чтения?
-
-
writer_node -
(объект) Указывает узел, который записал этот фрагмент и координировал операции чтения.
Свойства
writer_node-
id - (строка) Идентификатор узла-записьщика.
-
name - (строка) Название узла-записьщика.
-
-
write_elapsed - (строка) Затраченное время на запись этого фрагмента.
-
write_elapsed_nanos - (целое) Затраченное время на запись этого фрагмента в наносекундах.
-
overwrite_elapsed - (строка) Затраченное время на перезапись этого фрагмента. Пропускается, если фрагмент не был перезаписан.
-
overwrite_elapsed_nanos - (целое) Затраченное время на перезапись этого фрагмента в наносекундах. Пропускается, если фрагмент не был перезаписан.
-
write_throttled - (строка) Время ожидания ограничения
max_snapshot_bytes_per_sec(илиindices.recovery.max_bytes_per_sec, если установлены параметры восстановления для управляемых служб), при записи этого фрагмента. -
write_throttled_nanos - (целое) Время ожидания ограничения
max_snapshot_bytes_per_sec(илиindices.recovery.max_bytes_per_sec, если установлены параметры восстановления для управляемых служб), при записи этого фрагмента в наносекундах. -
reads -
(массив) Описание каждой операции чтения, выполненной над этим фрагментом.
Свойства элементов в
reads-
node -
(объект) Указывает узел, который выполнил операцию чтения.
Свойства
node-
id - (строка) Идентификатор узла-читателя.
-
name - (строка) Название узла-читателя.
-
-
before_write_complete - (булево) Может ли операция чтения начаться до завершения операции записи. Пропускается, если
false. -
found - (булево) Был ли фрагмент найден этой операцией чтения или нет. Может быть
false, если чтение началось до завершения записи, или запись была прервана до завершения. -
first_byte_time - (строка) Время ожидания первого байта для операции чтения. Пропускается, если фрагмент не был найден.
-
first_byte_time_nanos - (целое) Время ожидания первого байта для операции чтения в наносекундах. Пропускается, если фрагмент не был найден.
-
elapsed - (строка) Время, затраченное на чтение этого фрагмента. Пропускается, если фрагмент не был найден.
-
elapsed_nanos - (целое) Время, затраченное на чтение этого фрагмента в наносекундах. Пропускается, если фрагмент не был найден.
-
throttled - (строка) Время ожидания из-за ограничений
max_restore_bytes_per_secилиindices.recovery.max_bytes_per_secпри чтении этого фрагмента. Пропускается, если фрагмент не был найден. -
throttled_nanos - (целое) Время ожидания из-за ограничений
max_restore_bytes_per_secилиindices.recovery.max_bytes_per_secпри чтении этого фрагмента в наносекундах. Пропускается, если фрагмент не был найден.
-
-
-
listing_elapsed - (строка) Время, затраченное на получение списка всех фрагментов в контейнере.
-
listing_elapsed_nanos - (целое) Время, затраченное на получение списка всех фрагментов в контейнере в наносекундах.
-
delete_elapsed - (строка) Время, затраченное на удаление всех фрагментов в контейнере.
-
delete_elapsed_nanos - (целое) Время, затраченное на удаление всех фрагментов в контейнере в наносекундах.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/repo-analysis-api.html