Осведомлённость о распределении фрагментов
Вы можете использовать пользовательские атрибуты узлов в качестве атрибутов осведомлённости, чтобы позволить Elasticsearch учитывать вашу физическую конфигурацию оборудования при распределении фрагментов. Если Elasticsearch знает, какие узлы находятся на одном физическом сервере, в одном стеллаже или в одной зоне, он может распределить первичный фрагмент и его фрагменты-копии, чтобы минимизировать риск потери всех копий фрагмента при сбое.
Когда осведомлённость о распределении фрагментов включена с настройкой cluster.routing.allocation.awareness.attributes, фрагменты распределяются только на узлы, для которых установлены значения для указанных атрибутов осведомлённости. Если вы используете несколько атрибутов осведомлённости, Elasticsearch учитывает каждый атрибут отдельно при распределении фрагментов.
Количество значений атрибута определяет, сколько копий фрагментов распределяется в каждом расположении. Если количество узлов в каждом расположении несбалансировано, а количество реплик велико, фрагменты-копии реплик могут остаться неназначенными.
Узнайте больше о проектировании надёжных кластеров.
Включение осведомлённости о распределении фрагментов
Чтобы включить осведомлённость о распределении фрагментов:
-
Укажите расположение каждого узла с помощью пользовательского атрибута узла. Например, если вы хотите, чтобы Elasticsearch распределял фрагменты по разным стеллажам, вы можете использовать атрибут осведомлённости, называемый
rack_id.Вы можете задать пользовательские атрибуты двумя способами:
-
Редактировав файл конфигурации
elasticsearch.yml:node.attr.rack_id: rack_one
-
Используя аргумент командной строки
-Eпри запуске узла:./bin/elasticsearch -Enode.attr.rack_id=rack_one
-
-
Укажите Elasticsearch учитывать один или несколько атрибутов осведомлённости при распределении фрагментов, установив
cluster.routing.allocation.awareness.attributesв файле конфигурацииelasticsearch.ymlкаждого узла, способного быть главным.cluster.routing.allocation.awareness.attributes: rack_id
Укажите несколько атрибутов через запятую.
Вы также можете использовать API обновления настроек кластера для установки или обновления атрибутов осведомлённости кластера:
resp = client.cluster.put_settings( persistent={ "cluster.routing.allocation.awareness.attributes": "rack_id" }, ) print(resp)response = client.cluster.put_settings( body: { persistent: { 'cluster.routing.allocation.awareness.attributes' => 'rack_id' } } ) puts responseconst response = await client.cluster.putSettings({ persistent: { "cluster.routing.allocation.awareness.attributes": "rack_id", }, }); console.log(response);PUT /_cluster/settings { "persistent" : { "cluster.routing.allocation.awareness.attributes" : "rack_id" } }
С этой конфигурацией, если вы запустите два узла с node.attr.rack_id, установленным в rack_one, и создадите индекс с 5 первичными фрагментами и 1 репликой каждого первичного, все первичные и реплики распределяются по двум узлам.
Если вы добавите два узла с node.attr.rack_id, установленным в rack_two, Elasticsearch переместит фрагменты на новые узлы, гарантируя (если возможно), что ни две копии одного и того же фрагмента не находятся в одном стеллаже.
Если rack_two выйдет из строя и выведет из строя оба своих узла, по умолчанию Elasticsearch распределяет потерянные копии фрагментов на узлы в rack_one. Чтобы предотвратить распределение нескольких копий конкретного фрагмента в одном расположении, вы можете включить принудительную осведомлённость.
Принудительная осведомлённость
По умолчанию, если одно расположение выходит из строя, Elasticsearch распределяет свои фрагменты по оставшимся расположениям. Это может быть нежелательно, если кластер не имеет достаточных ресурсов для размещения всех своих фрагментов при отсутствии одного расположения.
Чтобы предотвратить перегрузку оставшихся расположений при сбое целого расположения, укажите значения атрибутов, которые должны существовать с настройками cluster.routing.allocation.awareness.force.*. Это означает, что Elasticsearch предпочтёт оставить некоторые реплики неназначенными в случае сбоя целого расположения, вместо перегрузки узлов в оставшихся расположениях.
Например, если у вас есть атрибут осведомлённости, называемый zone, и узлы сконфигурированы в zone1 и zone2, вы можете использовать принудительную осведомлённость, чтобы заставить Elasticsearch оставить половину ваших копий фрагментов неназначенными, если доступна только одна зона:
cluster.routing.allocation.awareness.attributes: zone cluster.routing.allocation.awareness.force.zone.values: zone1,zone2
| Укажите все возможные значения атрибута |
С этой конфигурацией, если у вас есть два узла с node.attr.zone, установленным в zone1, и индекс с number_of_replicas, установленным в 1, Elasticsearch распределяет все первичные фрагменты, но не реплики. Он назначит фрагменты-реплики, когда узлы с другим значением для node.attr.zone присоединятся к кластеру. В отличие от этого, если вы не настраиваете принудительную осведомлённость, Elasticsearch распределит все первичные и реплики на два узла, даже если они находятся в одной зоне.
© 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/shard-allocation-awareness.html