Превышено максимальное количество фрагментов индекса на одном узле
Elasticsearch пытается использовать все доступные ресурсы, распределяя данные (фрагменты индекса) по узлам кластера.
Пользователи могут повлиять на это распределение данных, настроив параметр индекса index.routing.allocation.total_shards_per_node до пользовательского значения (например, 1 в случае сильно нагруженного индекса). Различные настройки, ограничивающие количество фрагментов индекса, которые могут находиться на одном узле, могут привести к тому, что фрагменты не будут назначены из-за недостаточного количества узлов в кластере для удовлетворения конфигурации индекса.
Для решения этой проблемы выполните следующие шаги:
Для назначения фрагментов нам необходимо увеличить количество фрагментов, которые могут располагаться на одном узле. Для этого нужно проверить настройки index.routing.allocation.total_shards_per_node параметра индекса и увеличить значение для индексов, у которых фрагменты не назначены.
Используйте Kibana
- Войдите в консоль Elastic Cloud.
-
На панели Службы Elasticsearch щелкните имя вашего развертывания.
Если имя вашего развертывания отключено, ваши экземпляры Kibana могут быть неисправны. В этом случае обратитесь в поддержку Elastic. Если ваше развертывание не включает Kibana, вам нужно сначала его включить.
-
Откройте меню навигации развертывания (расположенное под логотипом Elastic в левом верхнем углу) и перейдите к Dev Tools > Console.
-
Проверьте
index.routing.allocation.total_shards_per_nodeпараметр индекса для индекса с неназначенными фрагментами:resp = client.indices.get_settings( index="my-index-000001", name="index.routing.allocation.total_shards_per_node", flat_settings=True, ) print(resp)response = client.indices.get_settings( index: 'my-index-000001', name: 'index.routing.allocation.total_shards_per_node', flat_settings: true ) puts response
const response = await client.indices.getSettings({ index: "my-index-000001", name: "index.routing.allocation.total_shards_per_node", flat_settings: "true", }); console.log(response);GET /my-index-000001/_settings/index.routing.allocation.total_shards_per_node?flat_settings
Ответ будет выглядеть так:
{ "my-index-000001": { "settings": { "index.routing.allocation.total_shards_per_node": "1" } } }Представляет текущее настроенное значение максимального количества фрагментов, которые могут находиться на одном узле для индекса
my-index-000001. -
Увеличьте значение максимального количества фрагментов, которые могут быть назначены одному узлу, до большего значения:
resp = client.indices.put_settings( index="my-index-000001", settings={ "index": { "routing.allocation.total_shards_per_node": "2" } }, ) print(resp)response = client.indices.put_settings( index: 'my-index-000001', body: { index: { 'routing.allocation.total_shards_per_node' => '2' } } ) puts responseconst response = await client.indices.putSettings({ index: "my-index-000001", settings: { index: { "routing.allocation.total_shards_per_node": "2", }, }, }); console.log(response);PUT /my-index-000001/_settings { "index" : { "routing.allocation.total_shards_per_node" : "2" } }Новое значение конфигурации
total_shards_per_nodeдля индексаmy-index-000001увеличивается с предыдущего значения1до2. Конфигурацияtotal_shards_per_nodeтакже может быть установлена в значение-1, что означает отсутствие ограничений на количество фрагментов одного и того же индекса, которые могут находиться на одном узле.
Для назначения фрагментов можно добавить больше узлов в ваш кластер 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.routing.allocation.total_shards_per_node параметра индекса и увеличить настроенное значение, что позволит назначить больше фрагментов на тот же узел.
-
Проверьте
index.routing.allocation.total_shards_per_nodeпараметр индекса для индекса с неназначенными фрагментами:resp = client.indices.get_settings( index="my-index-000001", name="index.routing.allocation.total_shards_per_node", flat_settings=True, ) print(resp)response = client.indices.get_settings( index: 'my-index-000001', name: 'index.routing.allocation.total_shards_per_node', flat_settings: true ) puts response
const response = await client.indices.getSettings({ index: "my-index-000001", name: "index.routing.allocation.total_shards_per_node", flat_settings: "true", }); console.log(response);GET /my-index-000001/_settings/index.routing.allocation.total_shards_per_node?flat_settings
Ответ будет выглядеть так:
{ "my-index-000001": { "settings": { "index.routing.allocation.total_shards_per_node": "1" } } }Представляет текущее настроенное значение максимального количества фрагментов, которые могут находиться на одном узле для индекса
my-index-000001. -
Увеличьте максимальное количество фрагментов, которые могут быть назначены одному узлу, или сбросьте значение на неограниченное (
-1):resp = client.indices.put_settings( index="my-index-000001", settings={ "index": { "routing.allocation.total_shards_per_node": -1 } }, ) print(resp)response = client.indices.put_settings( index: 'my-index-000001', body: { index: { 'routing.allocation.total_shards_per_node' => -1 } } ) puts responseconst response = await client.indices.putSettings({ index: "my-index-000001", settings: { index: { "routing.allocation.total_shards_per_node": -1, }, }, }); console.log(response);PUT /my-index-000001/_settings { "index" : { "routing.allocation.total_shards_per_node" : -1 } }
© 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-shard-limit.html