Еластичні дослідження у виробництві - кращі практики впровадження

Elasticsearch - це високооптимізована пошукова система для сучасної аналітики даних.

Elasticsearch - це дивовижна система пошуку та аналітики в реальному часі. Він побудований на лупах Apache. Він розповсюджується, ВІДПОВІДНИЙ, простий у користуванні та доступний. Випадки використання Elasticsearch включають в себе пошук пошуку, моніторинг транзакцій та виявлення помилок, виявлення вмісту, аналітику журналу, нечіткий пошук, агрегацію даних про події, візуалізацію даних. Elasticsearch та решта Elastic Stack виявилися надзвичайно універсальними, і, як ви бачите вище, випадки використання, є декілька способів інтегрувати Elasticsearch у те, що постачається вашим продуктом сьогодні, та додати йому додаткового розуміння.

Ми активно використовуємо його для пошуку та аналітики в Botmetric, ми індексуємо близько мільярда документів на день і використовуємо дуже складні агрегації для візуалізації даних у режимі реального часу.

Однак, завантажувальний додаток і запуск його у виробництві та обслуговуванні абсолютно різні. Цей кругообіг охоплює багато цих факторів з реального досвіду життя і є основними елементами, які слід враховувати для запуску Elasticsearch у виробництві.

Пам'ять:

Elasticsearch та Lucene написані на Java, а це означає, що ви повинні оглянути статистику простору та статистику JVM. Чим більше купа доступних для Elasticsearch, тим більше пам'яті вона може використовувати для фільтрування та іншого кешування для підвищення продуктивності запитів. Але зауважте, що занадто велика купа може спричинити вас довгими паузами з вивезенням сміття. Не встановлюйте Xmx над зрізом, який JVM використовує для стиснених покажчиків об'єктів (стислих упс); точне відсічення коливається, але становить близько 32 ГБ.

Поширена проблема полягає в налаштуванні занадто великої купи. У вас машина на 64 Гб - і, по-своєму, ви хочете дати Elasticsearch усіх 64 Гб пам'яті. Більше краще! Купа, безумовно, важлива для Elasticsearch. Він використовується багатьма структурами даних в пам'яті для забезпечення швидкої роботи. Але, маючи на увазі, є ще один основний користувач пам'яті, який вимкнений: кеш файлів ОС.

Lucene призначений для використання базової ОС для кешування структур даних в пам'яті. Луценні сегменти зберігаються в окремих файлах. Оскільки сегменти незмінні, ці файли ніколи не змінюються. Це робить їх дуже зручними для кешу, а основна ОС з радістю збереже гарячі сегменти в пам'яті для швидшого доступу. Ці сегменти включають як інвертований індекс (для повнотекстового пошуку), так і значення doc (для агрегації). Продуктивність Lucene покладається на цю взаємодію з ОС. Але якщо ви віддасте всю наявну пам’ять купі Elasticsearch, для кешу файлів ОС нічого не залишиться. Це може серйозно вплинути на продуктивність. Стандартна рекомендація полягає в наданні 50% наявної пам'яті купі Elasticsearch, а інші 50% залишаються вільними. Він не залишиться невикористаним; Lucene із задоволенням споживає все, що залишилося для кешу файлів. Купу Elasticsearch можна налаштувати наступними способами,

експорт ES_HEAP_SIZE = 10г

або

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

ЦП:

Elasticsearch підтримує агрегацію та відфільтровані запити. Виконання складних відфільтрованих запитів, інтенсивне індексування, перколяція та запити проти індексів потребують великого процесора, тому вибір правильного є критичним. Треба зрозуміти специфікації процесора та те, як вони поводяться з Java під час виконання запитів на JVM.

Кожен пул виконує ряд потоків, які можна налаштувати і має чергу. Змінювати це не рекомендується, якщо ви не маєте дуже конкретних вимог, оскільки Elasticsearch динамічно розподіляє ядра.

Типи пулу ниток:

