18230
читателей блога
Eсть вещи, которыми я готов делиться только со своими подписчиками.
Когда в тебе пульсирует ревность, то твоя голова соображает весьма плохо. Ты эмоциональна. Ты смотришь и твоя кожа покрывается овечей шерстью. И чем больше ты…
Читать далее…
Внимание! В статье используется ненармотивная лексика, поэтому, если ваше воспитание не позволяет читать эмоциональные тексты. То галантно предлагаю пойти на хуй…
Читать далее…
Важная тема! Читай так внимательно, как будто у твоего внимания есть мышцы. Напряги их сейчас и читай действительно внимательно. Это самое крутое и полное…
Читать далее…
Что произойдет, если ты сейчас вбъешь пальчиком в поисковую строку вопрос — как выбесить бывшую девушку парня? Я тебе отвечу — ничего. Нет этой инфы. Ее просто…
Читай внимательно. Изначально у тебя будет отторжение, потому что твой мозг привык к примитивной реальности. Но в конце статьи ты полюбишь меня еще сильнее). Просто…
Читать далее…
Эта статья прежде всего выгодна тебе, я напишу четкий план, как тебе не выйти ущемленным куском психологических проблем после мужской измены. Погнали. Есть факт…
Читать далее…
Привлекать мужчин нужно не специально, не готовясь к этому, а машинально и автоматически. По пути, как нечто собой разумеющееся. Ты занимаешься своими делами,…
Читать далее…
Ну, что начнем! Ошибаются в отношениях все, вообще все — это нормально. Нет отношений — нет ошибок. Нет ошибок — нет отношений. И есть действительно дурацкие ошибки…
Читать далее…
Давай мы с тобой окунемся в природу страсти и посмотрим как она вообще действует, чтобы понимать ее механизмы и потом в них вмешаться! Потому что понимая механизм. ..Читать далее…
Только не нужно мне невнятно бормотать, что ты не хочешь быть привлекательной. Еще как хочешь. Ты этого всегда хотела и будешь хотеть. А я смогу тебе в этом косвенно…
Читать далее…
Твое мышление всегда должно мыслить дальше твоего острого носа. Если ты мыслишь здесь и сейчас и импульсивно выбираешь себе мужчину, то я тебе сейчас расскажу,…
Читать далее…
Сегодня я проникну глубоко в суть отношений и простым влажным языком нарисую то, как с очень большой вероятностью увести мужчину у его жены или парня от…
Читать далее…
Уже после прочтения данной статьи в твоей голове начнут скрипеть механизмы перемен. Многие мне «жаловались» на то, что мои статьи избавили от комплексов. Логично…
Читать далее…
Так! Стоп! Не нужно мыслить так узко и думать, что стерва — это такая некая личность, которая только трахает мозг и все. Она может быть и крутой женой. От которой муж…
Читать далее…
Эта статья не обязана тебе нравится. Она может вызвать в тебе гнев, неприятие или иные комплексные реакции. Возможно, я прикоснусь к ожогу твоих комплексов. Тебя…
Читать далее…
1 031 ₽
857 ₽
+ до 154 баллов
Бонусная программа
Итоговая сумма бонусов может отличаться от указанной, если к заказу будут применены скидки.
Купить
Цена на сайте может отличаться от цены в магазинах сети. Внешний вид книги может отличаться от изображения на сайте.
В наличии
В наличии в 639 магазинах. Смотреть на карте
11
Цена на сайте может отличаться от цены в магазинах сети. Внешний вид книги может отличаться от изображения на сайте.
Гид по психическому здоровью
Надоело быть как все? Хочешь серьезных перемен? Ищешь свой путь? Хватит сидеть и мечтать! Выброси пыльный чемодан условностей, сними привычную маску полезного члена общества, разбей свою личность на мелкие осколки и собери заново нового себя. .Эта книга — холодное ведро мотивации, после которого хочется встать, отряхнуться и начать действовать. Выполняй уникальные упражнения и присоединяйся к тысячам читателей, которые уже смогли круто изменить свою жизнь. .Осколки-блог.рф. — популярный блог по саморазвитию. Его автор Егор Горд смело и бескомпромиссно мотивирует своих последователей бросить вызов шаблонам, оставить ненавистную работу, заново расставить приоритеты и начать заниматься любимым делом.
Описание
Характеристики
Гид по психическому здоровью
Надоело быть как все? Хочешь серьезных перемен? Ищешь свой путь? Хватит сидеть и мечтать! Выброси пыльный чемодан условностей, сними привычную маску полезного члена общества, разбей свою личность на мелкие осколки и собери заново нового себя.
.Эта книга — холодное ведро мотивации, после которого хочется встать, отряхнуться и начать действовать. Выполняй уникальные упражнения и присоединяйся к тысячам читателей, которые уже смогли круто изменить свою жизнь. .Осколки-блог.рф. — популярный блог по саморазвитию. Его автор Егор Горд смело и бескомпромиссно мотивирует своих последователей бросить вызов шаблонам, оставить ненавистную работу, заново расставить приоритеты и начать заниматься любимым делом.Питер
1
Сделайте заказ в интернет-магазине
2
Напишите развёрнутый отзыв от 300 символов только на то, что вы купили
3
Дождитесь, пока отзыв опубликуют.
Если он окажется среди первых десяти, вы получите 30 бонусов на Карту Любимого Покупателя. Можно писать неограниченное количество отзывов к разным покупкам – мы начислим бонусы за каждый, опубликованный в первой десятке.
Правила начисления бонусов
Если он окажется среди первых десяти, вы получите 30 бонусов на Карту Любимого Покупателя. Можно писать неограниченное количество отзывов к разным покупкам – мы начислим бонусы за каждый, опубликованный в первой десятке.
Правила начисления бонусов
Книга на любителя
Плюсы
Заставляет подумать, легка в прочтении.
Хотите себе мощного пинка? Вот он!
Плюсы
Легко читается, отличное содержание
Минусы
Нет
Книга «13 осколков личности. Книга сильных» есть в наличии в интернет-магазине «Читай-город» по привлекательной цене. Если вы находитесь в Москве, Санкт-Петербурге, Нижнем Новгороде, Казани, Екатеринбурге, Ростове-на-Дону или любом другом регионе России, вы можете оформить заказ на книгу Егор Горд «13 осколков личности. Книга сильных» и выбрать удобный способ его получения: самовывоз, доставка курьером или отправка почтой. Чтобы покупать книги вам было ещё приятнее, мы регулярно проводим акции и конкурсы.
Вот несколько отличных слайдов из нашего курса Core Elasticsearch: Operations, которые помогают объяснить концепцию. Мы рекомендуем вам пройти полный курс, чтобы понять это еще лучше, но я приведу обзор нашего обучения здесь:
Распределение осколков — это процесс выделения осколков узлам. Это может произойти во время первоначального восстановления, выделения реплик, повторной балансировки или при добавлении или удалении узлов. Большую часть времени вам не нужно об этом думать, эта работа выполняется Elasticsearch в фоновом режиме. Если вам когда-нибудь были интересны эти подробности, в этом блоге мы рассмотрим распределение сегментов в нескольких различных сценариях.
Это наш кластер из 4 узлов, это то, что мы будем использовать для примеров в нашем контенте:
Мы рассмотрим несколько различных сценариев.
Это самый простой вариант использования. Мы создали индекс c и для него должны назначить новые осколки. Это будет сделано путем индексации первого документа в новый индекс c с помощью команды, как вы видите в сером поле, с помощью плагина Console (ранее Sense) из Kibana.
Для индекса c мы создаем один основной сегмент и одну реплику. Мастеру необходимо создать индекс c и назначить 2 сегмента для c0, основной и реплики. Способ, которым кластер будет балансировать кластер, заключается в следующем:
Существуют определенные ограничения на этот процесс, и эти ограничения налагаются лицами, принимающими решение о распределении. Они оценивают каждое решение, которое пытается принять кластер, и принимают решение «да» или «нет».
Самый чистый пример этого — вы не можете поместить первичный узел и реплику на один и тот же узел.
Есть и другие примеры:
1. Фильтрация распределения для горячих/теплых установок. Это позволяет размещать осколки только на узлах с определенными атрибутами и либо принимать, либо отклонять решения, принятые кластером с помощью этой логики. Это пример управляемого пользователем решения, управляющего этой конфигурацией.
2. Распределитель использования диска. Мастер отслеживает использование диска в кластере и смотрит на верхний/нижний водяной знак. (см. «Время переместить осколок» ниже).
3. Троттлы, что означает, что в принципе мы можем назначить осколок узлу, но слишком много текущих восстановлений. Чтобы защитить узел и разрешить восстановление, механизм принятия решения о выделении может указать кластеру подождать и повторить попытку назначения сегмента тому же узлу в следующей итерации.
Как только мы примем решение о том, где находится первичный сегмент, он будет помечен как «инициализируемый», и решение будет передано в кластер через измененное состояние кластера, которое станет доступным для всех узлов в кластере.
После того, как будет отмечена инициализация, назначенный узел обнаружит, что ему назначен новый сегмент. Будет создан пустой индекс lucene, и как только это будет сделано, мастер будет предупрежден о том, что осколок готов, мастер пометит осколок как запущенный и отправит другое измененное состояние кластера. Как только узел, назначенный первичным, получит обновленное состояние кластера, он пометит осколок как запущенный. Поскольку это первичный, теперь нам будет разрешено индексировать:
Вся эта связь, как вы видели, осуществляется через измененное состояние кластера. После завершения этого цикла мастер выполнит повторную маршрутизацию и повторную оценку назначения сегментов, потенциально принимая решения о том, что было ограничено в предыдущей итерации.
В нашем примере мастер теперь должен попытаться назначить оставшуюся реплику c0. Это также решение лиц, принимающих решение о распределении, которые предотвращают назначение реплик до тех пор, пока первичная реплика не будет помечена как запущенная на узле, содержащем ее.
В этот момент повторная балансировка происходит с использованием того же процесса, который описан выше, с целью обеспечения баланса данных в кластере, и в этом примере мы назначим осколок реплики c0 узлу 3 в кластере. чтобы все было сбалансировано. Это должно оставить нам 3 сегмента на каждом узле в кластере.
В нашем предыдущем примере мы только что создали пустой осколок реплики, что было немного проще, чем если бы мы представили, что у нас уже есть запущенный первичный узел, в котором уже есть данные. Имея это в виду, нам нужно убедиться, что новая реплика имеет те же данные, что и первичная.
Когда реплики назначаются, важно понимать, что мы собираемся скопировать все недостающие данные с первичной копии на реплику. После этого мастер снова пометит реплику как запущенную и транслирует новое состояние кластера.
Время от времени вашему кластеру может потребоваться переместить уже существующие осколки внутри кластера. Это может произойти по ряду причин:
1. Явная конфигурация пользователя. Типичным примером этого является конфигурация Hot/Warm, которая перемещает данные на более медленные диски по мере их устаревания:
2. Пользователь дает команду elasticsearch фактически переместить осколок из одного места в другое для вас с помощью команды перенаправления кластера.
3. Блокировка решения о распределении дискового пространства из-за превышения пороговых значений для:
а. cluster.routing.allocation.disk.watermark.low
б. cluster.routing.allocation.disk.watermark.high
Нижний водяной знак не позволяет нам записывать новые осколки при срабатывании порога. Аналогично, верхний порог водяного знака перемещает осколки с узла до тех пор, пока дисковое пространство не упадет ниже порога.
4. В кластер добавлены узлы. Возможно, ваш кластер загружен на полную мощность, поэтому вы добавили новый узел. Elasticsearch попытается сбалансировать кластер.
Поскольку осколки могут содержать много гигабайт данных, их перемещение по кластеру может существенно повлиять на производительность. Чтобы этот процесс был прозрачным для пользователей, это должно происходить в фоновом режиме. Идея состоит в том, чтобы максимально ограничить влияние на другие аспекты производительности elasticsearch. С этой целью вводится дроссель (indices.recovery.max_bytes_per_sec/cluster.routing.allocation.node_concurrent_recoveries), чтобы гарантировать, что мы можем продолжать индексировать эти осколки.
Помните, что все данные elasticsearch хранятся в Lucene. Lucene содержит набор инвертированных индексов в наборе файлов, называемых сегментами. Эти инвертированные индексы имеют структуру, сообщающую вам о том, где в наборе документов появляются определенные токены/слова. При индексировании документов в Lucene они размещаются в буфере индексирования, который находится в памяти. Там он находится до тех пор, пока буфер не заполнится, или, в случае с elasticsearch, когда выдается что-то, называемое обновлением, все данные в буфере помещаются в инвертированный индекс, называемый сегментом.
Продолжая индексацию, мы таким же образом создаем новые сегменты. Суть сегментов в том, что они неизменяемы. Это означает, что после того, как вы написали один, они никогда не меняются. Если вы выполняете удаление или какое-либо изменение, оно переходит в новый сегмент, где снова происходит тот же процесс слияния.
Поскольку данные хранятся в памяти, теоретически данные могут быть потеряны до того, как они будут зафиксированы в файле сегмента. Чтобы смягчить это, elasticsearch использует журнал транзакций. Всякий раз, когда документ индексируется в Lucene, он также записывается в журнал транзакций.
Журнал транзакций записывается последовательно, с последним запросом в конце файла. Журналы транзакций позволяют нам восстановить документы, которые, возможно, не попали в lucene.
Мы можем создать сегмент без fsyncing, позволяя файловой системе храниться в памяти или ожидать сброса на диск. Это сделано из соображений производительности, и из-за этого журнал транзакций нужно чистить. Это делается с помощью elasticsearch flush.
При выпуске elasticsearch flush, lucene commit, который делает 2 вещи:
Это позволяет очистить журнал транзакций и гарантирует наличие всех данных. Для перемещения, если мы захватим заданный набор сегментов и сохраним их, у нас будет согласованный и неизменный моментальный снимок наших данных.
В нашем примере, когда кластер хочет переместить a0 с node4 на node5, сначала мастер делает это, помечая сегмент a0 как перемещающийся с node4 на node5. Node5 интерпретирует это как инициализирующую копию самого себя. Важная вещь, которую следует отметить в связи с этим поведением, заключается в том, что во время перебалансировки может показаться, что реплика перемещается с узла 4 на узел 5, при перемещении данных они всегда будут копироваться из основного сегмента (узел 1).
В приведенном ниже примере у нас есть пустой node5 и узел с основным node1. Помните о двух упомянутых ранее механизмах хранения данных: журнале транзакций и сегментах lucene. Мы показываем, как Node5 отвечает на запрос мастера об инициализации сегмента после чтения обновленного состояния кластера. Узел 5 переходит к узлу 1 и просит начать процесс восстановления. Затем Node1 подтвердит, что знает о запросе, который делает node5. Как только запрос будет найден, elasticsearch закрепит журнал транзакций, чтобы предотвратить его удаление, и сделает снимок в lucene, гарантируя, что мы захватим все данные в сегменте. Как только мы это сделаем, мы можем начать отправлять сегменты в целевой файл. Все это происходит в фоновом режиме, поэтому вы можете индексировать основные сегменты во время этого процесса. Как только это произойдет, мы воспроизведем журнал транзакций, чтобы убедиться, что все, чего не было в сегментах, теперь захвачено.
Теперь возникает вопрос, когда мы остановимся? Люди по-прежнему могут индексировать первичный сегмент, а это означает, что журнал транзакций растет. В 1.x мы заблокировали журнал транзакций, и с этого момента все входящие запросы блокируются до тех пор, пока мы не закончим воспроизведение журнала транзакций.
В 2.x/5.x мы лучше. Как только мы начнем перемещение, первичный узел начнет отправлять все операции индексации на новый первичный узел (узел 5). Поскольку мы знаем, когда мы сделали снимок lucene и когда шард был инициализирован, мы знаем, что именно нужно воспроизвести из журнала транзакций.
После завершения восстановления целевые узлы отправляют мастеру уведомление о том, что сегмент готов. Мастер обрабатывает запрос, копирует оставшиеся первичные данные и активирует шард. Затем его можно удалить из источника, и процесс повторяется до тех пор, пока не будет завершена перебалансировка.
Следующий сценарий, который мы рассмотрим, — это полный перезапуск кластера. Это сценарий, в котором мы имеем дело не с активными сегментами, а с поиском данных локально на каждом узле.
Сюда относятся такие вещи, как циклы обслуживания, обновления и все, что связано с плановым обслуживанием.
Здесь выбирается наш Мастер, затем создается состояние кластера или восстанавливается с диска. Теперь у нас есть список шардов, которые нужно назначить. В отличие от недавно проиндексированных данных, эти осколки не могут быть назначены нигде, поскольку они были назначены ранее. Это означает, что нам нужно найти данные и убедиться, что мы открыли ранее созданные индексы lucene.
Для этого мастер обращается к узлам, чтобы назначить первичный, и запрашивает список всего на диске. Это означает, что мы физически открываем сегменты, а затем отвечаем мастеру подтверждением копии шарда. В этот момент мастер решит, кто получит первичный. В версии 5.x мы ввели предпочтения для предыдущих основных цветов (оптимизация).
Ниже мы видим, что осколок a0 на узле 1 ранее действовал как первичный, но существует вероятность того, что любая действующая копия станет первичным. В этом случае осколок node4 помечен как инициализирующийся, но отличие в том, что на этот раз мы знаем, что должны использовать существующие данные, и можем просмотреть индексы lucene наших узлов, чтобы убедиться, что они действительны и могут быть открыты. Мастер уведомляется о том, что сегмент готов, сегмент назначен, и мастер добавляет это назначение в состояние кластера.
Чтобы проверить, что данные одинаковы на обоих осколках, мы переходим к процессу, аналогичному перемещению, за исключением того, что, поскольку все копии осколка восстанавливаются с диска, они могут уже совпадать, и никакие осколки не нужно будет переносить. более подробно процесс описан здесь.
Поскольку сегменты являются независимыми индексами Lucene, после тщательной индексации существует большая вероятность того, что они будут отличаться на диске от тех же сегментов на других узлах. Некоторые из них будут использовать больше ресурсов, чем другие, у некоторых будут любопытные соседи.
До версии 1.6 приходилось копировать все сегменты. Из-за этого восстановление до версии 1.6 было медленным. Мы должны синхронизировать первичную и реплику, но не можем использовать локальные данные. Чтобы справиться с этим, мы добавили sync_flush и sync_id. Это способ воспользоваться моментом, когда индексация не выполняется, зафиксировать информацию с помощью уникального идентификатора, гарантируя идентичность данных между копиями одного и того же сегмента. Поэтому, когда мы переходим к восстановлению, мы отправляем sync_id в качестве маркера, и если он совпадает, он не будет копировать файл и будет повторно использовать старые копии. Поскольку сегменты в lucene неизменяемы, это можно сделать только для неактивных сегментов. ПРИМЕЧАНИЕ: ниже на изображении показан один и тот же осколок на разных узлах, меняются номера копий.
На рисунке ниже узел node3 удален из кластера, а вместе с ним и основная копия шарда b1. Первый, немедленный шаг заключается в том, что мастер продвигает единственную реплику b1, которая в настоящее время находится на узле 1, в качестве нового основного. Состояние этого индекса, а также кластера теперь отображается желтым цветом, поскольку существует сегмент, в котором не размещены все копии сегментов (как указано пользователем в определении индекса). Следовательно, мастер должен попытаться выделить новую копию реплики этого сегмента одному из оставшихся узлов. Если node3 ушел из-за временного сбоя в сети (или длительной паузы JVM из-за сборки мусора), и нет дополнительной индексации шарда до того, как сбой пройдет и узел вернется в кластер, репликация шарда на другой узел во время его отсутствия будет расточительным использованием ресурсов.
В v1.6 для решения этой проблемы была введена настройка для каждого индекса (index.unassigned.node_left.delayed_timeout, по умолчанию 1 м). Когда node3 уйдет, перераспределение шарда будет отложено на этот период. Если node3 вернется до этого, копии сегментов будут сравниваться, и если первичный не изменился за это время, копия на node3 будет обозначена как реплика. Если он изменился, осколок будет повторно реплицирован на node3.
В версии 2.0 было добавлено улучшение: если node3 возвращается после delayed_timeout, для любых осколков на node3, которые все еще соответствуют первичной копии (на основе маркера sync_id), любые репликации, которые были инициированы, будут остановлен, а копия на узле3 будет обозначена как реплика.
Примечание редактора: Эмпирическое правило «Стремиться к 20 или менее осколкам на ГБ памяти кучи» устарело в версии 8.3. Этот блог был обновлен, чтобы отразить новую рекомендацию.
Elasticsearch — очень универсальная платформа, которая поддерживает различные варианты использования и обеспечивает большую гибкость в отношении организации данных и стратегий репликации. Однако эта гибкость иногда может затруднить заранее определить, как лучше всего организовать ваши данные в индексы и сегменты, особенно если вы новичок в Elastic Stack. Хотя неоптимальный выбор не обязательно вызовет проблемы при первом запуске, он может вызвать проблемы с производительностью по мере роста объемов данных с течением времени. Чем больше данных содержится в кластере, тем сложнее исправить проблему, поскольку иногда может потребоваться переиндексация больших объемов данных.
Когда мы сталкиваемся с пользователями, которые испытывают проблемы с производительностью, нередко это можно проследить до проблем, связанных с индексацией данных и количеством сегментов в кластере. Это особенно верно для вариантов использования, включающих мультитенантность и/или использование временных индексов. При обсуждении этого с пользователями, будь то лично на мероприятиях или встречах, или на нашем форуме, одними из наиболее распространенных вопросов являются: «Сколько осколков у меня должно быть?» и «Какого размера должны быть мои осколки?»
Эта запись в блоге призвана помочь вам ответить на эти вопросы и предоставить практические рекомендации по вариантам использования, которые включают использование временных индексов (например, ведение журнала или аналитика безопасности) в одном месте.
Прежде чем мы начнем, нам нужно установить некоторые факты и терминологию, которые нам понадобятся в следующих разделах.
Данные в Elasticsearch организованы в виде индексов. Каждый индекс состоит из одного или нескольких осколков. Каждый сегмент представляет собой экземпляр индекса Lucene, который можно рассматривать как автономную поисковую систему, которая индексирует и обрабатывает запросы для подмножества данных в кластере Elasticsearch.
Когда данные записываются в сегмент, они периодически публикуются в новых неизменяемых сегментах Lucene на диске, и именно в это время они становятся доступными для запросов. Это называется обновлением. Как это работает, более подробно описано в Elasticsearch: The Definitive Guide.
По мере роста числа сегментов они периодически объединяются в более крупные сегменты. Этот процесс называется слиянием. Поскольку все сегменты являются неизменяемыми, это означает, что используемое дисковое пространство обычно будет колебаться во время индексации, поскольку необходимо создать новые объединенные сегменты, прежде чем можно будет удалить те, которые они заменяют. Слияние может потребовать значительных ресурсов, особенно в отношении дискового ввода-вывода.
Осколок — это единица, в которой Elasticsearch распределяет данные по кластеру. Скорость, с которой Elasticsearch может перемещать сегменты при перебалансировке данных, например. после сбоя будет зависеть от размера и количества сегментов, а также от производительности сети и диска.
СОВЕТ: Избегайте очень больших сегментов, так как это может отрицательно сказаться на способности кластера восстанавливаться после сбоя. Не существует фиксированного ограничения на то, насколько большими могут быть сегменты, но размер сегмента в 50 ГБ часто указывается как ограничение, которое, как было замечено, работает для различных вариантов использования. |
Поскольку сегменты неизменяемы, при обновлении документа Elasticsearch сначала находит существующий документ, затем помечает его как удаленный и добавляет обновленную версию. Удаление документа также требует, чтобы документ был найден и помечен как удаленный. По этой причине удаленные документы будут по-прежнему занимать место на диске и некоторые системные ресурсы, пока они не будут объединены, что может потреблять много системных ресурсов.
Elasticsearch позволяет очень эффективно удалять полные индексы непосредственно из файловой системы без явного удаления всех записей по отдельности. Это, безусловно, самый эффективный способ удалить данные из Elasticsearch.
СОВЕТ: Старайтесь использовать временные индексы для управления сохранением данных, когда это возможно. Сгруппируйте данные в индексы на основе периода хранения. Индексы, основанные на времени, также упрощают изменение количества первичных сегментов и реплик с течением времени, так как это можно изменить для создания следующего индекса. Это упрощает адаптацию к изменяющимся объемам данных и требованиям.
Для каждого индекса Elasticsearch информация о сопоставлениях и состоянии хранится в состоянии кластера. Это хранится в памяти для быстрого доступа. Таким образом, наличие большого количества индексов и сегментов в кластере может привести к большому состоянию кластера, особенно если сопоставления велики. Это может стать медленным для обновления, так как все обновления должны выполняться через один поток, чтобы гарантировать согласованность до того, как изменения будут распределены по кластеру.
СОВЕТ: Чтобы уменьшить количество индексов и избежать больших и растянутых отображений, рассмотрите возможность хранения данных с похожей структурой в одном индексе, а не разбиения на отдельные индексы в зависимости от того, откуда поступают данные. Важно найти хороший баланс между количеством индексов и сегментов и размером отображения для каждого отдельного индекса. Поскольку состояние кластера загружается в кучу на каждом узле (включая мастера), а объем кучи прямо пропорционален количеству индексов, полей на индекс и сегментов, важно также отслеживать кучу использование на главных узлах и убедитесь, что они имеют соответствующий размер.
Каждый сегмент содержит данные, которые необходимо хранить в памяти и использовать пространство кучи. Сюда входят структуры данных, содержащие информацию на уровне сегмента, а также на уровне сегмента, чтобы определить, где данные находятся на диске. Размер этих структур данных не является фиксированным и будет варьироваться в зависимости от варианта использования.
Одна важная характеристика служебных данных, связанных с сегментом, заключается в том, что они не строго пропорциональны размеру сегмента. Это означает, что более крупные сегменты имеют меньшую нагрузку на объем данных по сравнению с более мелкими сегментами. Разница может быть существенной.
Чтобы иметь возможность хранить как можно больше данных на каждом узле, становится важным управлять использованием кучи и максимально сокращать объем накладных расходов. Чем больше места в куче у узла, тем больше данных и сегментов он может обработать.
Таким образом, индексы и сегменты не свободны с точки зрения кластера, поскольку для каждого индекса и сегмента существует некоторый уровень накладных расходов.
СОВЕТ: Маленькие осколки приводят к небольшим сегментам, что увеличивает накладные расходы. Старайтесь поддерживать средний размер сегмента от нескольких ГБ до нескольких десятков ГБ. Для вариантов использования с данными на основе времени обычно встречаются осколки размером от 20 ГБ до 40 ГБ.
СОВЕТ: Поскольку накладные расходы на сегмент зависят от количества и размера сегментов, принудительное слияние меньших сегментов в более крупные с помощью операции forcemerge может сократить накладные расходы и повысить производительность запросов. В идеале это следует сделать после того, как в индекс больше не будут записываться данные. Имейте в виду, что это дорогостоящая операция, которую в идеале следует выполнять в непиковые часы.
СОВЕТ: Количество сегментов, которые вы можете хранить на узле, будет пропорционально количеству доступной кучи, но Elasticsearch не устанавливает фиксированного ограничения. Хорошим практическим правилом является обеспечение того, чтобы количество сегментов на узел не превышало 20 на куче ГБ, которую он настроил. Таким образом, узел с кучей размером 30 ГБ должен иметь максимум 600 шардов, но чем меньше этот предел, тем лучше. Как правило, это помогает кластеру оставаться в хорошем состоянии. (Примечание редактора: начиная с версии 8.3 мы значительно сократили использование кучи на один сегмент, тем самым обновив эмпирическое правило в этом блоге. Пожалуйста, следуйте Документация для 8.3+ версий Elasticsearch.) .
В Elasticsearch каждый запрос выполняется в одном потоке на сегмент. Однако несколько сегментов могут обрабатываться параллельно, как и несколько запросов и агрегаций для одного и того же сегмента.
Это означает, что минимальная задержка запроса при отсутствии кэширования будет зависеть от данных, типа запроса, а также размера сегмента. Запрос большого количества небольших сегментов ускорит обработку каждого сегмента, но, поскольку необходимо ставить в очередь и последовательно обрабатывать гораздо больше задач, это не обязательно будет быстрее, чем запрос меньшего количества более крупных сегментов. Наличие большого количества небольших сегментов также может снизить пропускную способность запросов при наличии нескольких одновременных запросов.
СОВЕТ: Лучший способ определить максимальный размер сегмента с точки зрения производительности запроса — эталонный тест с использованием реалистичных данных и запросов . Всегда выполняйте сравнительный анализ с нагрузкой запроса и индексирования, представляющей то, что узел должен будет обрабатывать в рабочей среде, поскольку оптимизация для одного запроса может дать вводящие в заблуждение результаты.
При использовании временных индексов каждый индекс традиционно связывался с фиксированным периодом времени. Ежедневные индексы очень распространены и часто используются для хранения данных с коротким периодом хранения или больших дневных объемов. Это позволяет управлять периодом хранения с хорошей степенью детализации и упрощает ежедневную адаптацию к изменяющимся объемам. Данные с более длительным периодом хранения, особенно если ежедневные объемы не требуют использования ежедневных индексов, часто используют еженедельные или ежемесячные индексы, чтобы сохранить размер сегмента. Это уменьшает количество индексов и сегментов, которые необходимо хранить в кластере с течением времени.
СОВЕТ. При использовании основанных на времени индексов, охватывающих фиксированный период, скорректируйте период, охватываемый каждым индексом, в зависимости от срока хранения и ожидаемых объемов данных, чтобы достичь целевого размера сегмента.
Индексы на основе времени с фиксированным интервалом времени хорошо работают, когда объемы данных достаточно предсказуемы и меняются медленно. Если скорость индексации может быстро меняться, поддерживать единый размер целевого сегмента очень сложно.
Чтобы лучше справляться с такими сценариями, были введены API-интерфейсы Rollover и Shrink. Это повышает гибкость управления индексами и осколками, особенно для индексов, основанных на времени.
API-интерфейс ролловер-индекса позволяет указать количество документов, которые должен содержать индекс, и/или максимальный период, в течение которого в него должны быть записаны документы. Как только один из этих критериев превышен, Elasticsearch может инициировать создание нового индекса для записи без простоя. Вместо того, чтобы каждый индекс покрывал определенный период времени, теперь можно переключиться на новый индекс определенного размера, что упрощает достижение одинакового размера фрагмента для всех индексов.
В тех случаях, когда данные могут быть обновлены, больше нет четкой связи между отметкой времени события и индексом, в котором оно находится, при использовании этого API, что может сделать обновления значительно менее эффективными, поскольку каждому обновлению может потребоваться предшествовать поиск.
СОВЕТ: Если у вас есть неизменяемые данные с временной привязкой, объемы которых могут значительно меняться с течением времени, рассмотрите возможность использования API-интерфейса пролонгированного индекса для достижения оптимального целевого размера сегмента путем динамического изменения периода времени, охватываемого каждым индексом. . Это дает большую гибкость и может помочь избежать слишком больших или слишком маленьких осколков, когда объемы непредсказуемы.
API сокращения индекса позволяет сжать существующий индекс в новый индекс с меньшим количеством первичных сегментов. Если во время индексации требуется равномерное распределение осколков по узлам, но это приведет к слишком маленьким осколкам, этот API можно использовать для уменьшения количества первичных осколков после того, как индекс больше не будет индексироваться. Это приведет к более крупным осколкам, лучше подходящим для более длительного хранения данных.
СОВЕТ: Если вам нужно, чтобы каждый индекс охватывал определенный период времени, но при этом вы хотите иметь возможность распределять индексирование по большому количеству узлов, рассмотрите возможность использования API сжатия, чтобы уменьшить количество первичные осколки, когда индекс больше не индексируется. Этот API также можно использовать для уменьшения количества сегментов, если вы изначально настроили слишком много сегментов.
В этом сообщении блога представлены советы и практические рекомендации по оптимальному управлению данными в Elasticsearch. Если вам интересно узнать больше, «Elasticsearch: полное руководство» содержит раздел о проектировании для масштабирования, который стоит прочитать, хотя он немного устарел.
Однако многие решения о том, как лучше всего распределить данные по индексам и сегментам, будут зависеть от специфики варианта использования, и иногда может быть трудно определить, как лучше всего применить доступные рекомендации.
Об авторе