Download - Avito Stachka 2012
![Page 1: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/1.jpg)
Нагруженный поиск на Sphinx
Стачка! 2012, Ульяновск
![Page 2: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/2.jpg)
о проекте
Стачка! 2012, Ульяновск
![Page 3: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/3.jpg)
• В top10 сайтов Рунета
• 90М+ запросов в сутки (AVITO, TORG, API)
• 130К+ запросов в минуту
• 120К+ пользователей online (LiveInternet)
• 230К+ новых объявлений в сутки
• 400K+ картинок в день
• 8М+ пользователей размещали объявления
о проекте
Стачка! 2012, Ульяновск
![Page 4: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/4.jpg)
Стачка! 2012, Ульяновск
проблемы
1) Постоянный рост2010 год 7М просмотров
2011 год 25М просмотров
2012 год 80М просмотров
2013 год ?
* среднесуточное кол-во просмотров за март по данным LiveInternet
![Page 5: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/5.jpg)
Стачка! 2012, Ульяновск
проблемы
2) Архитектура в наследство (все делает БД)
• Полнотекстовый поиск (tsearch)
• Аналитика (triggers, тяжелые запросы)
• Излишняя денормализация
• Логи операций
• Синхронность
![Page 6: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/6.jpg)
Стачка! 2012, Ульяновск
решение
Используйте наиболее подходящие инструменты
1. Аналитика: IMDB + PHP
2. Поиск: Sphinx
3. Мелкие оптимизации
4. Конфигурация
5. Фоновые процессы
![Page 7: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/7.jpg)
Стачка! 2012, Ульяновск
архитектура
+ system
![Page 8: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/8.jpg)
Стачка! 2012, Ульяновск
поиск по объявлениям
![Page 9: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/9.jpg)
Стачка! 2012, Ульяновск
поиск похожих объявлений
![Page 10: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/10.jpg)
• 140М запросов в сутки
• 3К запросов в секунду в пики
• 7М документов в индексе
• Размер индекса 3GB+
• Каждые 20 минут полная переиндексация
• 16 серверов (x16 core)
Стачка! 2012, Ульяновск
поиск / цифры
![Page 11: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/11.jpg)
• tmax < 30 минут
• время на применение услуг к объявлению
• время на премодерацию
• время на переиндексацию
• сохранить быстрые настройки поиска
• поддержать целостность данных
• решить проблему селективности выборки из БД
Стачка! 2012, Ульяновск
поиск / требования
![Page 12: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/12.jpg)
Стачка! 2012, Ульяновск
поиск / архитектура
M S1 S15
DBrepca
uftp + rsync
londisteindexer
clients
sphinxql
...
![Page 13: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/13.jpg)
Стачка! 2012, Ульяновск
поиск / индексация
время переиндексации 20 мин
1. Построение снапшота активных объявлений
2. Многопоточная индексация из БД
3. Предварительный деплой на слейвы
сразу после построения индекса [uftp]
4. Проверка индексов [rsync, indextool]5. Ротация [kill -HUP $pid]
![Page 14: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/14.jpg)
Стачка! 2012, Ульяновск
поиск / построение снапшота
items tablesitems tables items MV
items MVshapshot
triggers
londistereplication
storage procedure
Pg Master
Pg Memory
sphinx
![Page 15: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/15.jpg)
Для чего нужен снапшот + слейв:
• Целостность поискового индекса
• Снятие IO с мастера
• Денормализация атрибутов
• Отдельный пул для долгих коннектов
• Паралельное вычитывание базы
• seq scan из shared buffers
Стачка! 2012, Ульяновск
поиск / построение снапшота
![Page 16: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/16.jpg)
#!/bin/bash
CONF='indexer.sphinx.conf'
INDEXES = [...]
for IDX in ${INDEXES}; do
(indexer -c ${CONF} ${IDX} && deploy ${IDX}) &
done
Стачка! 2012, Ульяновск
поиск / многопоточная индексация
![Page 17: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/17.jpg)
#indexer.sphinx.confsource index_src { ... }index index_name {
source = index_srcpath = /sources_new/index_name
}indexer { mem_limit = 1536M } #sphinx.confindex index_name {
path = /sources/index_name}
Стачка! 2012, Ульяновск
поиск / многопоточная индексация
![Page 18: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/18.jpg)
Стачка! 2012, Ульяновск
поиск / ротация
#!/bin/bash
NEWNAME_RE='s/(.*).([a-z]*)$/1.new.2/g'
SOURCES=/sources/
SOURCES_NEW=/sources_new/
for f in `ls -1 $SOURCES_NEW`; do
NEWNAME=`basename $f|sed -e ${NEWNAME_RE}`
cp "${SOURCES_NEW}${f}" "${SOURCES}${NEWNAME}"
done
kill -HUP `cat sphinx.pid`
![Page 19: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/19.jpg)
• отдельные конфиги для индексатора и поиска
• на каждый фильтр свой атрибут (MVA медленно)
• дисковые индексы хранятся в RAM (tmpfs)
• query_log только при необходимости
• dict = keywords - быстрее поиск, нет коллизий
• настройки под характеристики железа (через
тесты)
Стачка! 2012, Ульяновск
поиск / настройки
![Page 20: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/20.jpg)
searchd{ workers = prefork prefork = 32 # CPU cores * 2 prefork_rotation_throttle = 50 seamless_rotate = 1 preopen_indexes = 1 read_buffer = 64K read_unhinted = 64K compat_sphinxql_magics = 0 binlog_path = # не используем RT ...}
Стачка! 2012, Ульяновск
поиск / настройки searchd
![Page 21: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/21.jpg)
• lazy initialization
• используем кеш
• по возможности используем multi-query
• вычисляем оптимальный max_matches
= offset + limit
• сортируем результаты в обратном порядке,
если offset > total_matches / 2
• фильтрация по селективным атрибутам
Стачка! 2012, Ульяновск
поиск / клиенты
![Page 22: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/22.jpg)
Стачка! 2012, Ульяновск
поиск / поиск похожих
![Page 23: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/23.jpg)
SELECT id, price, sint(if(loc_id=637640,12,0)) + sint(if(loc_id>=637690 AND loc_id<=639990,9,0)) AS rnk_location, 15-interval(abs(price-830000),0,83000,124500,166000)*3 AS rnk_price, sint(if(price=0,-2,0)) AS rnk_empty_price, in(val210,1202,1177,3476,1211,1187,3477,1207)*7 AS rnk_similar_brand , ... sint(if(val185=860,3,0)) AS rnk_transmission , ( rnk_location + rnk_price + rnk_empty_price + rnk_images + rnk_brand + rnk_model + rnk_year + rnk_body + rnk_engine + rnk_similar_brand + rnk_mileage + rnk_shop + rnk_transmission ) AS rnkFROM items_category_9WHERE loc_id BETWEEN 621550 AND 662819ORDER BY rnk DESC, sort_time DESCLIMIT 6 OPTION max_matches=6, ranker=wordcount
Стачка! 2012, Ульяновск
поиск / поиск похожих
![Page 24: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/24.jpg)
Стачка! 2012, Ульяновск
backoffice
CENSORED
![Page 25: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/25.jpg)
Стачка! 2012, Ульяновск
backoffice / цифры
• 70M документов в индексе
• 25GB размер индексов
• 70GB данных для индексации
• 16 серверов (1 сервер = 1 нода + pool)
• Ежеминутная индексация
• Раз в час мерж дельты
![Page 26: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/26.jpg)
Стачка! 2012, Ульяновск
backoffice / архитектура
3
1
3
1
3
3 4
1
3
Node 1 Node 2 Node 3 Node 4
Pool
Group 1
8/8/16
![Page 27: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/27.jpg)
Стачка! 2012, Ульяновск
backoffice / реализация
+ основной индекс + дельта
+ MVA для поиска по параметрам (здесь можно)
+ 3 уровня - ноды/группа/pool
- дельта по last_update_txtime с нахлестом
- медленная полная переиндексация :(
![Page 28: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/28.jpg)
Стачка! 2012, Ульяновск
![Page 29: Avito Stachka 2012](https://reader033.vdocuments.pub/reader033/viewer/2022051412/54877acdb4af9fbd5d8b4f50/html5/thumbnails/29.jpg)
Стачка! 2012, Ульяновск
cпасибо! вопросы?
Роман Павлушко[email protected]
twitter.com/pavlushko
slideshare.net/pavlushko/