Еластични изследвания в производството - най-добри практики за внедряване

Elasticsearch е високо оптимизирана търсачка за съвременна анализа на данни.

Elasticsearch е невероятна машина за търсене и анализи в реално време. Тя е построена на Apache Lucene. Той е разпространен, РЕСТИНАЛЕН, лесен за стартиране и високо достъпен. Случаите за използване на Elasticsearch включват захранване на търсенето, мониторинг на транзакции и откриване на грешки, откриване на съдържание, анализи на журнали, размито търсене, обобщаване на данни за събития, визуализация на данни. Elasticsearch и останалата част от Elastic Stack се оказаха изключително универсални и както можете да видите по-горе случаи на използване, има множество начини да интегрирате Elasticsearch в това, което вашият продукт доставя днес и да добавите допълнителна представа за него.

Използваме го много за търсене и анализи в Botmetric, индексираме около милиард документи на ден и използваме много сложни агрегации за визуализация на данни в реално време.

Това каза, че зареждането на дадено приложение срещу неговото стартиране в производството и поддържането са напълно различни. Този акрил обхваща много от тези фактори от реалния опит от живота и са основните общи елементи, които трябва да вземете предвид при провеждането на Elasticsearch в производството.

памет:

Elasticsearch и Lucene са написани на Java, което означава, че трябва да внимавате за статистиката на пространството и JVM. Колкото повече грамада е на разположение на Elasticsearch, толкова повече памет може да използва за филтриране и друго кеширане, за да увеличи производителността на заявките. Но имайте предвид, че твърде многото грамада може да ви подложи на дълги паузи за събиране на боклук. Не поставяйте Xmx над средната стойност, която JVM използва за показатели на компресиран обект (компресиран oops); точната граница варира, но е близо 32 GB.

Често срещан проблем е конфигурирането на грамада, която е твърде голяма. Разполагате с 64 GB машина - и, разбира се, искате да дадете на Elasticsearch всичките 64 GB памет. Повече е по-добре! Heap определено е важен за Elasticsearch. Използва се от много структури от данни в паметта, за да осигури бърза работа. Но с това казано, има и друг основен потребител на памет, който е изключен: кеш на файловете на OS.

Lucene е проектиран да използва основната ОС за кеширане на структури от данни в паметта. Луценовите сегменти се съхраняват в отделни файлове. Тъй като сегментите са неизменни, тези файлове никога не се променят. Това ги прави много кешовидни и основната операционна система с радост ще запази горещите сегменти в паметта за по-бърз достъп. Тези сегменти включват както обърнат индекс (за търсене в пълен текст), така и док стойности (за обобщения). Изпълнението на Lucene разчита на това взаимодействие със ОС. Но ако дадете цялата налична памет на кучетата на Elasticsearch, няма да остане нищо за кеша на файловете в OS. Това може сериозно да повлияе на представянето. Стандартната препоръка е да се даде 50% от свободната памет на грамада Elasticsearch, като останалите 50% оставят безплатни. Няма да се използва; Люцена с радост ще консумира всичко останало за кеш на файлове. Helasticsearch купи може да се конфигурира по следните начини,

експортиране ES_HEAP_SIZE = 10гр

или

ES_JAVA_OPTS = "- Xms10g -Xmx10g" ./bin/elasticsearch

ПРОЦЕСОР:

Elasticsearch поддържа агрегиране и филтрирани заявки. Изпълнението на сложни филтрирани заявки, интензивното индексиране, перколация и заявки срещу индекси се нуждаят от тежък процесор, така че избирането на правилните е от решаващо значение. Човек трябва да разбере спецификациите на процесора и как се държи с Java, докато заявките се изпълняват на JVM.

Всеки пул изпълнява редица нишки, които могат да бъдат конфигурирани и имат опашка. Промяната на това не се препоръчва, освен ако нямате много специфични изисквания, тъй като Elasticsearch разпределя ядра динамично.

Видове нишки с нишки:

Elasticsearch има 3 вида басейни с конци.

  1. Кеширано: Кешираният пул от нишки е необвързан пул от нишки, който ще породи нишка, ако има чакащи заявки. Този пул за нишки се използва за предотвратяване на блокиране или отхвърляне на заявки, изпратени до този пул. Неизползваните нишки в този пул с нишки ще бъдат прекратени след изтичане на поддържания жив текст (по подразбиране до пет минути). Кешираният пул от нишки е запазен за общия пул с нишки.
  2. Фиксиран: Пулът с фиксирана нишка съдържа фиксиран размер на нишки за обработка на заявките с опашка (по избор ограничена) за чакащи заявки, които нямат нишки, които да ги обслужват. Параметърът размер контролира броя на нишките и по подразбиране към броя на ядрата 5 пъти.
  3. Мащабиране: Пулът на мащабиращата нишка съдържа динамичен брой нишки. Това число е пропорционално на натоварването и варира между 1 и стойността на параметъра размер.

