View
930
Download
0
Category
Preview:
DESCRIPTION
Citation preview
Нагруженный поиск на Sphinx
Стачка! 2012, Ульяновск
о проекте
Стачка! 2012, Ульяновск
• В top10 сайтов Рунета
• 90М+ запросов в сутки (AVITO, TORG, API)
• 130К+ запросов в минуту
• 120К+ пользователей online (LiveInternet)
• 230К+ новых объявлений в сутки
• 400K+ картинок в день
• 8М+ пользователей размещали объявления
о проекте
Стачка! 2012, Ульяновск
Стачка! 2012, Ульяновск
проблемы
1) Постоянный рост2010 год 7М просмотров
2011 год 25М просмотров
2012 год 80М просмотров
2013 год ?
* среднесуточное кол-во просмотров за март по данным LiveInternet
Стачка! 2012, Ульяновск
проблемы
2) Архитектура в наследство (все делает БД)
• Полнотекстовый поиск (tsearch)
• Аналитика (triggers, тяжелые запросы)
• Излишняя денормализация
• Логи операций
• Синхронность
Стачка! 2012, Ульяновск
решение
Используйте наиболее подходящие инструменты
1. Аналитика: IMDB + PHP
2. Поиск: Sphinx
3. Мелкие оптимизации
4. Конфигурация
5. Фоновые процессы
Стачка! 2012, Ульяновск
архитектура
+ system
Стачка! 2012, Ульяновск
поиск по объявлениям
Стачка! 2012, Ульяновск
поиск похожих объявлений
• 140М запросов в сутки
• 3К запросов в секунду в пики
• 7М документов в индексе
• Размер индекса 3GB+
• Каждые 20 минут полная переиндексация
• 16 серверов (x16 core)
Стачка! 2012, Ульяновск
поиск / цифры
• tmax < 30 минут
• время на применение услуг к объявлению
• время на премодерацию
• время на переиндексацию
• сохранить быстрые настройки поиска
• поддержать целостность данных
• решить проблему селективности выборки из БД
Стачка! 2012, Ульяновск
поиск / требования
Стачка! 2012, Ульяновск
поиск / архитектура
M S1 S15
DBrepca
uftp + rsync
londisteindexer
clients
sphinxql
...
Стачка! 2012, Ульяновск
поиск / индексация
время переиндексации 20 мин
1. Построение снапшота активных объявлений
2. Многопоточная индексация из БД
3. Предварительный деплой на слейвы
сразу после построения индекса [uftp]
4. Проверка индексов [rsync, indextool]5. Ротация [kill -HUP $pid]
Стачка! 2012, Ульяновск
поиск / построение снапшота
items tablesitems tables items MV
items MVshapshot
triggers
londistereplication
storage procedure
Pg Master
Pg Memory
sphinx
Для чего нужен снапшот + слейв:
• Целостность поискового индекса
• Снятие IO с мастера
• Денормализация атрибутов
• Отдельный пул для долгих коннектов
• Паралельное вычитывание базы
• seq scan из shared buffers
Стачка! 2012, Ульяновск
поиск / построение снапшота
#!/bin/bash
CONF='indexer.sphinx.conf'
INDEXES = [...]
for IDX in ${INDEXES}; do
(indexer -c ${CONF} ${IDX} && deploy ${IDX}) &
done
Стачка! 2012, Ульяновск
поиск / многопоточная индексация
#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, Ульяновск
поиск / многопоточная индексация
Стачка! 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`
• отдельные конфиги для индексатора и поиска
• на каждый фильтр свой атрибут (MVA медленно)
• дисковые индексы хранятся в RAM (tmpfs)
• query_log только при необходимости
• dict = keywords - быстрее поиск, нет коллизий
• настройки под характеристики железа (через
тесты)
Стачка! 2012, Ульяновск
поиск / настройки
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
• lazy initialization
• используем кеш
• по возможности используем multi-query
• вычисляем оптимальный max_matches
= offset + limit
• сортируем результаты в обратном порядке,
если offset > total_matches / 2
• фильтрация по селективным атрибутам
Стачка! 2012, Ульяновск
поиск / клиенты
Стачка! 2012, Ульяновск
поиск / поиск похожих
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, Ульяновск
поиск / поиск похожих
Стачка! 2012, Ульяновск
backoffice
CENSORED
Стачка! 2012, Ульяновск
backoffice / цифры
• 70M документов в индексе
• 25GB размер индексов
• 70GB данных для индексации
• 16 серверов (1 сервер = 1 нода + pool)
• Ежеминутная индексация
• Раз в час мерж дельты
Стачка! 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
Стачка! 2012, Ульяновск
backoffice / реализация
+ основной индекс + дельта
+ MVA для поиска по параметрам (здесь можно)
+ 3 уровня - ноды/группа/pool
- дельта по last_update_txtime с нахлестом
- медленная полная переиндексация :(
Стачка! 2012, Ульяновск
Стачка! 2012, Ульяновск
cпасибо! вопросы?
Роман Павлушкоrpavlushko@avito.ru
twitter.com/pavlushko
slideshare.net/pavlushko/
Recommended