«Programming Life» привела к тому, что программиста чуть не уволили из-за аварии P0.

Java Elasticsearch
«Programming Life» привела к тому, что программиста чуть не уволили из-за аварии P0.

Чем больше вы знаете, тем больше вы не знаете


Ставьте лайки и смотрите снова, формируйте привычку


GitHub github.com/JavaFamilyКарта мозгов точки интервью, личная контактная информация и группа технического обмена с крупными заводами первой линии были включены на веб-сайт.Добро пожаловать в Star и ваши советы.

предисловие

Это реальный инцидент с Шуай Бин. Всем известно, что многие компании имеют уровень неисправности. Это ошибка P0, которую Ао Бин нес в компании.уволенный, что случилосьочень волнующий,мойСердечный приступ чуть не вернулся.

Уровень аварии в основном относится к производственной среде, а основа деления аналогична уровню ошибки.


P0 относится к аварии самого высокого уровня, такой как сбой, страница недоступна, основной процесс заблокирован, основная функция не реализована или влияние очень велико (даже если сама ошибка несерьезна).


Аварии P1 - это аварии высокого уровня, обычно относящиеся к ветви основной функции, процессу ответвления, основной подфункции и т. д., за которыми следуют P2, P3 и т. д., которые в основном делятся в соответствии с фактической ситуацией на предприятии.

текст

Ранее Ао Бинг также отвечал за поиск товаров в компании, поскольку объем бизнеса рос слишком быстро, данные о товарах в таблице товаров быстро подскочили до уровня десятков миллионов, а RT (время ответа) запроса было также становится все выше и выше. , и продукт говорит, что это должно бытьДополнительные параметры для запроса продуктов.

Потому что раньше мы все искали по названию продукта, но на самом деле в электронной коммерции поиск продуктов производился по многим параметрам.

