Осколки та репліки в Elasticsearch


303

Я намагаюся зрозуміти, що таке фрагмент та репліка в Elasticsearch, але мені не вдалося зрозуміти це. Якщо я завантажую Elasticsearch і запускаю скрипт, то з того, що я знаю, я запустив кластер з одним вузлом. Зараз у цьому вузлі (мій ПК) є 5 фрагментів (?) Та кілька реплік (?).

Що вони, у мене є 5 дублів покажчика? Якщо так, чому? Мені може знадобитися пояснення.


1
Подивіться тут: stackoverflow.com/questions/12409438 / ...
javanna

Але все ж питання залишається без відповіді.
LuckyLuke

Я вважав, що відповідь, яку ви отримали, і відповідна відповідь вище повинні пояснити речі. Що тоді незрозуміло?
javanna

Я не розумію, що таке осколок і репліки. Я не розумію, чому на одному вузлі є багато фрагментів і реплік.
LuckyLuke

1
Кожен індекс можна розділити на осколки, щоб можна було поширювати дані. Осколок - це атомна частина індексу, яка може бути розподілена по кластері, якщо додати більше вузлів.
javanna

Відповіді:


965

Я спробую пояснити справжнім прикладом, оскільки відповіді та відповіді, які ви отримали, не допомагають вам.

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

Коли ви створюєте індекс (індекс автоматично створюється і при індексації першого документа), ви можете визначити, з яких частинок буде складено. Якщо ви не вкажете номер, у нього буде за замовчуванням кількість фрагментів: 5 праймерів. Що це означає?

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

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Кожен раз, коли ви індексуєте документ, еластичний пошук вирішить, який основний фрагмент повинен містити цей документ, і індексуватиме його там. Первинні осколки не є копією даних, це дані! Наявність декількох черепок допомагає скористатися паралельною обробкою на одній машині, але вся справа в тому, що якщо ми запустимо інший еластичний екземпляр на тому самому кластері, осколки будуть розподілятися рівномірно по кластеру.

Тоді вузол 1 вмістить, наприклад, лише три черепки:

 ____    ____    ____ 
| 1  |  | 2  |  | 3  |
|____|  |____|  |____|

Оскільки решту двох черепків переміщено до нещодавно запущеного вузла:

 ____    ____
| 4  |  | 5  |
|____|  |____|

Чому це відбувається? Оскільки elastsesearch - це розподілена пошукова система, і таким чином ви можете використовувати декілька вузлів / машин для управління великими обсягами даних.

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

Ще один тип осколка - це репліка. За замовчуванням - 1, що означає, що кожен основний фрагмент буде скопійований в інший фрагмент, який буде містити ті самі дані. Репліки використовуються для підвищення продуктивності пошуку та для відмови. Штрих реплік ніколи не буде виділятися на тому самому вузлі, де є пов'язаний первинний (це було б майже як розміщення резервної копії на той же диск, що і вихідні дані).

Повернувшись до нашого прикладу, з 1 реплікою у нас буде весь індекс на кожному вузлі, оскільки по першому вузлу буде виділено 2 реплік-фрагменти, і вони будуть містити точно такі ж дані, як і первинні черепки на другому вузлі:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4R |  | 5R |
|____|  |____|  |____|  |____|  |____|

Те ж саме для другого вузла, який буде містити копію первинних фрагментів на першому вузлі:

 ____    ____    ____    ____    ____
| 1R |  | 2R |  | 3R |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

При такому налаштуванні, якщо вузол опускається, у вас ще є весь індекс. Осколки репліку автоматично стануть праймерізмом, і кластер буде працювати належним чином, незважаючи на вихід з ладу вузла, як це:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Оскільки у вас є "number_of_replicas":1, репліки більше не можна призначати, оскільки вони ніколи не виділяються на тому ж вузлі, де є їх основним. Ось чому у вас буде 5 непризначених фрагментів, репліки та статус кластера YELLOWзамість GREEN. Без втрати даних, але це може бути краще, оскільки деякі фрагменти не можуть бути призначені.

Як тільки вузол, що залишився, буде створено резервну копію, він знову приєднається до кластеру, і репліки будуть призначені знову. Існуючий фрагмент на другому вузлі може бути завантажений, але їх потрібно синхронізувати з іншими фрагментами, оскільки операції запису, швидше за все, відбувалися під час роботи вузла. Після закінчення цієї операції стане статусом кластера GREEN.

Сподіваюсь, це пояснить вам речі.


57
Дивовижне пояснення, дякую, що знайшли ваш час, щоб зібрати його! :)
LuckyLuke

6
Це, безумовно, найкраще пояснення концепції "осколок / репліка". Велике спасибі :)
Френк Фостер

1
@javanna Чудове пояснення, чи можна поговорити про багато кластерів та про те, як вони працюють?
raffian

