Каталог «Гонца» помещается на одной машине. Но поиск по объявлениям большого маркетплейса или логи крупного сервиса не поместятся ни на одну. А ещё одна машина может просто сгореть. Elasticsearch с самого начала устроен как кластер из многих машин. Разберём, как он раскладывает данные и что значат жёлтый статус и непонятные UNASSIGNED, которые мы видели в песочнице.
Узлы и кластер
Узел это один процесс Elasticsearch. Несколько узлов с одним именем объединяются в кластер. Один из узлов избирается главным (master): он знает, где что лежит, и решает, куда класть новые данные. Обслуживать запросы может любой узел.
Шарды
Индекс в Elasticsearch не лежит целиком на одном узле. Он делится на шарды, а каждый шард это самостоятельный индекс Lucene. Число первичных шардов задают при создании индекса: "number_of_shards": 3. Потом его не поменять без перестройки индекса.
Какой документ на какой шард попадёт, решает маршрутизация:
шард = хеш(_id) mod число_шардов
Хеш считается функцией Murmur3. Это и есть причина, почему число шардов нельзя поменять: при другом делителе документы окажутся не там, где их будут искать.
Поиск идёт по всем шардам сразу: каждый находит свои лучшие документы, а узел, принявший запрос, сводит их вместе. Чем больше шардов на разных узлах, тем больше работы делается параллельно. Но слишком много шардов тоже плохо: каждый стоит памяти и накладных расходов. Ориентир Elastic: шард размером от 10 до 50 ГБ.
урок из курса
Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.