Недостаточно узлов для распределения всех реплик фрагментов
Распределение копий данных (реплик фрагментов индекса) по разным узлам позволяет распараллелить обработку запросов, ускоряя поисковые запросы. Этого можно достичь, увеличив количество реплик фрагментов до максимального значения (общее количество узлов минус один), что также защищает от сбоев оборудования. Если у индекса есть предпочтительный уровень, Elasticsearch разместит копии данных для этого индекса только на узлах целевого уровня.
Если возникает предупреждение о недостаточном количестве узлов для распределения всех реплик фрагментов, можно повлиять на это поведение, добавив больше узлов в кластер (или уровень, если используются уровни) или уменьшив значение параметра индекса index.number_of_replicas.
Для решения этой проблемы выполните следующие действия:
Один из способов назначить реплики фрагментов — добавить зону доступности. Это увеличит количество узлов данных в кластере Elasticsearch, что позволит назначить реплики фрагментов. Это можно сделать, отредактировав развертывание. Но сначала нужно определить, к какому уровню индекс нацелен для назначения. Для этого используйте Kibana.
Использование Kibana
- Войдите в консоль Elastic Cloud.
-
На панели Услуга Elasticsearch щелкните имя вашего развертывания.
Если имя вашего развертывания отключено, ваши экземпляры Kibana могут быть неисправны. В таком случае обратитесь в службу поддержки Elastic. Если в ваше развертывание не включен Kibana, вам нужно сначала его включить.
-
Откройте меню навигации развертывания (расположенное под логотипом Elastic в верхнем левом углу) и перейдите к Dev Tools > Console.
Для проверки уровня, на который нацелен индекс для назначения, используйте API получения настроек индекса для извлечения настроенного значения параметра index.routing.allocation.include._tier_preference:
resp = client.indices.get_settings(
index="my-index-000001",
name="index.routing.allocation.include._tier_preference",
flat_settings=True,
)
print(resp) response = client.indices.get_settings( index: 'my-index-000001', name: 'index.routing.allocation.include._tier_preference', flat_settings: true ) puts response
const response = await client.indices.getSettings({
index: "my-index-000001",
name: "index.routing.allocation.include._tier_preference",
flat_settings: "true",
});
console.log(response); GET /my-index-000001/_settings/index.routing.allocation.include._tier_preference?flat_settings
Ответ будет выглядеть следующим образом:
{
"my-index-000001": {
"settings": {
"index.routing.allocation.include._tier_preference": "data_warm,data_hot"
}
}
} | Представляет собой список значений ролей узлов уровня данных, разделенных запятыми, на которых разрешено размещение этого индекса. Первый элемент в списке имеет более высокий приоритет, т.е. уровень, на который нацелен индекс. Например, в данном примере предпочтительный уровень — |
Теперь, когда вы знаете уровень, вам нужно увеличить количество узлов на этом уровне, чтобы реплики могли быть распределены. Для этого можно либо увеличить размер по зонам, чтобы увеличить количество узлов в зонах доступности, которые вы уже использовали, или увеличить количество зон доступности. Вернитесь на страницу развертывания, нажав на три горизонтальные полосы в верхнем левом углу экрана и выбрав Управление этим развертыванием. На этой странице нажмите кнопку Управление и выберите Изменить развертывание. Обратите внимание, что для этого необходимо войти в https://cloud.elastic.co/. В разделе Elasticsearch найдите уровень, где реплики фрагментов не могут быть назначены.
-
Вариант 1: Увеличение размера по зонам
- Посмотрите на значения в раскрывающемся списке Размер по зонам. На каждый 64 ГБ оперативной памяти, которые вы выберете здесь, создается один узел в каждой зоне. Если у вас сейчас выбрано 64 ГБ оперативной памяти или меньше, у вас есть по одному узлу в каждой зоне. Если вы выберете 128 ГБ оперативной памяти, вы получите 2 узла на каждую зону. Если вы выберете 192 ГБ оперативной памяти, вы получите 3 узла на каждую зону и так далее. Если значение меньше максимального возможного, вы можете выбрать более высокое значение для этого уровня, чтобы добавить больше узлов.
-
Вариант 2: Увеличение количества зон доступности
- Найдите выбор Зоны доступности. Если их меньше 3, вы можете выбрать большее количество зон доступности для этого уровня.
Если увеличить размер по зонам или количество зон доступности невозможно, можно уменьшить количество реплик данных вашего индекса. Для этого проинспектируем настройку индекса index.number_of_replicas и уменьшим настроенное значение.
- Доступ к Kibana, как описано выше.
-
Проинспектируйте настройку индекса
index.number_of_replicas.resp = client.indices.get_settings( index="my-index-000001", name="index.number_of_replicas", ) print(resp)response = client.indices.get_settings( index: 'my-index-000001', name: 'index.number_of_replicas' ) puts response
const response = await client.indices.getSettings({ index: "my-index-000001", name: "index.number_of_replicas", }); console.log(response);GET /my-index-000001/_settings/index.number_of_replicas
Ответ будет выглядеть следующим образом:
{ "my-index-000001" : { "settings" : { "index" : { "number_of_replicas" : "2" } } } }Представляет текущее настроенное значение количества реплик фрагментов, необходимых для индекса.
-
Используйте API
_cat/nodes, чтобы найти количество узлов в целевом уровне:resp = client.cat.nodes( h="node.role", ) print(resp)response = client.cat.nodes( h: 'node.role' ) puts response
const response = await client.cat.nodes({ h: "node.role", }); console.log(response);GET /_cat/nodes?h=node.role
Ответ будет выглядеть так, содержа в одной строке данные каждого узла:
himrst mv himrst
Вы можете подсчитать строки, содержащие букву, представляющую целевой уровень, чтобы узнать количество узлов. См. параметры запроса для получения подробностей. В приведенном выше примере две строки содержат
h, поэтому в уровне hot два узла. -
Уменьшите значение общего количества реплик фрагментов, необходимых для этого индекса. Поскольку реплики фрагментов не могут находиться на одном узле с первичными фрагментами для высокой доступности, новое значение должно быть меньше или равно количеству узлов, найденных выше, минус один. Поскольку в приведенном выше примере найдено 2 узла в уровне hot, максимальное значение для
index.number_of_replicasравно 1.resp = client.indices.put_settings( index="my-index-000001", settings={ "index": { "number_of_replicas": 1 } }, ) print(resp)response = client.indices.put_settings( index: 'my-index-000001', body: { index: { number_of_replicas: 1 } } ) puts responseconst response = await client.indices.putSettings({ index: "my-index-000001", settings: { index: { number_of_replicas: 1, }, }, }); console.log(response);PUT /my-index-000001/_settings { "index" : { "number_of_replicas" : 1 } }Новое значение конфигурации индекса
index.number_of_replicasуменьшено с предыдущего значения2до1. Его можно установить и до 0, но настройка его в 0 для индексов, отличных от поисковых индексов снимков, может привести к временной потере доступности при перезапуске узлов или к постоянной потере данных в случае повреждения данных.
Для назначения реплицируемых фрагментов вы можете добавить больше узлов в свой кластер Elasticsearch и назначить целевой уровень индекса роли узла новым узлам.
Чтобы проверить, к какому уровню нацелен индекс для назначения, используйте API получения настроек индекса, чтобы получить настроенное значение для параметра index.routing.allocation.include._tier_preference:
resp = client.indices.get_settings(
index="my-index-000001",
name="index.routing.allocation.include._tier_preference",
flat_settings=True,
)
print(resp) response = client.indices.get_settings( index: 'my-index-000001', name: 'index.routing.allocation.include._tier_preference', flat_settings: true ) puts response
const response = await client.indices.getSettings({
index: "my-index-000001",
name: "index.routing.allocation.include._tier_preference",
flat_settings: "true",
});
console.log(response); GET /my-index-000001/_settings/index.routing.allocation.include._tier_preference?flat_settings
Ответ будет выглядеть следующим образом:
{
"my-index-000001": {
"settings": {
"index.routing.allocation.include._tier_preference": "data_warm,data_hot"
}
}
} | Представляет собой список, разделенный запятыми, ролей узлов уровня данных, на которых разрешено размещать этот индекс. Первый элемент в списке имеет более высокий приоритет, то есть уровень, к которому нацелен индекс. Например, в этом примере предпочтительный уровень — |
Если добавление дополнительных узлов в кластер Elasticsearch нежелательно, проверьте параметр индекса index.number_of_replicas и уменьшите его настроенное значение:
-
Проверьте параметр индекса
index.number_of_replicasдля индекса с незамеченными фрагментами реплики:resp = client.indices.get_settings( index="my-index-000001", name="index.number_of_replicas", ) print(resp)response = client.indices.get_settings( index: 'my-index-000001', name: 'index.number_of_replicas' ) puts response
const response = await client.indices.getSettings({ index: "my-index-000001", name: "index.number_of_replicas", }); console.log(response);GET /my-index-000001/_settings/index.number_of_replicas
Ответ будет выглядеть следующим образом:
{ "my-index-000001" : { "settings" : { "index" : { "number_of_replicas" : "2" } } } }Представляет текущее настроенное значение для количества фрагментов реплики, необходимых для индекса.
-
Используйте API
_cat/nodes, чтобы найти количество узлов на целевом уровне:resp = client.cat.nodes( h="node.role", ) print(resp)response = client.cat.nodes( h: 'node.role' ) puts response
const response = await client.cat.nodes({ h: "node.role", }); console.log(response);GET /_cat/nodes?h=node.role
Ответ будет выглядеть следующим образом, содержа одну строку на узел:
himrst mv himrst
Вы можете подсчитать строки, содержащие символ, представляющий целевой уровень, чтобы узнать, сколько у вас узлов. Подробнее см. Параметры запроса. В приведённом примере две строки содержат
h, следовательно, на уровне «hot» два узла. -
Уменьшите значение общего количества фрагментов реплики, необходимых для этого индекса. Поскольку фрагменты реплики не могут размещаться на том же узле, что и главные фрагменты, для высокой доступности, новое значение должно быть меньше или равно количеству узлов, найденных выше, минус один. Так как в примере выше найдено 2 узла на уровне «hot», максимальное значение для
index.number_of_replicasравно 1.resp = client.indices.put_settings( index="my-index-000001", settings={ "index": { "number_of_replicas": 1 } }, ) print(resp)response = client.indices.put_settings( index: 'my-index-000001', body: { index: { number_of_replicas: 1 } } ) puts responseconst response = await client.indices.putSettings({ index: "my-index-000001", settings: { index: { number_of_replicas: 1, }, }, }); console.log(response);PUT /my-index-000001/_settings { "index" : { "number_of_replicas" : 1 } }Новое значение конфигурации индекса
index.number_of_replicasуменьшено с предыдущего значения2до1. Его можно установить как минимум в 0, но настройка его в 0 для индексов, отличных от индексов с поиском по снимкам, может привести к временной потере доступности во время перезапуска узлов или к постоянной потере данных в случае повреждения данных.
© 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/increase-tier-capacity.html