3
Чи можу я запропонувати пояснити далі, що буде, коли вузол, який зійшов, знову повернеться вгору?
c0dem4gnetic

1
Ви вчите? Тому що ви цілком повинні. Ти рок. Але як запитав @Animesh Pandey, мені також цікаво дізнатися, що відбувається з двома репліками або 1 реплікою з 3 вузлами.
frostymarvelous

24

Індекс розбивається на осколки з метою їх розподілу та масштабу.

Репліки - це копії фрагментів і забезпечують надійність у разі втрати вузла. У цій кількості часто виникає плутанина, оскільки кількість реплік == 1 означає, що кластер повинен мати головну та копіювану копію фрагмента, щоб бути у зеленому стані.

Для того, щоб створити репліки, ви повинні мати принаймні 2 вузли у своєму кластері.

Ви можете знайти тут визначення, простіші для розуміння: http://www.elasticsearch.org/guide/reference/glossary/

З повагою, Пол


Про це говорить кожен документ - індекс розбивається на осколки, але що індекс насправді містить?
Олексій Прійомка

@AlexPryiomka, Index містить дані
Gaurav

Так це в основному те саме, що поділ-реплікація у світі кафки?
beatrice

19

Якщо ви дійсно не любите бачити його жовтим. ви можете встановити кількість реплік до нуля:

curl -XPUT 'localhost:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}
'

Зауважте, що ви повинні робити це лише у вікні локальної розробки.


10

Осколок:

  1. Розподілений пошуковий сервер, ElasticSearchвикористовує концепцію під назвою Shard розподіляти покажчикові документи по всіх вузлах.
  2. An indexПотенційно може зберігати велику кількість даних , які можуть перевищити апаратні межіsingle node
  3. Наприклад, один індекс мільярда документів, що займає 1 ТБ дискового простору, може не поміститися на диску одного вузла або може бути занадто повільним, щоб обслуговувати запити пошуку лише з одного вузла.
  4. Щоб вирішити цю проблему, Elasticsearchпередбачена можливість підрозділити свій індекс на кілька назв shards.
  5. Створюючи індекс, ви можете просто визначити номер, shards який потрібно.
  6. Documentsзберігаються в shards, а фрагменти виділяються nodesу вашомуcluster
  7. У міру clusterзростання або скорочення, Elasticsearchавтоматично мігруватимуть осколки між ними, nodesщоб clusterзалишки врівноважувалися.
  8. Осколок може бути або a, primary shardабо a replica shard.
  9. Кожен документ у вашому індексі належить до single primary shard, тому кількість наявних у вас первинних фрагментів визначає максимальний обсяг даних, який може містити ваш індекс
  10. A replica shard- це лише копія первинного фрагмента.

Репліка:

  1. Replica shard є копією primary Shard , щоб запобігти втраті даних у разі відмови обладнання.
  2. Elasticsearchдозволяє зробити одну або кілька копій осколків вашого індексу в тих, що називаються фрагментами реплік, або replicasкоротко.
  3. А indexтакож можна повторити нуль (маючи на увазі відсутність реплік) або більше разів.
  4. number of shardsІ репліки можуть бути визначені для кожного індексу в момент створюється індекс.
  5. Після створення індексу ви можете будь-коли динамічно змінювати кількість реплік, крім вас cannot change the number of shards після факту.
  6. За замовчуванням кожному індексу в Elasticsearchвиділяється 5 первинних осколків, а 1 replicaце означає, що якщо у вашому кластері принаймні два вузли, ваш індекс матиме 5 первинних фрагментів та ще 5 реплік-фрагментів (1 повна репліка) загалом 10 штук на кожну покажчик.

6

Індекс розбивається на осколки з метою їх розподілу та масштабу.

Репліки - копії осколків.

Вузол - це запущений примірник еластичного пошуку, який належить до кластеру.

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


У мене є три AWS ec2екземпляри, у кожному з яких встановлено еластичний пошук. Значить, у нас тут три вузли? Якщо всі ці вузли мають однаковий cluster.name: testнабір властивостей, чи зробить це ім'я кластера, testяке має три вузли?
TheCoder

5

Я поясню це, використовуючи реальні сценарії слів. Уявіть, що ви керуєте веб-сайтом електронної комерції. Коли ви стаєте популярнішими, на ваш веб-сайт додаються більше продавців та товарів. Ви зрозумієте, що кількість продуктів, які можуть знадобитися для індексації, зросла, і вона занадто велика, щоб вміститися на одному жорсткому диску одного вузла. Навіть якщо він вписується на жорсткий диск, виконання лінійного пошуку всіх документів на одній машині є надзвичайно повільним. один індекс на одному вузлі не скористається конфігурацією розподіленого кластера, на якій працює еластичний пошук.