Elasticsearch має 3 типи басейнів з нитками.

  1. Кешований: Пул кешованих потоків - це пул необмежених потоків, який породжує потік, якщо є запити, що очікують на розгляд. Цей пул потоків використовується для запобігання блокування або відхилення запитів, поданих до цього пулу. Невикористані нитки в цьому пулі потоків будуть припинені після закінчення терміну зберігання живих (за замовчуванням до п'яти хвилин). Кешований пул потоків зарезервований для загального пулу потоків.
  2. Виправлено: Пул фіксованих потоків містить фіксований розмір потоків для обробки запитів з чергою (необов'язково обмеженою) для очікуючих запитів, у яких немає потоків для їх обслуговування. Параметр size керує кількістю потоків, а за замовчуванням - числом ядер 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).

Цього можна досягти, запустивши кронштейн, який переміщує показники до різних вузлів через рівні проміжки часу.

Гарячий вузол - це тип даних, вузол даних виконує всю індексацію в кластері. Вони також містять останні індекси, оскільки вони, як правило, найчастіше запитуються. Оскільки індексація - це інтенсивна робота процесора та IO, ці сервери повинні бути потужними та підтримуватися прикріпленими SSD-накопичувачами. Ми рекомендуємо запустити як мінімум 3 «гарячих» вузла для високої доступності. Залежно від кількості останніх даних, які ви хочете зібрати та запитувати, вам, можливо, знадобиться збільшити це число для досягнення своїх цілей ефективності.

Теплий вузол - це тип вузла даних, призначений для обробки великої кількості індексів лише для читання, які не так часто запитуються. Оскільки ці індекси є лише для читання, теплий вузол, як правило, використовує великі приєднані диски (зазвичай спінінг) замість SSD. Як і у випадку з гарячим вузлом, ми рекомендуємо мінімум 3 теплих вузла для високої доступності. Як і раніше, зауважте, що більша кількість даних може зажадати додаткових вузлів для задоволення вимог щодо продуктивності. Також зауважте, що конфігурації процесора та пам'яті часто знадобляться у ваших гарячих вузлах. Це можна визначити лише шляхом тестування із запитами, схожими на те, що ви відчували б у виробничій ситуації.

Детальніше про гарячий і теплий вузол див. Тут.

Ще одна стратегія, яку ви можете адаптувати, - це архівування індексів до s3 та відновлення, коли вам потрібні дані з цих індексів. Більше про це можна прочитати тут.

Топологія вузла:

Вузли еластичного пошуку можна розділити на три категорії головний вузол, вузол даних, клієнтський вузол.

  1. Головний вузол: Головний вузол може бути малим, якщо він також не є вузлом даних, оскільки він не зберігає індексів / фрагментів. Його відповідальність полягає в зберіганні детального стану кластера та допомозі даних та інших вузлах в пошуку метаданих індексів / фрагментів. Еластичний пошук повинен мати кілька головних вузлів, щоб уникнути розбитої проблеми з мозком.
  2. Вузол даних: Вузол даних відповідає за зберігання / запит фактичних даних індексу.
  3. Клієнтський вузол: Клієнтський вузол використовується як проксі для індексації та пошуку. Це дуже рекомендується, якщо агрегації активно використовуються. Це спеціальні вузли ElasticSearch, які не мають права ні на дані, ні на майстра. Клієнтські вузли знають кластери, і тому вони можуть діяти як розумні балансири навантаження. Ви можете надсилати свої запити до клієнтських вузлів, які потім можуть взяти на себе дороге завдання збору відповідей на результати запитів з кожного з вузлів даних.

додайте ці налаштування у файл elasticsearch.yml для відповідних вузлів.

Головний вузол: node.master: вірно node.data:false
Вузол даних: node.master: помилковий node.data:true
Клієнтський вузол: node.master: помилковий node.data:false

Поради щодо усунення несправностей:

Продуктивність еластичного пошуку сильно залежить від машини, на якій він встановлений. Процесор, використання пам'яті та введення / виведення диска - основні показники операційної системи для кожного вузла Elasticsearch. Рекомендується переглянути метрику Java Virtual Machine (JVM), коли використання процесора зростає. У наступному прикладі причиною спайка була вища активність збору сміття.

  1. Тиск нагромадження: Високий тиск пам'яті працює проти продуктивності кластера двома способами: Коли тиск в пам'яті зростає до 75% і вище, менше пам'яті залишається доступним, а вашому кластеру тепер також потрібно витратити трохи ресурсів процесора, щоб відновити пам'ять за допомогою сміття. Ці цикли процесора недоступні для обробки запитів користувачів під час збору сміття. Як результат, час відповідей на запити користувачів збільшується, оскільки система стає все більш обмеженою, ніж ресурси. Якщо тиск в пам'яті продовжує зростати і сягає майже 100%, застосовується набагато більш агресивна форма збору сміття, що, в свою чергу, різко вплине на час реакції кластеру. Показник показника Response Times показує, що високий тиск у пам'яті призводить до значного впливу на продуктивність.
  2. Зростання пам’яті JVM, що не купується, з’їдання пам’яті, призначеної для кешу сторінок, і, можливо, спричиняє пожинання на рівні ядра OOM.
  3. Уникайте розбитої проблеми з мозком. Розділений мозок - це сценарій, коли кластер розпадається. Наприклад, у вас є 6 кластерних вузлів. 2 вузли відключаються від кластера, але вони все ще можуть бачити один одного. Ці 2 вузли потім створюють інший кластер. Вони навіть оберуть нового господаря між собою. Зараз у нас є два кластери з однаковою назвою, один з 4 вузлами та інший з 2 вузлами. У кожного теж є головний вузол. Це називається проблемою розділеного мозку з кластерами ES. Щоб уникнути цього, встановіть параметр ES відкриття.zen.minimum_master_nodes у половину кількості вузлів + 1.
  4. Оскільки Elasticsearch активно використовує пристрої зберігання даних, моніторинг вводу / виводу диска забезпечує виконання цієї основної потреби. Існує багато причин зменшення вводу / виводу диска, його вважають ключовим показником для прогнозування багатьох видів проблем. Це хороший показник для перевірки ефективності індексації та виконання запитів. Аналіз операцій читання та запису безпосередньо вказує на те, що системі найбільше потрібно в конкретному випадку використання. Налаштування операційної системи для вводу / виводу диска є основою для всіх інших оптимізацій, налаштування вводу-виводу диска дозволяє уникнути потенційних проблем. Якщо дискового вводу / виводу все ще недостатньо, контрзаходи, такі як оптимізація кількості осколків та їх розмірів, дроселювання злиття, заміна повільних дисків, перехід на SSD або додавання більшої кількості вузлів, слід оцінювати відповідно до обставин, що спричиняють введення-виведення вузькі місця.
  5. Для програм, які покладаються на пошук, користувацька робота дуже корелює із затримкою пошукових запитів. Є багато речей, які можуть вплинути на ефективність запиту, як-от побудовані запити, неправильно налаштований кластер Elasticsearch, JVM-пам'ять та проблеми збору сміття, диск IO тощо. Затримка запитів - це показник, який безпосередньо впливає на користувачів, тому обов’язково додайте попередження.
  6. Більшість фільтрів у програмі Elasticsearch кешовані за замовчуванням. Це означає, що під час першого виконання відфільтрованого запиту Elasticsearch знайде документи, що відповідають фільтру, та побудує структуру під назвою "біт-набір", використовуючи цю інформацію. Дані, що зберігаються в бітовому наборі, містять ідентифікатор документа і відповідність даному документу фільтру. Подальші виконання запитів, що мають один і той же фільтр, повторно використовують інформацію, що зберігається в бітовому наборі, тим самим прискорюючи виконання запитів, зберігаючи операції вводу / виводу та цикли процесора. Використання фільтра в запиті рекомендується. Детальніше дивіться тут.
  7. Час оновлення та час злиття тісно пов'язані з індексацією продуктивності, плюс вони впливають на загальну ефективність кластера. Час оновлення збільшується зі збільшенням кількості файлових операцій для індексу люцена (shard).
  8. Увімкнення повільного журналу запитів допоможе визначити, які запити повільні та що можна зробити для їх вдосконалення, особливо корисно для запитів підстановки.
  9. Збільшити розмір необмеженого розміру, щоб дозволити максимум файлів.
  10. Продуктивність ElasticSearch може постраждати, коли ОС вирішить замінити невикористану пам'ять програми. Вимкніть заміну, встановивши налаштування рівня ОС або встановіть наступне в конфігурації ElasticSearch bootstrap.mlockall: true
  11. Вимкнути видалення всіх індексів за допомогою запиту на підстановку. Щоб хтось не видав операцію DELETE для всіх індексів (* або _ всі), встановіть action.destructive_requires_name на істинне.

Перш ніж закінчити, ось список URL-адрес, корисних для перегляду показників.

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

Агрегація показників Elasticsearch підтримується більшістю інструментів моніторингу системи, такими як Datadog, TICK. Використання таких інструментів рекомендується, а створення воронки настійно рекомендується для постійного моніторингу Elasticsearch.

Висновок:

Elasticsearch - це розповсюджений повнотекстовий пошук та аналітичний механізм, який дозволяє безліччю орендарів здійснювати пошук через цілі набори даних, незалежно від розміру, з небувалою швидкістю. Окрім своїх повнотекстових можливостей пошуку, ElasticSearch виступає як аналітична система та розподілена база даних. Щоб почати, у ElasticSearch є великі налаштування за замовчуванням. Але, пройшовши початковий етап експерименту, вам доведеться витратити деякий час, щоб налаштувати налаштування під свої потреби. Рекомендується пізніше переглянути конфігурацію разом з офіційною документацією, щоб переконатися, що ваш кластер налаштований на відповідність вашим потребам.