Elasticsearch разделя използването на процесора на групи от нишки от различни видове:

  • общо: за стандартни операции, като например откриване и тип пул на ниш е кеширан.
  • индекс: за операции по индексиране / изтриване. Типът нива на нишката е фиксиран.
  • търсене: за брой / операции за търсене. Типът нива на нишката е фиксиран.
  • get: за да получите операции. Типът нива на нишката е фиксиран.
  • насипно състояние: за групови операции като групово индексиране. Типът нива на нишката е фиксиран. Най-добрата конфигурация на групови документи зависи от конфигурацията на клъстера, това може да бъде идентифицирано чрез изпробване на няколко стойности.
  • перколат: за просмукване. Типът нива на нишката е фиксиран.
  • refresh: за операции за опресняване. Типът нива с нишки е мащабиран.

Промяната на конкретен пул от нишки може да се извърши чрез задаване на неговите специфични параметри.

Прочетете повече https://www.elastic.co/guide/en/elasticsearch/reference/2.2/modules-threadpool.html#types

Размер на жилото:

Елементът е единицата, на която Elasticsearch разпространява данни в клъстера. Скоростта, с която Elasticsearch може да придвижва частици, когато пребалансира данните, напр. след неуспех, ще зависи от размера и броя на парчетата, както и от работата на мрежата и диска.

В Elasticsearch всяка заявка се изпълнява в една нишка на шейд. Множество частици обаче могат да бъдат обработвани паралелно, както и множество запитвания и агрегации срещу един и същ фрагмент.

Това означава, че минималната латентност на заявките, когато не се извършва кеширане, ще зависи от данните, вида на заявката, както и от размера на шейдъра. Заявката за много малки парчета ще направи обработката на един фрагмент по-бърза, но тъй като много повече задачи трябва да се поставят на опашка и да се обработват последователно, това не е задължително да бъде по-бързо, отколкото да заявите по-малък брой по-големи парчета. Наличието на много малки парчета също може да намали пропускателната способност на заявките, ако има няколко едновременни заявки.

Всеки шейд има данни, които трябва да се запазят в паметта и да се използва хепа пространство. Това включва структури от данни, съдържащи информация на нивото на фрагмента, а също и на ниво сегмент, за да се определи къде се намират данните на диска. Размерът на тези структури от данни не е фиксиран и ще варира в зависимост от случая на използване. Една важна характеристика на сегмента, свързан с режийните разходи, е, че той не е строго пропорционален на размера на сегмента. Това означава, че по-големите сегменти имат по-малко режийни разходи на обем от данни в сравнение с по-малките сегменти. Разликата може да бъде съществена. Изборът на точния брой парчета е сложен, защото никога не знаете колко документи ще получите преди да започнете. Наличието на много парчета може да бъде както добро, така и страшно за клъстер. Управлението на индексите и парчетата може да претовари главния възел, което може да стане неотговорно, което да доведе до някакво странно и гадно поведение. Отделете достатъчно ресурси на главните ви възли, за да се справи с размера на клъстера.

Лошото е, че броят на парчетата е неизменен и се определя, когато създавате индекса. След като индексът е създаден, единственият начин да промените броя на парчетата е да изтриете вашите индекси, да ги създадете отново и да го направите отново.

копиране

Elasticsearch поддържа репликация, данните се репликират между възлите на данни, така че загубата на възел не би довела до загуба на данни. По подразбиране репликационният коефициент е 1, но в зависимост от вашите изисквания към продукта той може да бъде увеличен. Колкото повече реплики, толкова по-устойчиви на бедствия ще бъдат вашите данни. Друго предимство на наличието на повече реплики е, че всеки възел държи реплика от реплики, което подобрява производителността на заявките, тъй като репликите също се използват за заявки.

Формулировката за репликация, използвана от Elasticsearch за последователност е,

(първичен + число_от_репликации) / 2 + 1

Оптимизиране на разпределението

Въз основа на изискванията за данни за продуктите можем да класифицираме данните на топли и студени. Индексите, до които се осъществява достъп по-често от други, могат да бъдат разпределени повече възли за данни, докато индексите, които са по-рядко достъпни индекси, могат да имат по-малко ресурси. Тази стратегия е особено полезна за съхранение на данни от времеви редове като дневници на приложения (напр .: ELK).

Това може да се постигне чрез стартиране на cronjob, който премества индексите на различни възли на равни интервали.

