Моя аппаратная конфигурация Elasticsearch имеет 3 узла:
- 2 x data, master, загрузочный узел с 64 ГБ ОЗУ (30 ГБ для этого идут в JVM), 3 ТБ жесткого диска, 8 ядер каждый;
- 1 главный + координирующий узел с 8 ГБ ОЗУ, 500 ГБ HDD, 2 ядрами.
Мои данные:
- ≈ 5 миллиардов документов,которые занимают ≈ 1,5-2 ТБ дискового пространства в настоящее время (вырастут до 10 ТБ в год);
- сложная структура, с большим количеством вложенных документов (которые включены в родительские), также поля в документах невообще стандартизирован (и не может быть), поэтому сопоставления индексов огромны;
- данные не являются сверхурочными (например, журналы);
Мне нужно бытьПри поиске по любому полю в этих документах поиск выполняется только по всем документам через String Query API . Также во время поиска я использую sort , подсветка , total_hits_count и агрегирование терминов .
Лично я попробовал две попытки сохранить pr:
- 1 индекс с 16 осколками - это приводит к увеличению времени индекса, но быстрой скорости поиска,Также регулярно происходили сбои узлов, потому что (я думаю) отображения были слишком большими, и у меня всегда было около 95-99 ОЗУ на узлах.
- 16 индексов с 1 осколком на каждом , сназначенный псевдоним - этап индексации выполняется быстрее, однако поиск стал намного медленнее. Это текущая версия.
Я не понимаю, почему поиск по 1x16 намного быстрее, чем 16x1 ...
Итак, наконецКаков наилучший подход для хранения этих данных в ES на основе предоставленной информации?
Кроме того, каждый осколок в настоящее время весит 75-128 ГБ, когда рекомендуется сохранять размер осколка 20-50 ГБ, но я видел мнение и рекомендацию, чтобы оставить по 1 осколку на ядро. Поэтому мнения по поводу этой конфигурации также приветствуются.