Например, при поиске на Taobao вы обнаружите, что этот продукт можно найти в нескольких измерениях, таких как название продукта, цвет, этикетка и т. д., например, поиск на рисунке ниже, я только что искал [Шуай Бинг】 Вы обнаружите, что в имени нет двух последовательных символов, красивый и C. Есть красивый и C.

Все мы знаем, что традиционные реляционные базы данных запрашиваются по имени, например % beautiful C.

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

При выборе технологий Шуай Бинг впервые подумал о поисковых системах.

Самыми популярными на рынке в то время были:Apache Lucene,Elasticsearch,Solr

Поисковая система, о которой я расскажу позжеELK (Elasticsearch, Logstash, Кибана)иCanal, я действительно слишком балую тебя, это тебя испортит?

Красавчик Си, я взломал операцию и в итоге пришел к выводу:

Условно говоря, если рассматривать статический поиск, Sorl является относительно более подходящим.


Если вы рассматриваете работу в режиме реального времени и распределённость, Elasticsearch подходит относительно.

Тогда наши продукты все еще должны быть в режиме реального времени.Если вы меняете цену в фоновом режиме, вы должны синхронизировать ее в реальном времени, иначе она взорвется.

Увидев это, я подумалмилый тыУ Хэ Шуай Цина в сердце есть ответ: Elasticsearch — это богоподобный движок.

Я просто дам здесь краткое введение. За подробностями мы перейдем к его главе позже. Все написано. Откуда у Ао Бина столько материала для написания статей?

ElasticSearch — это поисковый сервер на базе Lucene.


Он предоставляет распределенную многопользовательскую полнотекстовую поисковую систему на основе веб-интерфейса RESTful.


Elasticsearch, разработанный на языке Java и выпущенный с открытым исходным кодом в соответствии с условиями лицензии Apache, является популярной поисковой системой корпоративного уровня.


ElasticSearch используется в облачных вычислениях для обеспечения поиска в реальном времени, стабильного, надежного, быстрого и простого в установке и использовании. Официальные клиенты доступны на Java, .NET (C#), PHP, Python, Apache Groovy, Ruby и многих других языках.


Согласно рейтингу DB-Engines, Elasticsearch является самой популярной поисковой системой для предприятий, за ней следует Apache Solr, также основанный на Lucene.

Друзья, читавшие предыдущие статьи Ао Бинга, знают, что нужно делать, прежде чем мы займемся техническим отбором.дизайн!

Мы собираемся узнать об этом материалевыгода,вред,общая яма,аварийный план для решения проблемподожди, вот егоМеханизм синхронизации данныхКакие,Каков механизм сохранения?Да, это высокая доступность?

Точно так же я не буду подробно представлять его, я напишу его в будущем, я покажу вам проекты, которые я сделал в то время.

Это только начальная демка, я не буду показывать вам подробный окончательный вариант, потому что в компании много внутренней логики.

Тем не менее, вы все еще можете видеть, что Ао Бин действительно много думал об этом.

Придумай и сделай Ао БинКакакаиспользуется.

если быть честным,действительно ладан, Эта вещь действительно проста в использовании, а стоимость обучения также очень низкая.Выражение запроса можно освоить за считанные минуты, а документ на официальном веб-сайте очень четко представляет функцию.

https://www.elastic.co/cn/

А вот и кульминация игры. Вы все знаете, что мы с Ао Бингом занимаемся электронной коммерцией. Какой высокий трафик поступает, или событие запускается как обычно.

Это был месяц с сильным ветром, дул прохладный ветерок, Ао Бин неторопливо сидел на стуле, держа в руке ветхую чашку, пил чай Куцзин, приготовленный его бабушкой, и наслаждался этим приятным временем.

Внезапно было слишком поздно и слишком рано.Эксплуатация и техническое обслуживание вызвали экстренный вызов.ЦП кластера ES достиг 99% и был на грани зависания.Мое сердце внезапно болит, я до сих пор рад, что кластер не развалился.

Затем он сказал, что нехорошо, что кластер зависает!

Ао Бинцзу, эта статья окончена....

Шучу, но Ао Бин действительно былМне действительно нужно иметь сердце, чтобы умереть, в течение 1 минуты после сбоя некоторые пользователи сообщили, что поиск не отвечает.Первое, о чем я подумал, это перезагрузить, поэтому я выбежал, включил компьютер, вошел в машину и ввел команду перезагрузки.

Ладно, да ладно, к счастью, промаха не было, но всего через 10 секунд скопление снова 99%, и что?

Могу только перезапустить снова.В этот раз не зависла.Спустя долгое-долгое время я так и не зависла до конца мероприятия.

Найти проблемы

Но в этот раз это коснулось онлайна, и 3-минутный поиск не дал ответа.Думаю, завтра пойду в финансовый отдел получать зарплату и пораньше домой на Новый год.

К счастью, лидер сказал, что все в порядке, сначала найдите проблему и устраните ее.

Вы все знаете что Ао Бин гений.Первой мыслью было посмотреть логи.Зашел в es не увидел ошибки,потом посмотрел на родной сервис.Ничего кроме ошибки таймаута.Гуд.

Но я продолжал задаваться вопросом, почему мои поиски не увенчались успехом,Может быть, кто-то искал что-то странное?

Я открыл журнал поиска! ! !

Черт возьми, не правда ли, какой дурак искать такую ​​длинную строку китайского языка, около 250 слов.

Но если подумать, я не должен останавливать службу после стольких поисков.Может быть, я написал ошибку!

На моей щеке выступила капля пота 💦, я огляделась и обнаружила, что никто не заметил моей нервозности, япритвориться спокойнымчтобы стереть его.

Я хорошенько обдумываю, хотя чужие запросы длинные, даже если проверяют базу, то нормально.Почему es сообщает об ошибке? Будет ли он?

У Es есть ошибки! Да, это должен быть горшок Эс.

Тогда почему это происходит, я не могу объяснить это непосредственно начальству.Все равно уволят!

Поэтому я пошел и посмотрел на код. Я использовал подстановочные знаки в ключевых словах. Я сделал это, чтобы соответствовать большему содержанию. Подобно базе данных, подстановочные знаки Es: * красивый c * вот такДобавьте «*» до и после ключевых слов для запроса.

Позже я узнал, что это подстановочный банк, затемКонан СПросто скажите мне, почему возникает эта проблема.

Многие разработчики с опытом работы в СУБД/SQL, когда они впервые вошли в мир ElasticSearch, легко подумали об использовании подстановочных знаков (запроса с подстановочными знаками) для реализации нечетких запросов (таких как завершение пользовательского ввода), потому что это операция, наиболее похожая на аналогичную операцию в SQL Подобные методы запросов очень удобны в использовании.

Однако вина Шуай Бин была раскрыта,Неправильное использование запроса с подстановочными знаками может иметь катастрофические последствия.

Я первый воспроизвел проблему

Воспроизвести метод

  1. Создайте индекс только с одним документом

POST test_index/type1/?refresh=true

{

"foo": "bar"

}

2. Используйте запрос с подстановочными знаками для выполнения длинного строкового запроса с подстановочными знаками * в начале и в конце.

POST /test_index/_search

{

"query": {

"wildcard": {

"foo": {

​ «value»: «Я ушел нежно, как нежно пришел; Я нежно махнул рукой, чтобы попрощаться с облаками в западном небе. Золотые ивы на реке — невесты на закате; Мое сердце рябит. Зеленые нимфы на тине качаются под водой, В ласковых волнах реки Кан Я готов быть водным растением! Тот бассейн под тенью вяза - не чистый родник, а радуга в небе ; Среди плавающих водорослей есть радужный сон. Ищу сон? Поддержи длинный шест и блуждай к более зеленой траве; Лодка, полная звезд, поет в разноцветных звездах. Но я не могу петь, тихо прощание Шэнсяо; Ся Цзун тоже молчит для меня, тишина сегодня Кембридж! Тихо я ушел, так же тихо пришел; я махнул рукавом, не унося ни облачка».

   }

  }

 }

}

  1. Посмотреть Результаты

{

"took": 3445,

"timed_out": false,

"_shards": {

"total": 5,

"successful": 5,

"failed": 0

},

"hits": {

"total": 0,

"max_score": null,

"hits":

 }

}

даже без хитов, затраченное время составляет поразительные 3,4 секунды (тестовая машина — macbook pro, процессор i7), а во время выполнения процессор имеет очень высокий всплеск.

Онлайн-запросы намного сложнее, чем мой пример, будет проверяться несколько полей одновременно, при реальном тестировании запрос может выполняться более десяти секунд.

При наличии более длинных строковых запросов кластер может быть DOS.

Исследуйте глубинные причины

Почему эти накладные расходы на запрос так высоки для индекса только с одними данными? Интуитивно результат должен возвращаться моментально!

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

Caused by: org.apache.lucene.util.automaton.TooComplexToDeterminizeException: Determinizing automaton with 22082 states and 34182 transitions would result in more than 10000 states. at org.apache.lucene.util.automaton.Operations.determinize(Operations.java:741) ~[lucene-core-6.4.1.jar:6.4.1

Объяснение: Исключение исходит из пакета org.apache.lucene.util.automaton, и буквальное значение причины исключения: "Автомат слишком сложен для определения состояния: при слишком большом количестве состояний и переходов необходимо сгенерировать более 10 000 верхних границ, чтобы определить автомат."

Конан СПосле поиска большого количества информации в Интернете я, наконец, разобрался во всех тонкостях проблемы.

Чтобы ускорить сопоставление подстановочных знаков и регулярных выражений, Lucene 4.0 начинает создавать DFA (детерминированный конечный автомат) из шаблона входной строки.DFA, созданный с помощью шаблона с подстановочными знаками, может быть очень сложным.дорогой.

Например, DFA, построенный с помощью a*bc, выглядит следующим образом:

Внедрение Lucene Constructing DFA

После прочтения кода, относящегося к Lucene, процесс построения выглядит примерно так:

  1. Метод toAutomaton в org.apache.lucene.search.WildcardQuery проходит по входному шаблону подстановочных знаков, превращает каждый символ в автомат, а затем связывает автомат каждого символа для создания нового автомата.
public static Automaton toAutomaton(Term wildcardquery) {
        List<Automaton> automata = new ArrayList<>();
        String wildcardText = wildcardquery.text();
        for (int i = 0; i < wildcardText.length();) {
            final int c = wildcardText.codePointAt(i);
            int length = Character.charCount(c);
            switch(c) {
                case WILDCARD_STRING:
                    automata.add(Automata.makeAnyString());
                    break;
                case WILDCARD_CHAR:
                    automata.add(Automata.makeAnyChar());
                    break;
                case WILDCARD_ESCAPE:
                    // add the next codepoint instead, if it exists
                    if (i + length < wildcardText.length()) {
                        final int nextChar = wildcardText.codePointAt(i + length);
                        length += Character.charCount(nextChar);
                        automata.add(Automata.makeChar(nextChar));
                        break;
                    } // else fallthru, lenient parsing with a trailing \
                default:
                    automata.add(Automata.makeChar(c));
            }
            i += length;
        }
        return Operations.concatenate(automata);
    }
  1. Конечный автомат, сгенерированный в это время, является неопределенным конечным автоматом, то есть недетерминированным конечным автоматом (NFA).

  2. Метод определения в классе org.apache.lucene.util.automaton.Operations преобразует NFA в DFA.

/**
  \* Determinizes the given automaton.
  \* <p>
  \* Worst case complexity: exponential in number of states.
  \* @param maxDeterminizedStates Maximum number of states created when
  \*  determinizing. Higher numbers allow this operation to consume more
  \*  memory but allow more complex automatons. Use
  \*  DEFAULT_MAX_DETERMINIZED_STATES as a decent default if you don't know
  \*  how many to allow.
  \* @throws TooComplexToDeterminizeException if determinizing a creates an
  \*  automaton with more than maxDeterminizedStates
  */

В комментариях к коду говорится, что в худшем случае временная сложность этого процесса экспоненциальна по количеству состояний!

Чтобы предотвратить слишком много состояний и потреблять слишком много памяти и ЦП, максимальное количество состояний в классе ограничено.

 /**
  * Default maximum number of states that {@link Operations#determinize} should create.
  */
 public static final int DEFAULT_MAX_DETERMINIZED_STATES = 10000;

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

Что касается разницы между NFA и DFA? Как конвертировать друг друга?

В Интернете есть много материалов и статей математического уровня, которые ограничиваются ограниченным знанием алгоритма Шуай-Цин и не имеют сил для его глубокого изучения.

Но поверхностное понимание таково: NFA может переходить из одного состояния в несколько состояний при вводе условия, в то время как DFA имеет только одно определенное состояние для перехода, поэтому DFA быстрее сопоставляет строки.

Хотя DFA быстр в поиске, временная сложность построения может быть относительно высокой, особенно когда у него есть первый подстановочный знак + длинная строка.

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

" Note that this query can be slow, as it needs to iterate over many terms. In order to prevent extremely slow wildcard queries, a wildcard term should not start with one of the wildcards * or ?."

В сочетании с изучением базовой реализации запроса с подстановочными знаками, приведенного выше, нетрудно понять смысл этого предложения!

Резюме: Запрос с подстановочными знаками должен исключать использование подстановочных знаков в начале.Если вам нужно это сделать, вы должны ограничить длину строки, вводимой пользователем.

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

Для некоторых сценариев приложений, где ввод является подсказкой, вы можете предпочесть использовать подсказку завершения, подсказку фразы/термина и другие методы с большей производительностью и немного худшей двусмысленностью. , Плохие подстановочные знаки, регулярные выражения, нечеткие запросы.

Пополнить: Некоторые студенты спрашивали, имеют ли регулярное выражение и нечеткий запрос одинаковую проблему, и ответ положительный, потому что нижний слой совпадает с подстановочным знаком, который ускоряет сопоставление строк за счет создания шаблона в DFA.

отзывать: Почему один раз завис перед перезагрузкой и возобновлением, а потом снова завис? Пользователь выполнил поиск дважды. . .

решение

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

Я скопировал очень длинный китайский иероглиф в Baidu и вот результат, если клад слишком длинный, он вернетсястраница по умолчанию.

image-20191204205715057
image-20191204205715057

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

Как это сделать? Судя по тому, что длина строки больше 50, я сразу верну пустой массив, что лучше для пользователя.Если вы вернете ошибку параметра или ошибку по умолчанию, другие все равнодумал у тебя багПравильно.

Суммировать

На самом деле, Ао Бин, я не ставил оценки за несчастный случай. Ха-ха, это несчастный случай, но Ао Бин такой милый, и лидер тоже любит меня. рассматривал много планов и сценариев по моему дизайну.думаю эту яму. (yy: Ао Бин, ты подонок и хедлайнер. Люди думают, что у тебя нет работы, и хотят тебя поддержать!)

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

болтовня

Ао Бин, опять карты, бериКоманда промежуточного программного обеспечения сообщений AliПризнание моих друзей, и я узнал, что это моя сестра-ветер и облако(название цветка)! ! !

Она прилежная барышня.Все учатся как отличники.Старшая сестра не технический человек,но учится постоянно.Честно говоря,у меня снова мокрые уголки глаз.

Не беги, голосуй! ! !

Я собираюсь поставить свой общедоступный номерJavaFamilyИмя изменено, и имя еще имеет какое-то значение, но его нельзя больше называть Ао Бин. Оно было зарегистрировано как торговая марка. Я спросил у талантов в соседней группе. Есть два, которые мне нравятся больше.

  • Шуай Бинг
  • Третий принц Ао Бин
  • другое сообщение мне

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

Не спрашивайте меня, почему это связано с именем Ао Бин,просить самоубийство!

Мой цветок зовут так, так что 😂

Обратите внимание, не потеряйтесь

Хорошо всем, это все содержание этой статьи. Люди, которые могут видеть это здесь, всеталант.

Каждую неделю я буду обновлять несколько статей, связанных с интервью и общими технологическими стеками ведущих интернет-компаний, большое спасиботалантМы можем видеть здесь, если эта статья хорошо написана, я думаю, что «Ао Бин» ячто-тоеслиПожалуйста, лайкните 👍 Пожалуйста, следите за ❤️ поделитесь пожалуйста 👥Это правда для меняочень полезно! ! !

Проституция нехороша, творить нелегко,Ваша поддержка и признание — самая большая мотивация для моего творчества, увидимся в следующей статье!

Ао Бин | Текст [Оригинал]

Если в этом блоге есть какие-либо ошибки, пожалуйста, критикуйте и советуйте, это очень ценится!


Статья постоянно обновляется каждую неделю, вы можете искать в WeChat "Третий принц Ао Бин"Читать и запрашивать обновления в первый раз (на одну-две статьи раньше, чем в блоге), эту статьюGitHub github.com/JavaFamilyОн был включен, есть ментальная карта точек интервью производителей первого уровня, а также я организовал много своих документов. Добро пожаловать в Звезду и совершенство. Вы можете обратиться в тестовый центр для ознакомления во время интервью. , Я надеюсь, что у нас есть что-то вместе.