Раздел 40 · Elasticsearch и ELK

Шарды, реплики и кластер

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Каталог «Гонца» помещается на одной машине. Но поиск по объявлениям большого маркетплейса или логи крупного сервиса не поместятся ни на одну. А ещё одна машина может просто сгореть. Elasticsearch с самого начала устроен как кластер из многих машин. Разберём, как он раскладывает данные и что значат жёлтый статус и непонятные UNASSIGNED, которые мы видели в песочнице.

Узлы и кластер

Узел это один процесс Elasticsearch. Несколько узлов с одним именем объединяются в кластер. Один из узлов избирается главным (master): он знает, где что лежит, и решает, куда класть новые данные. Обслуживать запросы может любой узел.

Шарды

Индекс в Elasticsearch не лежит целиком на одном узле. Он делится на шарды, а каждый шард это самостоятельный индекс Lucene. Число первичных шардов задают при создании индекса: "number_of_shards": 3. Потом его не поменять без перестройки индекса.

Какой документ на какой шард попадёт, решает маршрутизация:

шард = хеш(_id) mod число_шардов

Хеш считается функцией Murmur3. Это и есть причина, почему число шардов нельзя поменять: при другом делителе документы окажутся не там, где их будут искать.

Поиск идёт по всем шардам сразу: каждый находит свои лучшие документы, а узел, принявший запрос, сводит их вместе. Чем больше шардов на разных узлах, тем больше работы делается параллельно. Но слишком много шардов тоже плохо: каждый стоит памяти и накладных расходов. Ориентир Elastic: шард размером от 10 до 50 ГБ.

урок из курса

Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.