company_banner

Как мы ускорили поиск в Яндекс.Почте и при этом освободили 25 серверов

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

    В день в Почту приходит порядка 100M писем, 10M из которых — с аттачами. Несмотря на то, что лишь 10% писем содержат вложение, среди писем с вложениями существенная доля тех, в которых файлов больше одного. В среднем получается, что общее количество писем равно суммарному количеству аттачей к ним.

    image

    Средний размер письма с аттачем составляет 400 кб, а письма без аттача 4 кб. Суммарный размер аттачей в одном письме может достигать 30 мб. ТОП 10 типов аттачей: .jpg, .pdf, .xls, .rar, .doc, .zip, .eml, .mp3, .tif, .docx. Практически все файловые форматы кроме текстового, содержат существенное количество избыточной служебной информации. Так, например: .docx формат, содержит всреднем всего 10 % текстовой информации, а из jpg мы получаем всего 0,25% метаинформации для индексации в поиск.

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

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

    Хранилище писем отвечает за хранение и отдачу по запросу всего содержимого каждого письма и исторически почему-то называется mulca. Для хранения писем в Яндекс.Почте развернуто 700 мулечных серверов. Здесь хранятся содержание писем, заголовки, вложения — одним словом, всё, что относится к письму.

    Хранилище метаинформации служит для быстрого показа инбокса и содержит только описательную часть письма. Например, поля «От кого», «Кому», «Тема», имя папки, в которой находится письмо в данный момент, его текущая метка, дата написания и т.п. Кластер метаинформации занимает 60 серверов.

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

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

    Таким образом, письма, попадая в почту, проходят длинный путь. Сначала они складываются в хранилище, потом они попадают в кластер Services, а там готовятся к отправке в поиск.

    image

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

    Несколько лет назад мы, не меняя озвученную выше первоначальную архитектуру, запустили поиск по содержимому аттачей. Это повлекло за собой ряд проблем. Во-первых, некоторые типы файлов (особенно .pdf) обрабатывались долго — до нескольких минут, и оттормаживали доставку новых писем в поиск. Во-вторых, между программой индексации и программой конвертации на кластере Services постоянно шла конкуренция за ресурсы, что также замедляло попадание новых писем в поиск. И в-третьих, когда мы стали присылать в кластер Services целиком всё письмо с аттачами, то фактически удвоили почтовый трафик внутри сетей Яндекса. Внутрисетевой трафик увеличился на 25 Тб в сутки, а это нагрузка на полезные для персональных сервисов и для Яндекса в целом ресурсы: серверы, сетевую инфраструктура и суммарную производительность сети.

    Итак, нам нужно было бороться за качество сервиса. Нельзя было допустить, чтобы письма приходили в поиск спустя минуты. Тем более, что до запуска поиска по аттачам 95% всех входящих писем попадали в поиск меньше, чем за секунду.

    Появилась мысль доставлять письма целиком только в хранилище, а в поиск отдавать лишь структурированный текст прямо из хранилищ. Предварительно проведенные исследования показали, что средний размер текста, необходимого для поиска, в 10 раз меньше среднего размера письма в почте. Следовательно, если в поиск будет приходить только текст, то и потребляемый поиском сетевой трафик будет в 10 раз меньше, что сэкономит примерно 22 Тб в сутки. Кажется, что уже ради экономии трафика игра стоит свеч.

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

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

    Мы разместили в хранилище программу извлечения текста из разных форматов с жесткими ограничениями: программе было предоставлено 50% производительности процессора и был выделен 1 Гб оперативной памяти на каждом из серверов. Такие ограничения позволили нам запустить процесс конвертации в хранилище и не помешать процессу хранения.

    image

    В итоге мы снизили паразитный внутрисетевой трафик и увеличили производительность системы доставки писем в поиск на два порядка — снова 95% писем стали попадать в поиск в течение секунды. На сдачу мы получили дополнительный бонус в 25-ти свободных серверов кластера доставки писем в поиск. Если изначально мы планировали увеличивать кластер Services в 2 раза и получить тут 50 серверов, чтобы справляться с постоянно растущим потоком, то теперь, когда все необходимые для поиска данные готовятся прямо в хранилище писем, у нас по факту целый кластер из 25 серверов стал свободным. Так что в ближайшем будущем мы сможем использовать его для других задач, о чем непременно расскажем.

    P.S. А еще для поиска по почте периодически требуется переиндексация всех накопленных за все время существования Яндекс.Почты писем. Это случается, когда необходимо поменять алгоритм поиска, а данных в поиске для этого недостаточно. В это время мы фактически перерабатываем весь массив хранящихся в почте писем, а это сейчас примерно 10 петабайт. И уж тут-то получается просто колоссальная экономия по сетевому трафику и производительности.

    P.P.S. Несмотря на полученные результаты, мы не планируем останавливаться на достигнутом. Будем стремимся сделать доставку писем в поиск одновременно с покладкой их в хранилище и для этого будем использовать освободившийся кластер. Ждите информацию об этом в новых публикациях про поиск в Яндекс.Почте.
    Яндекс
    493,00
    Как мы делаем Яндекс
    Поделиться публикацией

    Комментарии 48

      +5
      Читать про готовые решения — это круто, но поучаствовать в чем-то подобном — гораздо интереснее.

      На Хабре ведь много очень умных людей. Есть даже настоящие монстры.
      Вы можете писать самые актуальные проблемы на Хабр, а хабрапользователи будут предлагать свои решения. И людям приятно и вам профит.
        +8
        Мы подумаем об этом.
        Но в целом, участие внешних людей во внутренних процессах обычно оказывается очень сложной для всех штукой. Те, кто хотят улучшать Я.Почту, могут прийти к нам работать :)
          +5
          Кстати, интересный формат публикации: в первом посте ставить проблему (которую вы уже решили или только решаете), некие исходные данные и желаемый результат, а пользователи чтобы предлагали свои варианты решения. Вторым постом публикуете то, как упомянутую проблему решили вы. Кто был ближе к истине, тому пару лишних гагабайт в Яндекс.диск, а то и вовсе приглашение в гости на собеседование.

          Пользуясь случаем — идея по увеличению Яндекс.Диска для хабраюзеров мне тоже нравится ;)
            +1
            интересная мысль — я не про гигабайты :)
              0
              Не стоит так разбивать статьи. Слишком попсово и толсто, не хабровский формат.
                0
                поясни пожалуйста как было бы правильно
                  +1
                  Я отвечал Бумбуруму на предложение разбивать статьи на вопрос и ответ, искусственно нагнетая интригу. Это пошлый приём. Его не надо.

                  Разбиение статей нужно лишь если они очень большие. И то не факт. Очень хорошо, что эту статью Вы не разбивали.
                    0
                    понятно, но в целом интрига лично мне нравится
                    правда далеко не все ее могут делать
                +1
                Гагабайты это эпатажные гигабайты? =)
            +1
            Tika, поэтому для простоты и созвучности с русским языком разработчик назвал ее Tikaite.


            Это какой-то, прошу прощения, татарский разработчик, чтобы «Тика» превратить в «Тикаитэ́э» и сказать, что это стало проще и созвучнее русскому :-).
              +9
              Это как бы «Тикайте отседова». Это и никакого отношения к татарскому не имеет. И чем вам не угодили татарские разрабы?))
                +2
                Смеялись просто вчера как раз: наш консультант писал письмо с переходом на новую строку (энтером).

                Строка кончалась на «во вторник», а вместе энтера промахнулся мизинцем и нажал на „э“: получилось «во вторникээ» (антуража добавляла подпись коллеги: Ренат Абдурашидович) :-).
                  +2
                  Однажды писали кое-чего для кое-каких курсантов. Одно письмо от заказчика заканчивалось словами «рабочее место курсанта», но вместо завершающей точки автор письма по ошибке нажал соседнюю «ю», и вышло «рабочее место курсантаю». Потом мы так и говорили «курсантай» вместо «курсант» в дальнейших обсуждениях.
              0
              Я бы посоветовал Яндекс.Почте чтобы избежать подобных проблем уделить внимание «лёгкому» варианту почты (который, кстати, не обновляется уже несколько лет), большей интеграцией Яндекс.Почты с Яндекс.Диском и популяризации Яндекс.Диска.
                +2
                А для популяризации Яндекс.Диска уже пора вводить поиск по нему. А то своего поиска не вставили, а через браузер не поискать из за того что результат подгружается при скроле страницы вниз.
                  +3
                  comming soon…
                0
                Ребят, может не в тему, но мобильно приложение Почты дико медленно грузит вложения. Вчера 5 фоток по 2.5 мб грузились минут 30. Проблемы у меня(Nexus 4), у девушки(iPhone 4) и у друга(iPhone 5). Провайдеры разные, естественно, со скоростью вайфая тоже никаких проблем ни у кого.
                У кого-то есть подобные проблемы? Задумываюсь о переходе на гугл, невозможно столько ждать отправки фоток.
                  +12
                  Cocaine и mulca — ребята явно в теме
                    0
                    Mulca имеет свою расшифровку, кстати, — Mail Units Localized Containers Architecture.
                    0
                    Кластер метаинформации занимает 60 серверов.

                    А на картинках 250 серверов. Я что-то не понимаю, или где-то несоответствие?
                      +1
                      спасибо, поправили
                      –9
                      Да, мощный поисковый кластер. Полагаю для поиска по словам «оппозиция» и «против путина» по всем ящикам вместо одного достаточно поменять конфигурацию. А то и проще, зайти на «специальную» страницу…
                        +3
                        Ваши предложения?
                        Вы бы предпочли, чтобы поиска не было?
                        –3
                        от ведь… читатель в половине случаев вложения и не смотрит даже, а их уже проиндексировали. Вот почему почту надо с почтовых серверов поисковиков забирать на клиент, и удалять с сервера… Индекс потихоньку затрется…
                          +1
                          На самом деле в большинстве случаев, если есть вложение в письме, оно является основным несущим информацию составляющим. А часто и вообще ничего кроме файлов в письме нет. Ну, может, комментарий «как тебе фоточки» или «вот договор».
                          –1
                          Ребят, а можно вопрос не в тему задать, все-таки представители ))))
                          С Яндекс-деньгами какая-то трабла прям: на прошлой неделе при платежах дарили код для игр в эплстор, так 3 одинаковых игры «Cut the Rope: Experiments» получил. На этой недели 2 платежа, и снова 2 одинаковых игры — «allods» какой-то, от мэйла.
                          Я что хочу сказать, вы не дарите что-ли дубликаты )) Это не то что бы претензия (дареной лошади сами знаете куда не смотрят), просто зачем их столько? Раньше хоть купоны на танки давали, так было кому раздавать, а эти хоть соли. Как-то так.
                          P.S. Больше никогда не буду писать комментарии не по теме (повторил 100 раз) ;)
                            +2
                            Добрый день! Представитель скорее я :) Меня зовут Аня.
                            Это еженедельная акция с iTunes — каждую неделю дарим ПИН-код на определённую игру, песню или книгу в iTunes при каждом платеже на сайте Яндекс.Денег. Это не то чтобы дубликаты :) По идее, в конце чека, который Вы получаете, есть кнопка «Отправить другу». То есть ненужными кодами можно делиться, или просто их игнорировать. Думаю, если мы начнём давать «один код в одни руки», недовольных будет больше.
                            Плюс у нас в твиттере даже образовался хэштег #yamoney, в котором пользователи отдают друг другу ненужные коды. Насколько я вижу, им приятно делиться.
                              0
                              Про танки, кстати, вот-вот будет неплохая акция, следите за новостями в социальных сетях Яндекс.Денег :)
                                0
                                Спасибо за разъяснения! Про твиттер не знал, а в танки не играю, просто такие купоны есть кому отдавать ))
                                  0
                                  Вот наш твиттер, его веду я, там почти каждый день какие-нибудь подарочки :) Там же можно отследить акции с танками, они часто бывают.
                              0
                              Пользуясь случаем. Я плохо искал, или поиск Яндекс.Почты не поддерживает конструкции типа has:attachment, -бананы и прочие подобные? Хоть в пору назад на gmail перползать, иногда без этого сложно что-то найти.
                                0
                                очень сложный язык запросов и собственно непонятно почему именно такой?
                                А язык запросов мы сделаем
                                  +1
                                  Потому что я уже примерно знаю язык gmail'овского и проиллюстрировать было проще на нем. :) Как обычно, no ETA? :(
                                    +1
                                    Ок, мы планируем сделать язык, и учтем gmail при реализации.
                                    кстати IMAP-овский язык запросов работает, но для этого нужен IMAP клиент.
                                +2
                                Иллюстрации точно местами не перепутаны?

                                Ну и поспрашиваю маленько:
                                Какими средствами ограничили ресурсы Tikaite на серверах mulca? Какие-то контейнеры? cgroups?

                                Интересно, кстати, письма в основном хранилище хранятся в исходном виде (вложения в base64, юникод в quoted-printable etc) или в распарсенном? Если только в распарсенном, то как тогда работает просмотр «исходника письма» («mail.yandex.ru/neo2/handlers/message-source/...»)
                                  0
                                  У меня есть подозрение, что, скажем, если на машине 24 ядра, то они позволяют запускаться одновременно не больше, чем 12 процессам на сервере :). А вот память уже можно даже через ulimit ограничивать.
                                    +1
                                    Да, количество потоков действительно равно половине числа ядер,
                                    А память просто ограничиваем опцией Java-машины -Xmx1G
                                    0
                                    В mulca письма хранятся так, как они к нам пришли, а метаданные отдельно.
                                    +2
                                    Дорогой Яндекс, молю выложите пожалуйста топ 50 или лучше топ 100 типов вложений. Поможете маленькому стартапу неоценимой помощью. А если звезды сложатся, то возможно и с процентами от общего числа аттачей.
                                      0
                                      А почему ТОП 10 недостаточно?
                                      ТОП 50 можно попробовать поискать, но не обещаю, что найдется.
                                        0
                                        Топ 10 маловато, так как в него не попадают интересующие типы (вектор, psd, ps и тд) они лежат видимо дальше по списку. Я буду вам очень благодарен если сможете найти топ 50.
                                          0
                                          а раве в ТОП 50 не попадут практически все возможные аттачи, которые шлют в почту?
                                            0
                                            Да, а так же попадут те которые нужны мне, что бы понять какие из них наиболее популярны сейчас при пересылке в почте. Я хочу понять на какие форматы нужно сделат упор и расставить приоритеты, к примеру .cdr более популярен чем .ai или .eps или наоборот.
                                              +3
                                              Вот примерно так:

                                              jpg, gif, png, doc, xls, pdf, docx, xlsx, htm, rar,
                                              zip, txt, rtf, tif, dwg, ppt, bmp, mp3, eml, pptx
                                              ics, cdr, xml, odt, 7z, tiff, a, pps, ods, vcf,
                                              dat, csv, dbf, exe, p7s, 1, psd, log, mp4, mht,
                                              db, wmv, mpga, avi, swf, mime, ai, mso, ccl, mxl
                                                0
                                                Здорово, спасибо огромное. Они отсортированы в порядке популярности?
                                                  0
                                                  примерно да,
                                                  это данные с одного поискового сервера, так что ± данные точные
                                                  одним словом я бы на эти данные опирался
                                        0
                                        А скажите, столько ресурсов для бесплатного сервиса — это все для популяризации слова Яндекс и косвенного продвижения поиска? Или есть какой-то другой смысл такого подарка пользователям?
                                          +1
                                          Подарок для пользователей — это хороший и улучшенный продукт,
                                          а освободившиеся ресурсы — это скорее подарок для нас — команды поиска — ведь эти ресурсы позволят сделать нашим пользователям еще какой-нибудь подарок в будущем

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

                                        Самое читаемое