Горещ възел е вид възел от данни, който извършва цялото индексиране в клъстера. Те притежават и най-новите индекси, тъй като те обикновено са най-често запитвани. Тъй като индексирането е интензивна работа на процесора и IO, тези сървъри трябва да бъдат мощни и подкрепени от прикрепено SSD хранилище. Препоръчваме да стартирате минимум 3 горещи възла за висока наличност. В зависимост от количеството на последните данни, които искате да събирате и запитвате, може да се наложи да увеличите това число, за да постигнете целите си за ефективност.

Топлият възел е тип възел за данни, предназначен да борави с голямо количество индекси само за четене, които не са толкова вероятни да бъдат често задавани. Тъй като тези индекси са само за четене, топлият възел обикновено използва големи прикачени дискове (обикновено въртящи се дискове) вместо SSD. Както при горещия възел, ние препоръчваме минимум 3 топъл възел за висока наличност. И както преди, с предупреждението, че по-големият обем данни може да изисква допълнителни възли, за да отговаря на изискванията за производителност. Също така имайте предвид, че конфигурациите на процесора и паметта често трябва да отразяват тези на горещите ви възли. Това може да се определи само чрез тестване с заявки, подобни на това, което бихте изпитали в производствена ситуация.

За повече подробности относно горещия и топъл възел вижте тук.

Друга стратегия, която можете да адаптирате е, архивиране на индексите до s3 и възстановяване, когато имате нужда от данни от тези индекси. Можете да прочетете повече за това от тук.

Топология на възела:

Elasticsearch възлите могат да бъдат разделени на три категории главен възел, възел за данни, клиентски възел.

  1. Главен възел: Главният възел може да бъде малък, ако не е и възел на данни, тъй като не съхранява никакви индекси / резки. Нейната отговорност е да съхранява подробно състояние на клъстера и да помага на данни и други възли в търсене на метаданни на индекси / парчета. Elasticsearch трябва да има множество главни възли, за да се избегне проблем с мозъка.
  2. Възел от данни: Възелът на данни е отговорен за съхраняването / заявката на действителните данни от индекса.
  3. Клиентски възел: Клиентският възел се използва като прокси за индексиране и търсене. Това е силно препоръчително, ако агрегациите се използват силно. Това са специални възли ElasticSearch, които не отговарят нито на данни, нито на главен. Клиентските възли са наясно с клъстерите и затова могат да действат като интелигентни балансиращи натоварвания. Можете да изпратите вашите заявки до възлите на клиента, които след това могат да поемат скъпата задача за събиране на отговори на резултатите от заявката от всеки от възлите на данни.

добавете тези настройки къмustialsearch.yml файл за съответните възли.

Главен възел: node.master: вярно node.data:false
Възел от данни: node.master: невярно node.data:true
Клиентски възел: node.master: false node.data:false

Съвети за отстраняване на проблеми:

