Настройки распределения и маршрутизации фрагментов на уровне кластера
Распределение фрагментов — это процесс распределения фрагментов по узлам. Это может происходить во время начальной репликации, распределения реплик, перебалансировки или при добавлении или удалении узлов.
Одна из основных функций мастера — решение вопроса о том, каким фрагментам нужно назначить какие узлы и когда следует перемещать фрагменты между узлами для перебалансировки кластера.
Есть ряд настроек, позволяющих управлять процессом распределения фрагментов:
- Настройки распределения фрагментов на уровне кластера управляют операциями распределения и перебалансировки.
- Настройки распределения фрагментов на основе дисков описывают, как Elasticsearch учитывает доступное дисковое пространство, и связанные настройки.
- Осведомленность о распределении фрагментов и Принудительная осведомленность управляют тем, как фрагменты могут распределяться по разным стойкам или зонам доступности.
- Фильтрация распределения фрагментов на уровне кластера позволяет исключить определённые узлы или группы узлов из распределения, чтобы их можно было вывести из эксплуатации.
Помимо этого, есть несколько других разных настроек на уровне кластера.
Настройки распределения фрагментов на уровне кластера
Вы можете использовать следующие настройки для управления распределением и восстановлением фрагментов:
-
cluster.routing.allocation.enable -
(Динамическое) Включить или отключить распределение для определённых типов фрагментов:
-
all- (по умолчанию) Разрешает распределение фрагментов всех типов. -
primaries- Разрешает распределение фрагментов только для первичных фрагментов. -
new_primaries- Разрешает распределение фрагментов только для первичных фрагментов для новых индексов. -
none- Распределение фрагментов любого типа для любых индексов запрещено.
Эта настройка не влияет на восстановление локальных первичных фрагментов при перезапуске узла. Перезапущенный узел, имеющий копию неназначенного первичного фрагмента, восстановит этот первичный фрагмент сразу, если его идентификатор распределения совпадает с одним из активных идентификаторов распределения в состоянии кластера.
-
-
cluster.routing.allocation.node_concurrent_incoming_recoveries - (Динамическое) Количество одновременных входящих восстановлений фрагментов, разрешённых на узле. Входящие восстановления — это восстановления, где целевой фрагмент (скорее всего, реплика, если фрагмент не перераспределяется) назначен на узел. По умолчанию
2. -
cluster.routing.allocation.node_concurrent_outgoing_recoveries - (Динамическое) Количество одновременных исходящих восстановлений фрагментов, разрешённых на узле. Исходящие восстановления — это восстановления, где исходный фрагмент (скорее всего, первичный, если фрагмент не перераспределяется) назначен на узел. По умолчанию
2. -
cluster.routing.allocation.node_concurrent_recoveries - (Динамическое) Сокращённая настройка для установки значений
cluster.routing.allocation.node_concurrent_incoming_recoveriesиcluster.routing.allocation.node_concurrent_outgoing_recoveries. -
cluster.routing.allocation.node_initial_primaries_recoveries - (Динамическое) Во время восстановления реплик происходит через сеть, восстановление неназначенного первичного фрагмента после перезапуска узла использует данные с локального диска. Эти операции должны быть быстрыми, чтобы можно было параллельно выполнять больше начальных восстановлений первичных фрагментов на одном и том же узле. По умолчанию
4.
-
cluster.routing.allocation.same_shard.host - (Динамическое) Разрешает проверку для предотвращения распределения нескольких экземпляров одного фрагмента на один хост на основе имени хоста и IP-адреса. По умолчанию
false, то есть проверка по умолчанию не выполняется. Эта настройка применяется только в случае запуска нескольких узлов на одной машине.
Настройки перебалансировки фрагментов
Кластер считается сбалансированным, когда на каждом узле находится одинаковое количество фрагментов без концентрации фрагментов какого-либо индекса на каком-либо узле. Elasticsearch выполняет автоматический процесс, называемый перебалансировкой, который перемещает фрагменты между узлами кластера для улучшения его баланса. Перебалансировка подчиняется всем остальным правилам распределения фрагментов, таким как фильтрация распределения и принудительная осведомленность, которые могут помешать полному балансированию кластера. В этом случае перебалансировка стремится достичь наиболее сбалансированного кластера в рамках ваших настроек. Если вы используете уровни данных, Elasticsearch автоматически применяет правила фильтрации распределения, чтобы разместить каждый фрагмент на соответствующем уровне. Эти правила означают, что балансировщик работает независимо в каждом уровне.
Вы можете использовать следующие настройки для управления перебалансировкой фрагментов по всему кластеру:
-
cluster.routing.rebalance.enable -
(Динамическое) Включить или отключить перебалансировку для определённых типов фрагментов:
-
all- (по умолчанию) Разрешает перебалансировку фрагментов всех типов. -
primaries- Разрешает перебалансировку фрагментов только для первичных фрагментов. -
replicas- Разрешает перебалансировку фрагментов только для реплик. -
none- Перебалансировка фрагментов любого типа для любых индексов запрещена.
-
-
cluster.routing.allocation.allow_rebalance -
(Динамическое) Указывает, когда разрешена перебалансировка фрагментов:
-
always- Всегда разрешать перебалансировку. -
indices_primaries_active- Только когда все первичные фрагменты в кластере назначены. -
indices_all_active- (по умолчанию) Только когда все фрагменты (первичные и реплики) в кластере назначены.
-
-
cluster.routing.allocation.cluster_concurrent_rebalance - (Динамическое) Разрешает контролировать количество одновременных перебалансировок фрагментов в масштабе всего кластера. По умолчанию
2. Обратите внимание, что эта настройка управляет только количеством одновременных перемещений фрагментов из-за дисбаланса в кластере. Эта настройка не ограничивает перемещения фрагментов из-за фильтрации распределения или принудительной осведомленности.
Настройки эвристик балансировки фрагментов
Перебалансировка работает, вычисляя вес каждого узла на основе распределения фрагментов, а затем перемещая фрагменты между узлами, чтобы уменьшить вес более загруженных узлов и увеличить вес менее загруженных. Кластер считается сбалансированным, когда нет возможного перемещения фрагмента, которое может приблизить вес любого узла к весу любого другого узла более чем на настраиваемый порог. Следующие настройки позволяют контролировать детали этих вычислений.
-
cluster.routing.allocation.balance.shard - (Динамическое) Определяет фактор веса для общего количества фрагментов, назначенных на узел (вещественное число). По умолчанию
0.45f. Повышение этого значения повышает стремление выровнять количество фрагментов по всем узлам в кластере. -
cluster.routing.allocation.balance.index - (Динамическое) Определяет фактор веса для количества фрагментов на индекс, назначенных на конкретный узел (вещественное число). По умолчанию
0.55f. Повышение этого значения повышает стремление выровнять количество фрагментов на индекс по всем узлам в кластере. -
cluster.routing.allocation.balance.threshold - (Динамическое) Минимальное значение оптимизации операций, которые должны быть выполнены (вещественное число, неотрицательное). По умолчанию
1.0f. Повышение этого значения заставит кластер быть менее агрессивным в отношении оптимизации баланса фрагментов.
Независимо от результата алгоритма балансировки, перебалансировка может быть запрещена из-за принудительной осведомленности или фильтрации распределения.
Настройки распределения фрагментов по дискам
Распределитель фрагментов по дискам гарантирует, что у всех узлов достаточно места на диске, не выполняя лишних перемещений фрагментов. Он распределяет фрагменты на основе пары пороговых значений, известных как нижний порог и верхний порог. Основная цель — убедиться, что ни один узел не превысит верхний порог, или по крайней мере, что любое такое превышение является временным. Если узел превышает верхний порог, Elasticsearch устранит это, переместив некоторые фрагменты на другие узлы кластера.
Нормально, что узлы временно превышают верхний порог.
Распределитель также пытается удерживать узлы ниже верхнего порога, запрещая размещение дополнительных фрагментов на узле, превысившем нижний порог. Важно, что если все узлы превысили нижний порог, то новые фрагменты не могут быть распределены, и Elasticsearch не сможет перемещать фрагменты между узлами, чтобы сохранить использование диска ниже верхнего порога. Вы должны убедиться, что в вашем кластере достаточно места на дисках в целом и что всегда есть некоторые узлы, которые находятся ниже нижнего порога.
Перемещения фрагментов, инициированные распределителем фрагментов по дискам, также должны удовлетворять всем остальным правилам распределения фрагментов, таким как фильтрация распределения фрагментов на уровне кластера и принудительное оповещение. Если эти правила слишком жёсткие, то они могут также препятствовать перемещениям фрагментов, необходимым для поддержания использования диска узлами под контролем. Если вы используете уровни данных, Elasticsearch автоматически настраивает правила фильтрации распределения, чтобы размещать фрагменты на соответствующем уровне, что означает, что распределитель фрагментов по дискам работает независимо в каждом уровне.
Если узел заполняет свой диск быстрее, чем Elasticsearch может переместить фрагменты в другое место, существует риск полного заполнения диска. Чтобы предотвратить это, в качестве последнего средства, когда использование диска достигает порогового значения, Elasticsearch заблокирует запись в индексах с фрагментом на поражённом узле. Он также продолжит перемещение фрагментов на другие узлы кластера. Когда использование диска на поражённом узле опустится ниже верхнего порога, Elasticsearch автоматически снимает блокировку записи.
Нормально, что узлы в вашем кластере используют очень разные объёмы дискового пространства. Баланс кластера зависит только от количества фрагментов на каждом узле и индексов, к которым относятся эти фрагменты. Он не учитывает ни размер этих фрагментов, ни доступное дисковое пространство на каждом узле по следующим причинам:
- Использование диска меняется со временем. Выравнивание использования диска отдельными узлами потребовало бы гораздо больше перемещений фрагментов, возможно, даже бессмысленно отменяя предыдущие перемещения. Перемещение фрагмента потребляет ресурсы, такие как I/O и пропускная способность сети, и может вытеснить данные из кэша файловой системы. Эти ресурсы лучше использовать для обработки запросов и индексирования, где это возможно.
- Кластер с равным использованием диска на каждом узле, как правило, работает не лучше, чем кластер с неравномерным использованием, если ни один диск не переполнен.
Вы можете использовать следующие настройки для управления распределением по дискам:
-
cluster.routing.allocation.disk.threshold_enabled - (Динамически) По умолчанию
true. Установите вfalse, чтобы отключить решающий элемент распределения по дискам.
-
cluster.routing.allocation.disk.watermark.low - (Динамически) Управляет нижним порогом использования диска. По умолчанию
85%, что означает, что Elasticsearch не будет распределять фрагменты на узлах, на которых используется более 85% диска. Он также может быть установлен в абсолютное значение в байтах (например,500mb), чтобы предотвратить распределение фрагментов, если доступно меньше указанного объёма памяти. Эта настройка не влияет на первичные фрагменты вновь созданных индексов, но предотвратит распределение их реплик.
-
cluster.routing.allocation.disk.watermark.high - (Динамически) Управляет верхним порогом. По умолчанию
90%, что означает, что Elasticsearch попытается перераспределить фрагменты с узла, использование диска которого превышает 90%. Он также может быть установлен в абсолютное значение в байтах (аналогично нижнему порогу), чтобы перераспределить фрагменты с узла, если у него меньше указанного количества свободного места. Эта настройка влияет на распределение всех фрагментов, независимо от того, были ли они распределены ранее. -
cluster.routing.allocation.disk.watermark.enable_for_single_data_node - (Статически) Для одного узла данных по умолчанию игнорируются дисковые пороги при принятии решения о распределении. Это устаревшее поведение и будет изменено в версии 8.0. Эту настройку можно установить в
true, чтобы включить дисковые пороги для кластера с одним узлом данных (станет по умолчанию в версии 8.0).
-
cluster.routing.allocation.disk.watermark.flood_stage -
(Динамически) Управляет порогом переполнения, который по умолчанию равен 95%. Elasticsearch применяет блокировку только для чтения индексов (
index.blocks.read_only_allow_delete) для каждого индекса, у которого есть один или несколько фрагментов, распределённых на узле и у которого, по крайней мере, один диск превышает порог переполнения. Эта настройка используется в качестве последнего средства для предотвращения исчерпания дискового пространства на узлах. Блокировка индекса автоматически снимается, когда использование диска опускается ниже верхнего порога.Вы не можете смешивать использование значений в процентах и значений в байтах в этих настройках. Либо все значения устанавливаются в процентах, либо все значения устанавливаются в байтах. Такое требование необходимо, чтобы Elasticsearch мог проверить, что настройки внутренне согласованы, гарантируя, что низкий порог по диску меньше, чем высокий, а высокий порог по диску меньше, чем порог переполнения.
Пример сброса блокировки только для чтения индекса в индексе
my-index-000001:PUT /my-index-000001/_settings { "index.blocks.read_only_allow_delete": null }
-
cluster.routing.allocation.disk.watermark.flood_stage.frozen - (Динамически) Управляет порогом переполнения для выделенных замороженных узлов, который по умолчанию равен 95%.
-
cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom - (Динамически) Управляет максимальным запасом для порога переполнения для выделенных замороженных узлов. По умолчанию 20 ГБ, когда
cluster.routing.allocation.disk.watermark.flood_stage.frozenне указан явно. Это ограничивает количество свободного места, требуемого на выделенных замороженных узлах. -
cluster.info.update.interval - (Динамически) Насколько часто Elasticsearch должен проверять использование диска для каждого узла в кластере. По умолчанию
30s. -
cluster.routing.allocation.disk.include_relocations - [7.5.0] Устаревшее свойство в 7.5.0. Будущие версии всегда будут учитывать перемещения. По умолчанию
true, что означает, что Elasticsearch будет учитывать фрагменты, которые в настоящее время перемещаются на целевой узел при вычислении использования диска узла. Однако, учёт размеров перемещаемых фрагментов может означать, что использование диска узла будет неверно оцениваться с высокой стороны, поскольку перемещение может быть на 90% завершено, и недавние данные об использовании диска будут включать в себя общий размер перемещаемого фрагмента, а также пространство, уже используемое текущим перемещением.
Значения в процентах относятся к используемому дисковому пространству, а значения в байтах — к свободному дисковому пространству. Это может быть немного запутанно, так как меняется смысл высоких и низких значений. Например, имеет смысл установить нижний порог в 10 ГБ, а верхний порог в 5 ГБ, но не наоборот.
Пример обновления нижнего порога до как минимум 100 гигабайт свободного места, верхнего порога до как минимум 50 гигабайт свободного места и порога переполнения до 10 гигабайт свободного места и обновления информации о кластере каждую минуту:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": "100gb",
"cluster.routing.allocation.disk.watermark.high": "50gb",
"cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
"cluster.info.update.interval": "1m"
}
} Осведомленность о распределении фрагментов
Вы можете использовать пользовательские атрибуты узлов в качестве атрибутов осведомленности, чтобы позволить Elasticsearch учитывать вашу физическую конфигурацию оборудования при распределении фрагментов. Если Elasticsearch знает, какие узлы находятся на одном физическом сервере, в одной стойке или в одной зоне, он может распределить первичный фрагмент и его фрагменты-копии, чтобы свести к минимуму риск потери всех копий фрагмента в случае сбоя.
Когда осведомленность о распределении фрагментов включена с настройкой динамической cluster.routing.allocation.awareness.attributes, фрагменты распределяются только на узлах, для которых установлены значения указанных атрибутов осведомленности. Если вы используете несколько атрибутов осведомленности, Elasticsearch рассматривает каждый атрибут отдельно при распределении фрагментов.
По умолчанию Elasticsearch использует адаптивную селекцию реплик для маршрутизации запросов поиска или GET. Однако при наличии атрибутов осведомленности о распределении Elasticsearch будет предпочитать использовать фрагменты в одном и том же месте (с одинаковыми значениями атрибутов осведомленности) для обработки этих запросов. Это поведение можно отключить, указав системную переменную export ES_JAVA_OPTS="$ES_JAVA_OPTS -Des.search.ignore_awareness_attributes=true" на каждом узле, входящем в кластер.
Количество значений атрибутов определяет, сколько копий фрагментов распределено в каждом месте. Если количество узлов в каждом месте несбалансировано и есть много реплик, фрагменты-реплики могут остаться неназначенными.
Включение осведомленности о распределении фрагментов
Чтобы включить осведомленность о распределении фрагментов:
-
Укажите расположение каждого узла с помощью пользовательского атрибута узла. Например, если вы хотите распределить фрагменты по разным стойкам, вы можете установить атрибут осведомленности, называемый
rack_id, в файле конфигурацииelasticsearch.ymlкаждого узла.node.attr.rack_id: rack_one
Вы также можете установить пользовательские атрибуты при запуске узла:
./bin/elasticsearch -Enode.attr.rack_id=rack_one
-
Укажите Elasticsearch учитывать один или несколько атрибутов осведомленности при распределении фрагментов, установив
cluster.routing.allocation.awareness.attributesв файле конфигурацииelasticsearch.ymlкаждого узла, имеющего право быть мастер-узлом.cluster.routing.allocation.awareness.attributes: rack_id
Укажите несколько атрибутов через запятую.
Вы также можете использовать API cluster-update-settings для установки или обновления атрибутов осведомленности кластера.
В этом примере конфигурации, если вы запустите два узла с 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 распределит все первичные и реплики на два узла, даже если они находятся в одной зоне.
Фильтрация распределения фрагментов на уровне кластера
Вы можете использовать фильтры распределения фрагментов на уровне кластера для управления тем, где Elasticsearch распределяет фрагменты из любого индекса. Эти фильтры, применяемые на уровне всего кластера, используются в сочетании с фильтрацией распределения фрагментов на уровне индекса и осведомленностью о распределении фрагментов.
Фильтры распределения фрагментов могут быть основаны на пользовательских атрибутах узлов или встроенных атрибутах _name, _host_ip, _publish_ip, _ip, _host, _id и _tier.
Настройки cluster.routing.allocation являются динамическими, что позволяет перемещать индексы в режиме реального времени с одного набора узлов на другой. Фрагменты перемещаются только в том случае, если это возможно без нарушения других ограничений маршрутизации, например, никогда не размещать первичный и фрагмент-реплику на одном узле.
Самый распространенный случай использования фильтрации распределения фрагментов на уровне кластера — отключение узла. Чтобы переместить фрагменты с узла до его выключения, вы можете создать фильтр, исключающий узел по его IP-адресу:
PUT _cluster/settings
{
"persistent" : {
"cluster.routing.allocation.exclude._ip" : "10.0.0.1"
}
} Настройки маршрутизации кластера
-
cluster.routing.allocation.include.{attribute} - (Динамический) Размещать фрагменты на узле, у которого
{attribute}имеет по меньшей мере одно из значений, разделенных запятыми. -
cluster.routing.allocation.require.{attribute} - (Динамический) Размещать фрагменты только на узле, у которого
{attribute}имеет все значения, разделенные запятыми. -
cluster.routing.allocation.exclude.{attribute} - (Динамический) Не размещать фрагменты на узле, у которого
{attribute}имеет любое из значений, разделенных запятыми.
Настройки распределения кластера поддерживают следующие встроенные атрибуты:
| | Сопоставление узлов по имени узла |
| | Сопоставление узлов по IP-адресу хоста (IP, связанный с именем хоста) |
| | Сопоставление узлов по опубликованному IP-адресу |
| | Сопоставление по |
| | Сопоставление узлов по имени хоста |
| | Сопоставление узлов по идентификатору узла |
| | Сопоставление узлов по роли уровня данных узла |
Вы можете использовать подстановочные знаки при указании значений атрибутов, например:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.exclude._ip": "192.168.2.*"
}
} Разные настройки кластера
Метаданные
Весь кластер может быть установлен в режим только для чтения с помощью следующей настройки:
-
cluster.blocks.read_only - (Динамическая) Сделать весь кластер только для чтения (индексы не принимают операции записи), метаданные не могут быть изменены (создание или удаление индексов).
-
cluster.blocks.read_only_allow_delete - (Динамическая) Идентично
cluster.blocks.read_only, но позволяет удалять индексы для освобождения ресурсов.
Не полагайтесь на эту настройку для предотвращения изменений в вашем кластере. Любой пользователь с доступом к API cluster-update-settings может снова сделать кластер доступным для записи.
Предел фрагментов кластера
Существует мягкий предел количеству фрагментов в кластере, основанный на количестве узлов в кластере. Это предназначено для предотвращения операций, которые могут непреднамеренно дестабилизировать кластер.
Этот предел предназначен в качестве меры предосторожности, а не рекомендации по размеру. Точное количество фрагментов, которое ваш кластер может безопасно поддерживать, зависит от вашей конфигурации оборудования и рабочей нагрузки, но в большинстве случаев должно оставаться значительно ниже этого предела, так как значение по умолчанию установлено довольно высоким.
Если операция, такая как создание нового индекса, восстановление снимка индекса или открытие закрытого индекса, приведет к превышению предела количества фрагментов в кластере, операция завершится ошибкой, указывающей на предел фрагментов.
Если кластер уже превысил предел из-за изменений в членстве узлов или изменений настроек, все операции создания или открытия индексов завершатся ошибкой, пока либо предел не будет увеличен, как описано ниже, либо некоторые индексы не будут закрыты или удалены, чтобы снизить количество фрагментов ниже предела.
Предел фрагментов кластера по умолчанию составляет 1000 фрагментов на узел данных без заморозки для обычных (не замороженных) индексов и 3000 фрагментов на узел данных с заморозкой для замороженных индексов. Как первичные, так и реплицированные фрагменты всех открытых индексов учитываются в пределе, включая неназначенные фрагменты. Например, открытый индекс с 5 первичными фрагментами и 2 репликами считается 15 фрагментами. Закрытые индексы не учитываются при подсчете фрагментов.
Вы можете динамически настроить предел фрагментов кластера с помощью следующей настройки:
-
cluster.max_shards_per_node -
(Динамическая) Ограничивает общее количество первичных и реплицированных фрагментов для кластера. Elasticsearch вычисляет предел следующим образом:
cluster.max_shards_per_node * number of non-frozen data nodesФрагменты закрытых индексов не учитываются в этом пределе. Значение по умолчанию
1000. Кластер без узлов данных не имеет ограничений.Elasticsearch отклоняет любой запрос, который создает больше фрагментов, чем позволяет этот предел. Например, кластер с настройкой
cluster.max_shards_per_nodeравной100и тремя узлами данных имеет предел фрагментов 300. Если кластер уже содержит 296 фрагментов, Elasticsearch отклоняет любой запрос, который добавляет пять или более фрагментов в кластер.Обратите внимание, что замороженные фрагменты имеют собственный независимый предел.
-
cluster.max_shards_per_node.frozen -
(Динамическая) Ограничивает общее количество первичных и реплицированных замороженных фрагментов для кластера. Elasticsearch вычисляет предел следующим образом:
cluster.max_shards_per_node * number of frozen data nodesФрагменты закрытых индексов не учитываются в этом пределе. Значение по умолчанию
3000. Кластер без замороженных узлов данных не имеет ограничений.Elasticsearch отклоняет любой запрос, который создает больше замороженных фрагментов, чем позволяет этот предел. Например, кластер с настройкой
cluster.max_shards_per_node.frozenравной100и тремя замороженными узлами данных имеет предел замороженных фрагментов 300. Если кластер уже содержит 296 фрагментов, Elasticsearch отклоняет любой запрос, который добавляет пять или более замороженных фрагментов в кластер.Эти настройки не ограничивают фрагменты отдельных узлов. Чтобы ограничить количество фрагментов для каждого узла, используйте настройку
cluster.routing.allocation.total_shards_per_node.
Метаданные кластера, определенные пользователем
Метаданные, определенные пользователем, могут быть сохранены и извлечены с помощью API настроек кластера. Это можно использовать для хранения произвольных данных о кластере, которые редко меняются, без необходимости создавать индекс для их хранения. Эти данные могут храниться с использованием любого ключа, начинающегося с cluster.metadata.. Например, чтобы сохранить адрес электронной почты администратора кластера под ключом cluster.metadata.administrator, выполните этот запрос:
PUT /_cluster/settings
{
"persistent": {
"cluster.metadata.administrator": "sysadmin@example.com"
}
} Метаданные кластера, определенные пользователем, не предназначены для хранения конфиденциальной информации. Любая информация, хранящаяся в пользовательских метаданных кластера, будет доступна любому пользователю с доступом к API Cluster Get Settings и записывается в журналы Elasticsearch.
Метки удаленных индексов
Состояние кластера сохраняет метки удаленных индексов для явного обозначения индексов, которые были удалены. Количество меток, сохраняемых в состоянии кластера, контролируется следующей настройкой:
-
cluster.indices.tombstones.size - (Статическая) Метки удаленных индексов предотвращают подключение узлов, которые не входят в состав кластера во время удаления, к кластеру и повторный импорт индекса как будто удаление никогда не производилось. Чтобы предотвратить чрезмерный рост состояния кластера, мы сохраняем только последние
cluster.indices.tombstones.sizeудалений, по умолчанию это 500. Вы можете увеличить это значение, если ожидаете, что узлы будут отсутствовать в кластере и пропустят более 500 удалений. Мы считаем, что это редкое явление, поэтому значение по умолчанию. Метки не занимают много места, но мы также считаем, что число, подобное 50 000, вероятно, слишком большое.
Если Elasticsearch сталкивается с данными индекса, отсутствующими в текущем состоянии кластера, эти индексы считаются висячими. Например, это может произойти, если вы удалите более cluster.indices.tombstones.size индексов, в то время как узел Elasticsearch был отключен.
Вы можете использовать API висячих индексов для управления этой ситуацией.
Журнал
Настройки, которые контролируют ведение журнала, могут быть обновлены динамически с префиксом logger.. Например, чтобы увеличить уровень ведения журнала модуля indices.recovery до DEBUG, выполните этот запрос:
PUT /_cluster/settings
{
"persistent": {
"logger.org.elasticsearch.indices.recovery": "DEBUG"
}
} Распределение задач длительного выполнения
Плагины могут создавать тип задач, называемых задачами длительного выполнения. Эти задачи обычно представляют собой задачи длительного выполнения и хранятся в состоянии кластера, что позволяет оживить задачи после полного перезапуска кластера.
Каждый раз, когда создается задача длительного выполнения, мастер-узел отвечает за назначение задачи узлу кластера, а назначенный узел затем получит задачу и выполнит её локально. Процесс назначения задач длительного выполнения узлам контролируется следующими настройками:
-
cluster.persistent_tasks.allocation.enable -
(Динамическая) Включить или отключить распределение для задач длительного выполнения:
-
all- (по умолчанию) Разрешает назначение задач длительного выполнения узлам -
none- Не разрешает распределение для задач длительного выполнения любого типа
Эта настройка не влияет на задачи длительного выполнения, которые уже выполняются. Только новые задачи длительного выполнения или задачи, которые необходимо переназначить (например, после выхода узла из кластера), будут затронуты этой настройкой.
-
-
cluster.persistent_tasks.allocation.recheck_interval - (Динамическая) Мастер-узел автоматически проверяет, необходимо ли назначать задачи длительного выполнения, когда состояние кластера значительно изменяется. Однако могут быть и другие факторы, такие как использование памяти, которые влияют на возможность назначения задач длительного выполнения узлам, но не вызывают изменения состояния кластера. Эта настройка контролирует частоту проверки назначения, чтобы реагировать на эти факторы. Значение по умолчанию составляет 30 секунд. Минимально допустимое значение составляет 10 секунд.
Навязывание предпочтительного уровня _tier_
У вновь созданных индексов index.routing.allocation.include._tier_preference автоматически назначен по умолчанию. Это можно переопределить, установив _tier_preference на null через API создания индекса или с помощью шаблона индекса.
В версии 8.0 больше нельзя будет обойти это поведение, установив _tier_preference на null — все вновь созданные индексы всегда будут иметь связанный _tier_preference.
-
cluster.routing.allocation.enforce_default_tier_preference - (Динамическое) Требует, чтобы у вновь созданных индексов всегда был ненулевой
_tier_preference, игнорируя настройки запроса или шаблона. Значение по умолчанию —false.
© 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/7.17/modules-cluster.html