Так еластичний пошук розбиває документи в індексі на декілька вузлів кластера. Кожен розріз документа називається осколком. Кожен вузол, що містить фрагмент документа, матиме лише підмножину документа. припустимо, у вас 100 продуктів і 5 осколків, кожен шматок матиме 20 продуктів. Таке уточнення даних робить можливим пошук з низькою затримкою в еластичному дослідженні. пошук проводиться паралельно по декількох вузлах. Результати агрегуються та повертаються. Однак осколки не забезпечують відмовостійкості. Це означає, що будь-який вузол, що містить осколок, знижується, стан кластера стає жовтим. Значить, деякі дані недоступні.

Для підвищення відмовостійкості відображаються репліки. Шляхом глубокого еластичного пошуку створюється по одній копії кожного осколка. Ці репліки завжди створюються на іншому вузлі, де первинний фрагмент не проживає. Отже, щоб зробити систему невідповідною, можливо, вам доведеться збільшити кількість вузлів у вашому кластері, і це також залежить від кількості фрагментів вашого індексу. Загальна формула для обчислення кількості вузлів, необхідних на основі реплік та осколків, - "кількість вузлів = кількість черепків * (кількість реплік + 1)". Стандартна практика полягає у тому, щоб мати принаймні одну копію для відмовостійкості.

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

ви можете встановити кількість фрагментів та реплік для свого індексу за допомогою команди нижче.

curl -XPUT 'localhost:9200/sampleindex?pretty' -H 'Content-Type: application/json' -d '
{
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":1
  }
}'

3

Не відповідь, а інша посилання на основні поняття на ElasticSearch, і я думаю, що вони досить чіткі як комплімент для відповіді @ javanna.

Осколки

Індекс потенційно може зберігати велику кількість даних, що може перевищувати апаратні межі одного вузла. Наприклад, один індекс мільярда документів, що займає 1 ТБ дискового простору, може не поміститися на диску одного вузла або може бути занадто повільним, щоб обслуговувати запити пошуку лише з одного вузла.

Щоб вирішити цю проблему, Elasticsearch надає можливість підрозділити свій індекс на кілька фрагментів, званих черепками. Створюючи індекс, ви можете просто визначити потрібну кількість клаптиків. Кожен фрагмент сам по собі є повністю функціональним і незалежним "індексом", який можна розмістити на будь-якому вузлі кластера.

Шардінг важливий з двох основних причин:

  • Це дозволяє горизонтально розділити / масштабувати обсяг вмісту.
  • Це дозволяє розподіляти та паралельно виконувати операції між черепками (можливо, на кількох вузлах), тим самим збільшуючи продуктивність / пропускну здатність .

Репліки

У мережевому / хмарному середовищі, де можна очікувати збоїв у будь-який час, дуже корисно і дуже рекомендується мати механізм відмови, якщо осколок / вузол якимось чином відключиться або зникне з будь-якої причини. З цією метою Elasticsearch дозволяє зробити одну або декілька копій фрагментів індексу в тому, що називається копією реплік або короткими репліками.

Реплікація важлива з двох основних причин:

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

1

У програмі ElasticSearch на верхньому рівні індексуємо документи в індекси. Кожен індекс має кількість фрагментів, які внутрішньо поширюють дані, а всередині фрагментів є люценові сегменти, які є основним сховищем даних. Отже, якщо в індексі є 5 фрагментів, це означає, що дані були розподілені по черепах, і не однакові дані існують в черепах.

Слідкуйте за відео, яке пояснює ядро ​​ES https://www.youtube.com/watch?v=PpX7J-G2PEo

Стаття про кілька індексів або декількох фрагментів Еластичний пошук, кілька індексів проти одного індексу та типи для різних наборів даних?


1

Elasticsearch чудово масштабується, тому що всі кредити надходять на його розподілену архітектуру. Це стає можливим завдяки Шардингу. Тепер, перш ніж просуватися далі, розглянемо простий і дуже поширений випадок використання. Припустимо, у вас є індекс, який містить пекло багато документів, і для простоти вважайте, що розмір цього індексу дорівнює 1 ТБ (тобто сума розмірів кожного документа в цьому індексі становить 1 ТБ ). Крім того, припустимо, що у вас є два вузли на кожному з 512 ГБ простору для зберігання даних. Як добре видно, весь наш індекс не може зберігатися в жодному з двох доступних вузлів, і тому нам потрібно розподілити наш індекс серед цих Вузлів.

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


0

Найпростіше кажучи, shardце не що інше, як частина індексу, що зберігається на диску в окремій папці:

Еластичні дослідницькі черепки

Цей знімок екрана показує весь каталог Elasticsearch.

Як бачите, всі дані надходять у dataкаталог.

Перевіряючи індекс, C-mAfLltQzuas72iMiIXNwми бачимо, що він має п'ять фрагментів ( 0до папок 4).

З іншого боку, JH_A8PgCRj-GK0GeQ0limwіндекс має лише один фрагмент ( 0папку).

Еластичні дослідницькі черепки

priРозглядає загальна кількість черепків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.