Что такое шарды (shards)

Если вы думали, что документы хранятся в index, то огорчу вас это не так. Документы хранятся в шарды. Index просто отслеживает, где что находится. Index - это абстрактный объект, виртуальное пространство имен, которое указывает на несколько шардов. Каждый index разбивается на шарды. Количество шардов можно указать при создании index.

Шарды могут быть раскиданы на разных узлах кластера.

Типы шардов (shard)

Существует два разных типа шардов:

  • Первичный (Primary): исходные сегменты индекса.
  • Реплики (Replicas): копии/реплики первичного шарда.

Документы реплицируются между первичным и его шардами-репликами. Каждый тип шардов гарантированно находится на разных узлах, что увеличивает отказоустойчивость. Когда говорите о реплике думайте о нём как о копии первичного шарда, имеющей другой тег.

Количество шардов (shard)

Когда создается индекс, он всегда разбивается на какое-то количество шардов. Шарды- это то место, куда записываются и хранятся документы, которые входят в индекс. По умолчанию во время создания индекса количество первичных шардов, которые будет иметь индекс, равно 1. Но вы можете указать другое значение при создании index.

Рекомендуется назначать количество шардов при создании index, так как изменение этого значения в будущем невозможно. Количество же реплик можно настраивать в любое время.

Количество реплик первичного шарда

По умолчанию также стоит значение 1. Это значит, что в кластере с 3 узлами копия первичного шарда будет находится на одном из двух узлов, где не находится первичный шард. За распределение шардов по хостам отвечает master node.

А где реплика в однонодовом кластере? Реплика в однонодовом кластере не создаётся.

Конфигурация количества первичных шардов

По умолчанию количество первичных шардов для индекса равно 1. Как вы узнали ранее, вы можете указать количество первичных шардов при создании индекса.

PUT my_index
{
  "settings": {
    "number_of_shards": 3
  }
}

В такой реализации в кластере с 3 узлами на каждом узле будет по одному шарду.

Раньше по умолчанию было 5

По умолчанию в предыдущих версиях Elasticsearch (<7.0) при создании индекса создавалось 5 первичных шардов и 1 реплика. Однако это приводило к чрезмерному сегментированию, что стало одной из основных проблем пользователей Elastic - слишком много шардов потребляли ресурсы без всякой причины. Т.е в кластере с одной нодой index разбивался на 5 шардов и в этом не было особого смысла.

Например, если у вас есть один ежедневный индекс для 5 различных приложений, и каждое из них имеет по умолчанию пять шардов, вы создавали 25 шардов в день. При этом скоро у вас появятся тысячи шардов, даже если вы индексируете всего несколько гигабайт данных в день. Следующим шагом по сокращению чрезмерного сегментирования было присвоение индексов по умолчанию одному шарду.

В идеале создавайте столько шардов, сколько у вас узлов в кластере.

Конфигурация количества реплик первичных шардов

По умолчанию количество реплик равно 1. Это означает, что у каждого первичного шарда будет 1 копия. Вы можете указать необходимое количество реплик при создании индекса. Для этого используйте параметр number_of_replicas. В отличие от количества первичных шардов, вы можете изменить количество реплик в любое время.

PUT my_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

А для чего мне эта реплика?

Конечно, для высокой доступности! С одной репликой вы можете потерять один узел, но данные останутся доступными. С 2 репликами вы можете потерять 2 узла, и данные также останутся доступными. Если узел выходит из строя с основным, реплики повышаются до основных по мере необходимости.

Реплики также позволяют масштабировать данные и лучше использовать ресурсы кластера - пропускную способность чтения. Вместо того, чтобы ваши данные располагались на одном узле, они распределяются по разным узлам. Когда вы выполняете поисковый запрос, вас не волнует, выполняется ли поиск по первичному или реплике шарда, все шарды содержат одни и те же данные.

Состояния шардов

Осколки проходят несколько состояний:

  • UNASSIGNED
  • INITIALIZING
  • STARTED
  • RELOCATING

Elasticsearch автоматически управляет этими состояниями без необходимости ручного вмешательства. Мы их рассматриваем просто для того, чтобы знать, что делает каждое состояние.

UNASSIGNED

Состояние UNASSIGNED описывает шарды, которые существуют в конфигурации кластера, которые не могут быть найдены в самом кластере. Кластер знает, что шарды должны быть там, но кластер не может их выделить. Например, у вас не работает раздел в ОС с этими шардами.

Также такой статус может быть в момент создания самого шарда.

INITIALIZING

Состояние INITIALIZING очень короткое, в зависимости от того, насколько нагружен master node., и является первым шагом при создании шардов. Выполняется сразу после UNASSIGNED.

STARTED

Когда первичный шард завершает INITIALIZING, он переходит в состояние STARTED, и теперь его реплики могут быть переходят в состояние INITIALIZING. Состояние кластера будет желтое, потому что отсутствует один шард реплики, который в настоящее время UNASSIGNED (должен стать STARTED).

Когда состояние и первичных шардов и их реплик STARTED состояние кластера будет зелёным.

RELOCATING

Это состояние, когда шарды переносятся с одного узла на другой, например когда вы добавили еще однин узел в кластер.

Состояние кластера

При выходе узла с первичным шардом его реплика становится первичной, при этом статус кластера будет желтым. Это потому что отсутствует реплика, ведь она стала первичным шардом. Реплика в таком случае создастся сама, не нужно ничего предпринимать.

В итоге

  • Elasticsearch разделяет данные вашего индекса на несколько частей, называемых шардами.
  • Выделение шарда (Shard allocation) - это процесс назначения шарда узлу в кластере.