Так как у нас есть 4 узла данных, а 15 не делится на 4, то добавим еще один шард. Итого: необходимо разделить индекс на 16 фрагментов.
Elasticsearch — самый ресурсоемкий модуль в системе PT NAD. Для быстрого полнотекстового поиска по метаданным elasticsearch использует обратный индекс. Он разбивается на отдельные осколки (шарды), что позволяет распределить нагрузку и увеличить эффективность системы.
Elasticsearch использует узлы (ноды) трех типов:- Master node: следит за другими узлами в кластере, распределяет шарды по нодам;
- Client node: принимает и передает запросы пользователя к узлам данных;
- Data node: хранят шарды и производят операции над данными (запись, поиск, изменение, удаление)
При распределении ресурсов по нодам elasticsearch необходимо руководствоваться следующими правилами:- На весь кластер elasticsearch выделено не более половины от ОЗУ сервера;
- По 2 потока и 2Гб ОЗУ достаточно для стабильной работы master и client нод;
- Для каждого из узлов данных выделяется не менее 6 потоков ЦПУ, а также строго не более 30 Гб ОЗУ (и желательно не менее). Такой же объем памяти резервируется под кэш;
- Количество шардов должно быть кратно числу узлов данных;
- На каждый шард должно приходиться не более 50 Гб метаданных, собранных за сутки
Рассмотрим пример: пусть у нас в распоряжении находится сервер с 56-ядерным процессором и 256 ГБ ОЗУ, которому отведена роль Core. При этом за сутки генерируется 720 Гб метаданных.
Сперва определим максимальное количество узлов данных, которое можно разместить на данном сервере, взяв целую часть от результата деления объема ОЗУ на 60 (30 Гб для процессов самого узла и 30 Гб под кэширование):
25660 = 4* х – возвращает целую часть числа хНа master и client ноды выделяем по 2 потока ЦПУ и 2 потока ОЗУ.
Суммарно на кластер elasticsearch было выделено 4*30 + 2 + 2 = 124 Гб ОЗУ (меньше половины всей доступной оперативной памяти). Для работы ОС оставим 4 Гб ОЗУ и 4 потока ЦПУ.
Оставшиеся 48 потоков ЦПУ разделим на 4 узла данных: на каждый узел приходится по 12 потоков, что соответствует требованию выделения не менее 6 потоков.
Перейдем к расчету количества осколков индекса. Определим минимальное количество шардов, на которые необходимо разделить индекс, учитывая ограничение в 50 Гб суточного трафика метаданных:
⌈72050⌉ = 15* ⌈х⌉ – возвращает наименьшее целое число, большее или равное хТак как у нас есть 4 узла данных, а 15 не делится на 4, то добавим еще один шард. Итого: необходимо разделить индекс на 16 фрагментов.