Производителността на elastsesearch силно зависи от машината, на която е инсталирана. Процесорът, използването на паметта и дисковият вход / изход са основни показатели на операционната система за всеки възел Elasticsearch. Препоръчва се да погледнете в показателите на Java Virtual Machine (JVM), когато CPU използва шипове. В следващия пример причината за шипа беше по-голямата активност за събиране на боклука.

  1. Хепи налягане: Високото налягане в паметта работи срещу производителността на клъстера по два начина: Тъй като налягането в паметта нараства до 75% и повече, остава по-малко памет и сега вашият клъстер също трябва да изразходва някои ресурси на процесора, за да възстанови паметта чрез събиране на боклука. Тези цикли на процесора не са достъпни за обработка на потребителски заявки, докато е включено събирането на боклука. В резултат на това времето за реакция на потребителските заявки се увеличава, тъй като системата става все по-ограничена от ресурси. Ако налягането в паметта продължава да се повишава и достига близо 100%, се използва много по-агресивна форма за събиране на боклука, което от своя страна ще повлияе драстично на реакциите на клъстера. Показателят Response Times metric показва, че високото налягане в паметта води до значително въздействие върху производителността.
  2. Растеж на несериозната памет на JVM, изяждане на памет, предназначена за кеш на страницата и евентуално причиняване на жътва на OOM на ниво ядро.
  3. Избягвайте разделения мозъчен проблем. Разделеният мозък е сценарий, при който клъстерът се разделя. Например, имате 6 възела клъстер. 2 възли се прекъсват от клъстера, но все още са в състояние да се виждат. Тези 2 възли създават друг клъстер. Те дори ще изберат нов господар помежду си. Вече имаме два клъстера със същото име, един с 4 възли и друг с 2 възли. Всеки също има главен възел. Това се нарича проблем с разделен мозък с ES клъстери. За да избегнете това, задайте ES параметъра откриване.zen.minimum_master_nodes на половината от броя на възлите + 1.
  4. Тъй като Elasticsearch използва устройства за съхранение интензивно, наблюдението на дисковия вход / изход гарантира, че тази основна потребност ще бъде изпълнена. Има много причини за намаляване на дисковия вход / изход, счита се за ключов показател за прогнозиране на много видове проблеми. Добър показател е да проверите ефективността на индексирането и изпълнението на заявките. Анализът на операции за четене и запис директно показва какво се нуждае най-много от системата в конкретния случай на употреба. Настройките на операционната система за дисковия вход / изход са основа за всички други оптимизации, настройката на дисковия вход / изход може да избегне потенциални проблеми. Ако дисковият вход / изход все още не е достатъчен, противодействия като оптимизиране на броя на парчетата и техния размер, дроселиране на сливания, подмяна на бавни дискове, преместване на SSD дискове или добавяне на повече възли трябва да бъдат оценени в зависимост от обстоятелствата, причиняващи I / O затруднения.
  5. За приложенията, които разчитат на търсене, потребителското изживяване е силно свързано с латентността на заявките за търсене. Има много неща, които могат да повлияят на ефективността на заявката, като конструирани заявки, неправилно конфигуриран клъстер Elasticsearch, проблеми с JVM памет и събиране на боклук, дисково излъчване и т.н. Закъснението на заявката е показателят, който влияе пряко на потребителите, така че не забравяйте да поставите някои сигнали за него.
  6. Повечето от филтрите в Elasticsearch са кеширани по подразбиране. Това означава, че по време на първото изпълнение на филтрирана заявка, Elasticsearch ще намери документи, съвпадащи с филтъра, и ще изгради структура, наречена „битсет“, използвайки тази информация. Данните, съхранявани в битовия набор, съдържат идентификатор на документ и дали даден документ съвпада с филтъра. Следващите изпълнения на заявки със същия филтър ще използват повторно информацията, съхранена в битовия набор, като по този начин ще правят изпълнението на заявките по-бързо чрез запазване на I / O операции и CPU цикли. Използването на филтъра в заявката е препоръчително. За повече подробности вижте тук.
  7. Времето за опресняване и времето за сливане са тясно свързани с индексирането на производителността, плюс те влияят върху цялостната ефективност на клъстера. Времето за опресняване се увеличава с броя на файловите операции за Lucene индекс (shard).
  8. Активирането на бавно регистриране на заявките ще ви помогне да идентифицирате кои заявки са бавни и какво може да се направи за подобряването им, особено полезно за заявки със заместващи символи.
  9. Увеличете размера на неограничен размер, за да разрешите макс файлове.
  10. Производителността на ElasticSearch може да пострада, когато ОС реши да смени неизползваната памет на приложението. Деактивирайте размяната чрез настройка на настройките за ниво на OS или задайте следното в конфигурацията ElasticSearch bootstrap.mlockall: true
  11. Деактивирайте изтриването на всички индекси чрез заявка със заместващи символи. За да се гарантира, че някой не издава операция DELETE за всички индекси (* или _ всички), задайте action.destructive_requires_name на true.

Преди да приключите, ето списъкът с URL адреси, които са полезни за гледане на показателите.

  • / _cluster / health? доста: За индикатора за здравето на клъстера.
  • / _status? pretty: За цялата информация за всички индекси.
  • / _nodes? pretty: За цялата информация за възлите.
  • / _cat / master? pretty: За главен възел.
  • / _stats? pretty: За разпределение на осколки, статистика на индексите.
  • / _nodes / stats? pretty: За отделна статистика на възлите това включва jvm, http, io stats за възела.

Обобщаването на показателите на Elasticsearch се поддържа от повечето инструменти за мониторинг на системата като Datadog, TICK. Използването на такива инструменти се препоръчва и създаването на фуния силно се препоръчва за непрекъснат мониторинг на Elasticsearch.

Заключение:

Elasticsearch е разпределен пълен текст за търсене и аналитика, който дава възможност на множество наематели да търсят през целия си набор от данни, независимо от размера, с безпрецедентна скорост. В допълнение към пълнотекстовите си възможности за търсене, ElasticSearch се удвоява като система за анализи и разпределена база данни. ElasticSearch има големи настройки по подразбиране, за да започнете. Но след като преминете първоначалния етап на експериментиране, трябва да отделите известно време, за да настроите настройките за вашите нужди. Препоръчва се да прегледате конфигурацията си по-късно, заедно с официалната документация, за да сте сигурни, че вашият клъстер е конфигуриран да отговаря на вашите нужди.