Анализ распространенных вопросов на собеседованиях по ElasticSearch в 2019 году (часть 1)

Java

предисловие

ElasticSearch — это поисковый сервер на базе Lucene. Он предоставляет распределенную многопользовательскую полнотекстовую поисковую систему на основе веб-интерфейса RESTful. Elasticsearch, разработанный на языке Java и выпущенный с открытым исходным кодом в соответствии с условиями лицензии Apache, является популярной поисковой системой корпоративного уровня. ElasticSearch используется в облачных вычислениях для обеспечения поиска в реальном времени, стабильного, надежного, быстрого и простого в установке и использовании. Официальные клиенты доступны на Java, .NET (C#), PHP, Python, Apache Groovy, Ruby и многих других языках. Согласно рейтингу DB-Engines, Elasticsearch является самой популярной поисковой системой для предприятий, за ней следует Apache Solr, также основанный на Lucene.

Elasticsearch Вопросы на собеседовании

1. Что вы знаете о elasticsearch, расскажите об архитектуре кластера es вашей компании, размере данных индекса, количестве сегментов и некоторых методах настройки.
2. Что такое инвертированный индекс elasticsearch?
3. Что делать, если данных индекса elasticsearch слишком много, как настроить и развернуть
4. Как elasticsearch реализует главные выборы
5. Подробно опишите процесс индексации документов Elasticsearch
6. Подробно опишите процесс поиска Elasticsearch?
7. Какие существуют методы оптимизации параметров Linux при развертывании Elasticsearch?
8. Какова внутренняя структура Lucence?
9. Как Elasticsearch реализует выбор мастера?
10. Из узлов в Elasticsearch (например, всего 20) 10 выбрали одного мастера, а остальные 10 выбрали другого мастера, что делать?
11. Как клиент выбирает конкретный узел для выполнения запроса при подключении к кластеру?
12. Подробно опишите процесс индексации документов Elasticsearch.

1. Что вы знаете о elasticsearch, расскажите об архитектуре кластера es вашей компании, размере данных индекса, количестве сегментов и некоторых методах настройки.

Интервьюер: Я хочу знать сценарии и масштабы использования ES, с которыми соискатель связывался ранее, и занимался ли он относительно крупномасштабным проектированием, планированием и настройкой индекса.
Ответ: Вы можете ответить правдиво, основываясь на своих собственных практических сценариях.
Например: кластерная архитектура ES имеет 13 узлов.Индекс 20+ индексов по разным каналам.По дате ежедневный прирост 20+.внутри.
Только настройка уровня индекса означает:

1.1 Настройка на этапе проектирования

(1) В соответствии с возрастающими потребностями бизнеса создайте индекс на основе шаблона даты и сверните индекс через API переноса;
(2) Используйте псевдонимы для управления индексами;
(3) Выполняйте операцию force_merge над индексом каждое утро, чтобы освободить место;
(4) Принять механизм холодного и горячего разделения и хранить горячие данные на SSD для повышения эффективности поиска; холодные данные регулярно сжимаются для уменьшения объема хранилища;
(5) Используйте куратора для управления жизненным циклом индекса;
(6) Разумно настройте токенизатор только для тех полей, которые необходимо сегментировать;
(7) Этап сопоставления полностью объединяет атрибуты каждого поля, нужно ли его извлекать, нужно ли его сохранять и т. д. ……..

1.2, пиши тюнинг

(1) Количество копий перед записью равно 0;
(2) Перед записью закройте refresh_interval и установите для него значение -1, чтобы отключить механизм обновления;
(3) В процессе записи: используйте групповую запись;
(4) восстановить количество копий и интервал обновления после записи;
(5) Попробуйте использовать автоматически сгенерированный идентификатор.

1.3, настройка запросов

(1) Отключить подстановочный знак;
(2) Отключить пакетные условия (сотни или тысячи сценариев);
(3) В полной мере используйте механизм инвертированного индекса, и тип ключевого слова может быть как можно более ключевым;
(4) Когда объем данных велик, индекс может быть завершен на основе времени до поиска;
(5) Установите разумный механизм маршрутизации.

1.4 Другой тюнинг

Настройка развертывания, бизнес-настройка и т. д.
Что касается части, упомянутой выше, интервьюер в основном оценил вашу предыдущую практику или опыт эксплуатации и технического обслуживания.

2. Что такое инвертированный индекс elasticsearch?

Интервьюер: Я хочу знать ваши знания основных понятий.
Ответ: Достаточно простого объяснения.
Традиционно наш поиск состоит в том, чтобы просмотреть статьи одну за другой, чтобы найти позиции соответствующих ключевых слов.
Инвертированный индекс формирует таблицу взаимосвязей между словами и артиклями с помощью стратегии сегментации слов.Этот словарь + таблица сопоставления является инвертированным индексом. С инвертированным индексом статья может быть извлечена эффективно с временной сложностью o(1), что значительно повышает эффективность поиска.
Академический ответ:
Инвертированный индекс, в отличие от того, какие слова содержит статья, начинается со слова и фиксирует, в каких документах это слово встречалось, и состоит из двух частей - словаря и инвертированного списка.
Бонус: Базовая реализация инвертированного индекса основана на: Структуре данных FST (Finite State Transducer).
Структура данных, которую Lucene активно использует, начиная с версии 4+, — это FST. FST имеет два преимущества:
(1) Небольшое занимаемое пространство. За счет повторного использования префиксов и суффиксов слов в словаре пространство для хранения сжимается;
(2) Скорость запроса высокая. O(len(str)) сложность времени запроса.

3. Что делать, если данных индекса elasticsearch слишком много, как настроить и развернуть

Интервьюер: Я хочу понять возможности эксплуатации и обслуживания больших объемов данных.
Ответ: Планирование индексных данных должно быть хорошо спланировано на ранней стадии, как это называется «сначала дизайн, потом кодирование», чтобы эффективно избежать внезапного всплеска данных и влияния онлайн-поиска клиентов или других услуг, вызванных недостаточная вычислительная мощность кластера.
Как настраивать, как было сказано в вопросе 1, тут чуть подробнее:

3.1 Уровень динамического индекса

Создайте индекс на основе API-интерфейса шаблона + времени + переноса, например: определение этапа проектирования: формат шаблона индекса блога: blog_index_timestamp, и данные увеличиваются каждый день. Преимущество этого в том, что объем данных одного индекса будет не очень большим из-за всплеска объема данных, который близок к 32-й степени 2 в строке -1, а хранилище индексов достигнет ТБ+ или даже больше.
Как только один индекс становится большим, также следуют различные риски, такие как хранение, поэтому подумайте заранее + избегайте этого на ранней стадии.

3.2 Уровень хранения

Холодные и горячие данные хранятся отдельно, горячие данные (например, данные за последние 3 дня или неделю), а остальные являются холодными данными.
Для «холодных» данных, которые больше не будут записываться в новые данные, можно использовать регулярные операции принудительного слияния и сжатия, чтобы сэкономить место для хранения и повысить эффективность извлечения.

3.3 Уровень развертывания

Если заранее нет плана, это экстренная стратегия.
В сочетании с собственными характеристиками ES, поддерживающими динамическое расширение, способ динамического добавления машин может уменьшить нагрузку на кластер.Примечание: если предыдущее планирование главного узла является разумным, динамическое добавление может быть выполнено без перезапуска кластера.

4. Как elasticsearch реализует главные выборы

Интервьюер: Если вы хотите понять основные принципы кластеризации ES, вам больше не нужно сосредотачиваться только на бизнес-уровне.
отвечать:
Предпосылки:
(1) Только узлы, которые являются кандидатами в главные узлы (главный: true), могут стать главными узлами.
(2) Целью минимального количества мастер-узлов (min_master_nodes) является предотвращение разделения мозгов.
Проверьте код, основная запись — findMaster, выберите мастер-узел, чтобы успешно вернуть соответствующий мастер, в противном случае верните ноль. Процесс выборов примерно описывается следующим образом:
Шаг 1: Подтвердите, что количество мастер-узлов-кандидатов соответствует стандарту и значению, установленному в elasticsearch.yml.
discovery.zen.minimum_master_nodes;
Второй шаг: сравнение: сначала определите, имеет ли он квалификацию главного узла, и те, у кого есть квалификация главного узла-кандидата, вернутся первыми;
Если оба узла являются кандидатами в первичные узлы, меньший идентификатор будет основным узлом. Обратите внимание, что идентификатор здесь имеет строковый тип.
Не по теме: способ получить id узла.
1GET /_cat/nodes?v&h=ip,port,heapPercent,heapMax,id,name

2ip port heapPercent heapMax id name

5. Подробно опишите процесс индексации документов Elasticsearch

Интервьюер: Если вы хотите понять основные принципы ES, вы больше не сосредотачиваетесь только на бизнес-уровне.
отвечать:
Под индексным документом здесь следует понимать процесс записи документа в ES и создания индекса.
Написание документов включает в себя: написание одного документа и массовое написание большого количества документов, только чтобы объяснить здесь: процесс написания одного документа.
Помните эту схему из официальной документации.
Шаг 1: Клиент записывает данные на узел в кластере и отправляет запрос. (Если узел маршрутизации/координатора не указан, запрашивающий узел действует как узел маршрутизации.)
Шаг 2: После того, как узел 1 получает запрос, он использует document_id, чтобы определить, что документ принадлежит осколку 0. Запрос будет перенаправлен на другой узел, скажем, на узел 3. Таким образом, основной сегмент для сегмента 0 назначается узлу 3.
Шаг 3: Узел 3 выполняет операцию записи на первичном сегменте и в случае успеха пересылает запрос на сегменты реплики узла 1 и узла 2 параллельно и ожидает возврата результата. Все сегменты реплики сообщают об успехе, узел 3 сообщает об успехе координирующему узлу (узел 1), а узел 1 сообщает об успехе записи запрашивающему клиенту.
Если интервьюер еще раз спросит: процесс получения осколков документов на втором этапе?
Ответ: получен с помощью алгоритма маршрутизации, который представляет собой процесс вычисления идентификатора сегмента цели на основе идентификатора маршрута и документа.
1shard = hash(_routing) % (num_of_primary_shards)

6. Подробно опишите процесс поиска Elasticsearch?

Интервьюер: Я хочу понять основные принципы поиска ES, а не просто фокусироваться на бизнес-уровне.
отвечать:
Поиск разбит на две фазы: «запрос, затем выборка».
Цель этапа запроса: найти позицию, а не получить ее.
Ступени разбираются следующим образом:
(1) Если предположить, что данные индекса имеют 5 мастеров + 1 реплику и всего 10 сегментов, запрос попадет в один из (мастер-сегментов или реплик).
(2) Каждый сегмент запрашивается локально, и результаты возвращаются в локальную очередь с упорядоченным приоритетом.
(3) Результат шага 2) отправляется на координирующий узел, и координирующий узел генерирует глобальный отсортированный список.
Цель фазы выборки: получить данные.
Узел маршрутизации получает все документы и возвращает их клиенту.

