Как Мы Ускоряем Поиск В Яндекс.почте И При Этом Освобождаем 25 Серверов

Мы уже писали о как организована работа поиска писем в Яндекс.

Почте .

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

В день на почту приходит около 100 млн писем, 10 млн из которых содержат вложения.

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

В среднем получается, что общее количество писем равно общему количеству вложений к ним.



Как мы ускоряем поиск в Яндекс.
</p><p>
Почте и при этом освобождаем 25 серверов

Средний размер письма с вложением — 400 Кб, письма без вложения — 4 Кб.

Общий размер вложений в одном письме может достигать 30 МБ.

ТОП-10 типов вложений: .

jpg, .

pdf, .

xls, .

rar, .

doc, .

zip, .

eml, .

mp3, .

tif, .

docx. Почти все форматы файлов, кроме текстовых, содержат значительное количество избыточной служебной информации.

Так, например: формат .

docx содержит в среднем только 10% текстовой информации, а из jpg мы получаем только 0,25% метаинформации для индексации в поиске.

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

Для обслуживания такой нагрузки в Яндекс.

Почте создана крупная сетевая, серверная и сервисная инфраструктура, включающая несколько кластеров, распределенных по разным дата-центрам.

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

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

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

Почте развернуто 700 почтовых серверов.

Здесь хранится содержимое писем, заголовки, вложения – словом, все, что относится к письму.

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

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

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

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

Письмо считается доставленным, если оно включено в хранилище писем и хранилище метаинформации.

Письма доставляются в розыск после помещения их на хранение.

Для доставки писем в поиск выделен отдельный кластер Служб, состоящий из двадцати пяти серверов.

Этот кластер содержит очереди писем, ожидающих индексации, и программы, готовящие данные к индексации.

Таким образом, письма, попадая на почту, проходят долгий путь.

Сначала они хранятся в хранилище, затем попадают в кластер «Сервисы» и там готовятся к отправке на поиск.



Как мы ускоряем поиск в Яндекс.
</p><p>
Почте и при этом освобождаем 25 серверов

Но поиск по буквам - это не только поиск по телу письма , но и поиск по содержимому вложений.

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

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

Это привело к ряду проблем.

Во-первых, некоторые типы файлов (особенно .

pdf) долго обрабатывались - до нескольких минут - и задерживали доставку новых писем в поиск.

Во-вторых, существовала постоянная конкуренция за ресурсы между программой индексирования и программой конвертации на кластере «Сервисы», что также замедляло попадание новых букв в поиск.

И в-третьих, когда мы начали отправлять всё письмо с вложениями в кластер «Сервисы», мы фактически удвоили почтовый трафик внутри сетей Яндекса.

Внутрисетевой трафик увеличился на 25 ТБ в сутки, а это нагрузка на полезные для персональных сервисов и для Яндекса ресурсы: серверы, сетевую инфраструктуру и общую производительность сети.

Итак, нам пришлось бороться за качество обслуживания.

Допустить, чтобы письма пришли в розыск спустя несколько минут, было невозможно.

Более того, до запуска поиска вложений 95% всех входящих писем попадали в поиск менее чем за секунду.

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

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

Следовательно, если в поиск попадает только текст, то сетевой трафик, потребляемый поиском, будет в 10 раз меньше, что позволит сэкономить примерно 22 ТБ в день.

Похоже, только ради экономии трафика игра стоит свеч.

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

Это позволит нам ускориться.

Так они и сделали.

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

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

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

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

Такие ограничения позволили нам запустить процесс конвертации в хранилище и не вмешиваться в процесс хранения.



Как мы ускоряем поиск в Яндекс.
</p><p>
Почте и при этом освобождаем 25 серверов

В результате мы сократили ложный интранет-трафик и увеличили производительность системы доставки писем в поиск на два порядка — опять же, 95% писем стали попадать в поиск в течение секунды.

За изменение мы получили дополнительный бонус в виде 25 бесплатных кластерных серверов для доставки писем в поиск.

Если изначально мы планировали увеличить кластер «Службы» в 2 раза и получить здесь 50 серверов, чтобы справиться с постоянно растущим потоком, то теперь, когда все необходимые для поиска данные подготавливаются непосредственно в хранилище писем, у нас фактически имеется целый кластер из 25 серверы бесплатно.

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

P.S. Также поиск по почте периодически требует переиндексации всех писем, накопленных за все время существования Яндекс.

Почты.

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

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

П.

П.

С.

Несмотря на полученные результаты, мы не планируем останавливаться на достигнутом.

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

Информацию об этом ждите в новых публикациях о поиске в Яндекс.

Почте.

Теги: #Высокая производительность #Яндекс #Поисковые технологии #Яндекс.

почта #tikaite #tika

Вместе с данным постом часто просматривают: