Top Banner
RT индексы в поиске Avito Вячеслав Крюков, Avito
73

"RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Apr 15, 2017

Download

Internet

AvitoTech
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT индексы в поиске Avito

Вячеслав Крюков, Avito

Page 2: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск в Avito

● Активные объявления

● Контекстные объявления

● BackOffice

● В докладе про поиск активных объявлений на RT (Real Time) индексах

Page 3: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «до» внедрения RT индексов

Page 4: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «до» внедрения RT индексов

● Активное объявление появилось в Master базе

Page 5: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «до» внедрения RT индексов

● Через логическую репликацию оно стало доступно на сервере, где происходит индексация

Page 6: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «до» внедрения RT индексов

● Каждые 5-8 мин строятся Plain индексы и с этой задержкой наше объявление проиндексировано

● В это время репликация на паузе

Page 7: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «до» внедрения RT индексов

● Plain индексы раздаются по udp на поисковые сервера, битые индексы дораздаются через rsync

Page 8: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «до» внедрения RT индексов

● Ротация Plain индексов делает доступным в поиске наше объявление

Page 9: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «до» внедрения RT индексов

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

Page 10: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «до» внедрения RT индексов

● Его принимает однин из бэкендов

Page 11: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «до» внедрения RT индексов

● HAProxy бэкенда отправляет SphinxQL запрос на демон Searchd и он выполняется на индексе одной из категории

Page 12: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «до» внедрения RT индексов

● Или выполняется распределенный запрос по индексам всех категорий

Page 13: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Ожидания от внедрения RT индексов

● Мгновенная доступность нового объявления в поиске

● Надежность

● Масштабируемсть

● Обслуживать высокую поисковую нагрузку (17000 RPS в пике)

● Сотни изменений в секунду

● Комбинированное решение, с тем что было «до»

● Унификация настроек

Page 14: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Чем отличается поиск на RT индексах от Plain?

● Indexer и Main+Delta схема внутри демона Searchd

● Indexer не нужен

● Запросы на изменения данных идут к Searchd

● Ram + Disk чанки

● Внутренние Kill листы

Page 15: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Изменения данных в RT индексах

● INSERT/REPLACE

● UPDATE

● DELETE

Page 16: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

Page 17: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Активное объявление появилось в Master базе

Page 18: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Через логическую репликацию оно стало доступно на сервере, где происходит индексация

Page 19: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● По факту новых данных в реплике генерируется событие с Id объявления в очереди PGQrt

Page 20: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Событие считывается консьюмером RT Indexer

Page 21: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Если у RT Indexer установлен флаг active, то он делает SELECT из реплики данных по Id объявления в событии

Page 22: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Если данные найдены, то RT Indexer выполнит запрос REPLACE к демону Searchd

● Cоответствующие изменения отображается в RT индексах

Page 23: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Если данные не найдены, то делается запрос DELETE

Page 24: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● RT Indexer отмечает событие в очереди обработанным

● Если при поступлении события флага active не было, то эта отметка делается сразу и никакой др. работы не делается

Page 25: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Отставание «До» и «после» выкатки RT индексов

Page 26: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Количество объявлений в общем индексе (Distr Index)

Page 27: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Количество изменяемых объявлений во времени

Page 28: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Зачем две очереди PGQm и PGQrt?

Page 29: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Зачем две очереди PGQm и PGQrt?

● Очередь PGQm нужна для Londiste репликации

● Очередь PGQrt влючена последовательно

● Данные есть в реплике - операция REPLACE

● Данных нет в реплике - операция DELETE

● Гонки данных не возможны

● Возможен оверхед по уже выполненной операции

Page 30: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Зачем нужны Plain индексы?

Page 31: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Зачем нужны Plain индексы?

● Нельзя бесконечно накапливать изменения в RT индексах

● Нужно сбрасывать сотояние RT индексов — делать rebuild

● Plain индексы играют промежуточную роль

● Можем откатиться к решению «до», если RT поломается

Page 32: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Rebuild RT индексов

● Репликация на паузе

● Переиндексация Plain индексов

Page 33: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Rebuild RT индексов

● Репликация на паузе

● Раздача Plain индексов

Page 34: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Rebuild RT индексов

● Репликация на паузе

● Принудительная пауза, для холостой прокрутки PGQrt

Page 35: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Rebuild RT индексов

● Репликация на паузе

● RELOAD Plain индексов

Page 36: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Rebuild RT индексов

● Репликация на паузе

● ATTACH WITH TRUNCATE Plain индексов в RT

Page 37: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Rebuild RT индексов закончен

● Репликация снята с паузы

● Установлен флаг active

● RT indexer обрабатывает очередь PGQrt

Page 38: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Rebuild RT индексов

Page 39: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Изменение размера Ram чанка

Page 40: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Поисковые запросы через бэкененды и HAProxy поступают на демон Searchd и он их отрабатывает на RT индексах

Page 41: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поисковая нагрузка

Page 42: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Зачем нужен Failover ?

Page 43: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Следит за отставанием очереди PGQrt

Page 44: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Следит за отставанием и кол-ом объявлений в RT индексах

Page 45: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● Следит за окончанием периода активности RT indexer

● Следит за перезапуском или отсутствием процесса RTIndexer

Page 46: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Поиск «после» внедрения RT индексов

● И устанавливает флаг rebuild если есть нарушения

● После этого начинается Rebuild RT индексов

Page 47: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Что еще делает Failover?

● Перезапуск RTIndexer при зависании

● Нотификация в Slack

Page 48: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Неконтролируемое отставание очереди PGQrt

Page 49: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Контролируемое отставание очереди PGQrt

Page 50: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Python демон с подключенной библиотекой на Go

Page 51: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Если не установлен флаг active, RT Indexer прогоняет очередь PGQrt вхолостую, без какой-либо работы

Page 52: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● В RT Indexer можно выделить три основные сущности оформленные в виде Go рутин и соединенные последовательно через каналы в Pipeline

Page 53: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Сортирует Id объявлений в пачки по категориям, возвращает канал, для передачи таких пачек

Page 54: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Передает отсортированные пачки Id в этот канал по мере поступления событий из PGQrt

Page 55: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Слушает канал с отсортированными по категориям пачками Id объявлений

● Извлекает для них данные объявлений из реплики исползуя конфиг для Plain индексов

Page 56: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Создает два канала с данными объявлений по категориям для запросов REPLACE и id удаляемых объявлений для запросов DELETE

● Если данные для Id объявления не найдены, то оно считается удаляемым

Page 57: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Передает в эти каналы данные по мере поступления пачек Id объявлений

Page 58: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Слушает канал с данными объявлений по категориям для запросов REPLACE

● Слушает канал с Id объявлений для удаления

● Формирует и выполняет запросы REPLACE и DELETE

Page 59: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Выполняются запросы REPLACE и DELETE для категории 1

Page 60: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Выполняются запросы REPLACE и DELETE для категории 2

Page 61: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Выполняются запросы REPLACE и DELETE для категории Nc

Page 62: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● В RT Indexer обрабатываются абсолютно все ошибки, падения не допускаются

Page 63: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● В RT Indexer отмечаются обработанными абсолютно все события

Page 64: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Ошибки пишутся в общий для всех канал ошибок

● Канал ошибок слушает специальная Go рутина

Page 65: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

RT Indexer

● Если встречается критичная ошибка, то выставляется состояние rebuild

● Аварийного завершения не происходит

Page 66: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Критичные ошибки в RT Indexer

● Возникновение ошибок выполнения запросов

● Появление нового поискового сервера

● Ошибки конфигурации

Page 67: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Настройка производительности

● Медленные запросы REPLACE/DELETE — отставание очереди PGQrt

● rt_mem_limit срабатывает поиндексно

● Необходим некоторый избыток rt_mem_limit

Page 68: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

0.95 время выполнения SELECT

Page 69: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Максимальное время выполнение REPLACE

Page 70: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Отставание

Page 71: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Полное спокойствие в пик трафика

Page 72: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Что реально получили «после» внедрения RT индексов

● Попадание нового объявление в поиск с 10 сек отставанием

● Как и прежде держит высокую нагрузку

● Не вычитываем повторно данные

● Уменьшили трафик в сети

● Гармонично вписали решение c RT индексами в ранее существующую систему

● Получили надежную систему

Page 73: "RT индексы в поиске Avito" Вячеслав Крюков (Avito)

Спасибо, вопросы?