7. Какие существуют методы оптимизации параметров Linux при развертывании Elasticsearch?

Интервьюер: Я хочу узнать о возможностях эксплуатации и обслуживания кластеров ES.
отвечать:
(1) Закрыть подкачку кеша;
(2) Память кучи устанавливается на: Мин. (память узла/2, 32 ГБ);
(3) Установите максимальное количество дескрипторов файлов;
(4) Пул потоков + размер очереди настраиваются в соответствии с потребностями бизнеса;
(5) Режим RAID для дискового хранилища — RAID10 используется для условий хранения, чтобы повысить производительность одного узла и избежать сбоев хранилища одного узла.

8. Какова внутренняя структура Lucence?

Интервьюер: Я хочу знать широту и глубину ваших знаний.
отвечать:
Lucene имеет два процесса индексирования и поиска, включая создание индекса, индексирование и поиск. Его можно расширить на основе этого контекста.

9. Как Elasticsearch реализует выбор мастера?

(1) За выбор Elasticsearch отвечает модуль ZenDiscovery, который в основном включает Ping (узлы обнаруживают друг друга через этот RPC) и Unicast (модуль одноадресной рассылки содержит список хостов для управления тем, какие узлы необходимо пинговать) две части;
(2) Сортировать все узлы, которые могут стать мастерами (node.master: true) в соответствии со словарем nodeId, каждый раз, когда каждый узел выбирается, он сортирует известные ему узлы, а затем выбирает первый (0-й) узел, пока считайте его главным узлом.
(3) Если количество голосов за узел достигает определенного значения (количество главных узлов, которое может быть n/2+1) и узел сам выбирает себя, то этот узел является ведущим. В противном случае переизбрание производится до выполнения вышеуказанных условий.
(4) Дополнение: В обязанности главного узла в основном входит управление кластерами, узлами и индексами, и он не отвечает за управление на уровне документов; узел данных может отключить функцию http*.

10. Узлы в Elasticsearch (например, всего 20), из них 10

Выбран один мастер, и выбрано еще 10 мастеров, что делать?
(1) Когда количество кандидатов в мастера кластера не менее 3, проблема разделения мозга может быть решена путем установки минимального количества переданных голосов (discovery.zen.minimum_master_nodes) более чем половине всех узлов-кандидатов;
(3) Когда количество кандидатов равно двум, можно изменить только одного главного кандидата, а остальные используются в качестве узлов данных, чтобы избежать проблемы разделения мозга.

11. Как клиент выбирает конкретный узел для выполнения запроса при подключении к кластеру?

TransportClient использует транспортный модуль для удаленного подключения к кластеру elasticsearch. Он не присоединяется к кластеру, а просто получает один или несколько начальных транспортных адресов и взаимодействует с этими адресами в режиме опроса.

12. Подробно опишите процесс индексации документов Elasticsearch.

Узлы-координаторы по умолчанию участвуют в вычислениях, используя идентификаторы документов (через маршрутизацию также поддерживается), чтобы предоставить соответствующие сегменты для маршрутизации.
shard = hash(document_id) % (num_of_primary_shards)
(1) Когда узел, на котором находится сегмент, получает запрос от координирующего узла, он записывает запрос в MemoryBuffer, а затем регулярно записывает его в кэш файловой системы (по умолчанию каждую секунду). Кэш файловой системы выглядит следующим образом: называется Refresh;
(2) Конечно, в некоторых случаях данные в буфере Momery и кэше файловой системы могут быть потеряны.ES использует механизм транслогирования для обеспечения надежности данных. Механизм реализации заключается в том, что после получения запроса он также будет записан в транслог.При записи данных в кэш ФС на диск происходит его очистка.Этот процесс называется сбросом;
(3) Во время процесса сброса буфер в памяти будет очищен, содержимое будет записано в новый сегмент, fsync сегмента создаст новую точку фиксации, а содержимое будет сброшено на диск, старый транслог будет удален и начнется новый транслог.
(4) Время триггера сброса - это триггер времени (по умолчанию 30 минут) или когда транслог становится слишком большим (по умолчанию 512M);

Добавлено: Сегмент на Lucene:
(1) Индекс Lucene состоит из нескольких сегментов, а сам сегмент представляет собой полностью функциональный инвертированный индекс.
(2) Сегменты неизменяемы, что позволяет Lucene постепенно добавлять новые документы в индекс, не перестраивая индекс с нуля.
(3) Для каждого поискового запроса выполняется поиск во всех сегментах индекса, и каждый сегмент потребляет тактовые циклы ЦП, дескрипторы файлов и память. Это означает, что чем больше количество сегментов, тем ниже будет эффективность поиска.
(4) Чтобы решить эту проблему, Elasticsearch объединит небольшие сегменты в более крупный сегмент, зафиксирует новый объединенный сегмент на диск и удалит эти старые небольшие сегменты.

Наконец

Приглашаю всех обратить внимание на мой публичный аккаунт [Программист в погоне за ветром].В 2019 году многие компании собрали более 1000 400-страничных pdf-документов для вопросов на собеседовании по Java.

Если вам понравилась статья, не забудьте подписаться на меня и поставить лайк, спасибо за вашу поддержку!