SlideShare a Scribd company logo
1 of 46
Производительный
   специализированный поиск:
архитектура, область применимости

     Илья Шаповалов, «Мамба»
Проблема
• Много анкет
Проблема
• Много анкет
• Много запросов – ещё и блоки
Проблема
• Много анкет
• Много запросов – ещё и блоки
• Часто обновляются
Проблема
•   Много анкет
•   Много запросов – ещё и блоки
•   Часто обновляются
•   Сортировка
Проблема
•   Много анкет
•   Много запросов – ещё и блоки
•   Часто обновляются
•   Сортировка
•   Много полей
Проблема
•   Много анкет
•   Много запросов – ещё и блоки
•   Часто обновляются
•   Сортировка
•   Много полей
•   Сложные стандартные запросы
Проблема
•   Много анкет
•   Много запросов – ещё и блоки
•   Часто обновляются
•   Сортировка
•   Много полей
•   Сложные стандартные запросы

    а запросы расширенного поиска ещё сложнее!
Но всё ещё хуже!
• Моё место в поиске
Но всё ещё хуже!
• Моё место в поиске
• Всего найдено
Но всё ещё хуже!
• Моё место в поиске
• Всего найдено
• Нельзя взять и изолировать поиск. Нужна
  интеграция.
MySQL?




Так ты ищешь фулсканом?
MySQL?
• Индексы? как их строить?

(возраст)
(пол,возраст)
(цель,пол,возраст)
(цель,возраст)
???
                             Так у тебя фулскан?
Sphinx?
• Тестовая база, 2М анкет
• Поля индексировались как sql_attr_uint
• Индекс весь в памяти
Sphinx?
•   Тестовая база, 2М анкет
•   Поля индексировались как sql_attr_uint
•   Индекс весь в памяти
•   100-120 мс на запрос
Sphinx?
• У нас на той же базе от 0.2 до 1.1 мс
НАШ ДЕМОН ПОИСКА
Архитектура самого поиска
                         запрос на поиск /
wwwX                     получение анкет            сёрчер сёрчер
                                                    (слейв) (слейв)

        обновление
           анкет


                mysql

                     анкеты, реги
                         оны              сёрчер
                                         (мастер)
Пример запроса
find_by_oid({'language_id'=>2,'oids'=>[173963232,173959954 …]})

find({"age_from":51, "age_to":55, "limit":2, "calculate_total":"accurate"})

find({"yes":{"drink":["Yes","Sometimes"]},"limit":2,"calculate_total":"accur
    ate"})
Пример запроса и ответа
 find_by_oid({'language_id'=>2,'oids'=>[173963232,173959954 …]})
 find({"age_from":51, "age_to":55, "limit":2, "calculate_total":"accurate"})
 find({"yes":{"drink":["Yes","Sometimes"]},"limit":2,"calculate_total":"accurate"})


array (                                     'name' => ‘Ivan',            'photo_id' => 173962495,
 'generation_id' =>                         'login' => 'xzm',            'photo_updated' =>
1317049524,                                 'country_id' => 3159,    1311597462,
 'total' => 1,                              'region_id' => 4312,         'photo_count' => 1,
 'items' => array ( 0 => array (            'city_id' => 4400,           'video_count' => 0,
     'oid' => 173732021,                    'metro_id' => 0,             'photo_adult_count' => 0,
     'disabled' => false,                   'country_name' =>            'theme_id' => 123,
     'gender' => 'M',                   'Россия',                        'mailru_id' => 0,
     'lookfor' => array (‘F', 'M‘),         'region_name' => 'Москва     'package_id' => 122880,
     'deleted' => false,                и Московская обл.',              'lastaccess' => 'web',
     'user_id' => 173732021,                'city_name' => 'Москва',     'leader_num_bets' =>
     'self_age' => 28,                      'metro_name' => '',      494,
     'age' => array ('16-20','21-           'changed' => 1310038953,     'leader_time' => 347496,
25','26-30','31-35','36-40'),               'created' => 1270111211,   )))
JSON RPC 2.0
•   асинхронный
•   человекочитаемый
•   для любых языков и платформ
•   годится и для client-server, и для обмена
    между сервисами

 {"jsonrpc": "2.0", "method": "
find_by_oid", "params":
{"oids":[173963232]}, "id": 1}
 {"jsonrpc": "2.0", "result": 19, "id": 1}
Архитектура связанных демонов
                                 запрос на поиск /
wwwX                             получение анкет                сёрчер сёрчер
                                                                (слейв) (слейв)

                обновление
                   анкет


                        mysql

                             анкеты, реги
                                 оны                  сёрчер
                                                     (мастер)                     попутчики
       ставки     активность                                                      / банерка




  лидеры
                                        Демон онлайн-
                                        пользователей
ИНДЕКС И ПОИСК ПО НЕМУ
Блоки анкет
• %xmmN регистры
• 128 бит каждый

• анкеты разбиваются на блоки
• по 512 анкет в 1 блоке
Побитовое хранение блока
• 1ый бит 1го поля всех анкет 1го блока
  (итого 512 бит = 64 байта)
• 2ой бит 1го поля всех анкет 1го блока ...
• потом - 2ое поле всех анкет 1го блока
• последнее поле

• А потом – следующий блок.
Пример индекса (1)
вкл         1   1   1   1   1   ..   1
пол         1   1   0   0   0   ..   0
возр>=18    1   1   1   1   1   ..   1
возр>=19    1   1   0   1   1   ..   1
возр>=20    0   1   0   1   1   ..   1
возр>=21    0   0   0   0   1   ..   1
возр>=22    0   0   0   0   1   ..   0

anketa_id   23 17 8 45 2 .. 7
Типы полей
Тип данных                 размер операции
• Enum, компактно          Ln(N)    m*Ln(N)
  enum {a=00, b=01, c=10, d=11}
• Int и Bool – частные случаи enum/compact
Типы полей
Тип данных                 размер операции
• Enum, компактно          Ln(N)    m*Ln(N)
  enum {a=00, b=01, c=10, d=11}
• Int и Bool – частные случаи enum/compact
• Enum/Set, некомпактно    N        m
  enum {a=0001, b=0010, c=0100, d=1000}
Типы полей
Тип данных                 размер операции
• Enum, компактно          Ln(N)    m*Ln(N)
  enum {a=00, b=01, c=10, d=11}
• Int и Bool – частные случаи enum/compact
• Enum/Set, некомпактно    N        m
  enum {a=0001, b=0010, c=0100, d=1000}
• Range                    N        2
 [18..25]
 {10000000, 11000000, 11100000, 11110000, 1111100
 0, 11111100, 11111110, 11111111}
Пример индекса (2)
вкл             1     1     1    1     1     ..    1
пол             1     1     0    0     0     ..    0
возр>=18        1     1     1    1     1     ..    1
возр>=19        1     1     0    1     1     ..    1
возр>=20        0     1     0    1     1     ..    1
возр>=21        0     0     0    0     1     ..    1
возр>=22        0     0     0    0     1     ..    0


     1 1 1 0 1 0 - активная анкета, мальчик, 20 лет
     {name: "Vasya", age: 20, sex: "male", active: true...}
Пример запроса
• ищу: "девочки в возрасте 19-21"

 x>=19; x<22  возр>=19, !(возр>=22)

 вкл && !пол && (возр>=19) && !(возр>=22)

• также возможен запрос вида:
  вкл && !пол && (цель1 || цель3 || цель4)
Пример поиска (1)
вкл         1   1   1   1   1   ..   1
                                       mov вкл, %xmm0
пол         1   1   0   0   0   ..   0
возр>=18    1   1   1   1   1   ..   1
возр>=19    1   1   0   1   1   ..   1
возр>=20    0   1   0   1   1   ..   1
возр>=21    0   0   0   0   1   ..   1
возр>=22    0   0   0   0   1   ..   0

результат   1 1 1 1 1 .. 1


вкл && !пол && возр19 && !возр22
Пример поиска (2)
вкл         1   1   1   1   1   ..   1
                                       mov вкл, %xmm0
пол         1   1   0   0   0   ..   0
                                       mov пол,%xmm4
возр>=18    1   1   1   1   1   ..   1
                                       andnps %xmm0, %xmm4
возр>=19    1   1   0   1   1   ..   1
возр>=20    0   1   0   1   1   ..   1
возр>=21    0   0   0   0   1   ..   1
возр>=22    0   0   0   0   1   ..   0

результат   0 0 1 1 1 .. 1


вкл && !пол && возр19 && !возр22
Пример поиска (3)
вкл         1   1   1   1   1   ..   1
                                         mov вкл, %xmm0
пол         1   1   0   0   0   ..   0
                                         mov пол,%xmm4
возр>=18    1   1   1   1   1   ..   1
                                         andnps %xmm0, %xmm4
возр>=19    1   1   0   1   1   ..   1
                                         andps возр19, %xmm4
возр>=20    0   1   0   1   1   ..   1
возр>=21    0   0   0   0   1   ..   1
возр>=22    0   0   0   0   1   ..   0

результат   0 0 0 1 1 .. 1


вкл && !пол && возр19 && !возр22
Пример поиска (4)
вкл         1   1   1   1   1   ..   1
                                         mov вкл, %xmm0
пол         1   1   0   0   0   ..   0
                                         mov пол,%xmm4
возр>=18    1   1   1   1   1   ..   1
                                         andnps %xmm0, %xmm4
возр>=19    1   1   0   1   1   ..   1
                                         andps возр19, %xmm4
возр>=20    0   1   0   1   1   ..   1
                                         mov возр22, %xmm0
возр>=21    0   0   0   0   1   ..   1
                                         andnps %xmm4, %xmm0
возр>=22    0   0   0   0   1   ..   0

результат   0 0 0 1 0 .. 1                2 анкеты

вкл && !пол && возр19 && !возр22
Процесс поиска

 Json-запрос


 внутреннее
представление


исполняемый        offset, limit, ре
    код                зультат
Все поля
struct fields : field_list<
anketa_id, disabled, intim, gender, gender_in_search, lookfor, t
ype, vip, deleted, user_id, self_age, age, name, login, country_id
, region_id, city_id, metro_id, country_name, region_name, city
_name, metro_name, location, sign, orientation, target, constitu
tion, hairshead, marital, circumstance, children, sponsor, smoke
, drink, changed, created, photo_id, photo_updated, photo_cou
nt, video_count, photo_adult_count, theme_id, mailru_id, packa
ge_id, leader_num_bets, leader_time, languages1, languages2,
birthdate, photo_small_face, photo_adult, user_prefix_id, i_am_
pair, photo, intim_photo, carnal, video, maketop, online_period,

weight, height, auto_brand_id, auto_model_id, religion_id, reli
gion_level, religion_partner … >::type {};
Описание полей
struct field_lookfor :
  fieldlist::opt_bitmap,
  fieldlist::opt_json_base,
  fieldlist::opt_result,
  fieldlist::opt_db,
  fieldlist::opt_backup
{
  …
Генерация кода
add_code("x41x0fx28xc0" "x41x0fx28xc9"
  "x41x0fx28xd2" "x41x0fx28xdb" ) //
  movaps xmmL2 -> xmmL


generate_add_code("movaps %xmm4,%xmm0");
generate_add_code("movaps %xmm5,%xmm1");
generate_add_code("movaps %xmm6,%xmm2");
generate_add_code("movaps %xmm7,%xmm3");
Все индексы
1. все анкеты, все поля
2. Россия-М, поля простого поиска
3. Россия-Ж, поля простого поиска
4. ВИП, поля простого поиска
5. онлайны, все поля
6. созданные недавно, все поля
Операции
•   поиск
•   получение по id
•   получение места анкеты в поиске
•   и репликация
Нагрузка
find: 2400 rps; get_place: 3000 rps; find_by_oid: 3500 rps
Время отклика (find)
Avg = 3.3ms
t(50%) < 1.7 ms
t(80%) < 4.2 ms
t(95%) < 14 ms
t(99%) < 28 ms




https://github.com/mambaru/btp-daemon - отличная статистика!
Надёжность
•   failover на стороне приложения
•   что если падает мастер?
•   что если падает слейв?
•   что если падает база?
Особенности реализации
•   асинхронно, многопоточно
•   C++11
•   много шаблонов и списков типов
•   виртуальных функций почти нет
•   множественное наследование, но
    основном от пустых родителей
Вопросы?




Илья Шаповалов
shepik@yandex.ru

More Related Content

What's hot

I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
ITmozg
 
Обработка сложных POST/PATCH запросов в RESTful API
Обработка сложных POST/PATCH запросов в RESTful APIОбработка сложных POST/PATCH запросов в RESTful API
Обработка сложных POST/PATCH запросов в RESTful API
fightmaster
 
основы Java для_any_logic
основы Java для_any_logicосновы Java для_any_logic
основы Java для_any_logic
KVPw
 

What's hot (9)

I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
Javascript
JavascriptJavascript
Javascript
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
 
Обработка сложных POST/PATCH запросов в RESTful API
Обработка сложных POST/PATCH запросов в RESTful APIОбработка сложных POST/PATCH запросов в RESTful API
Обработка сложных POST/PATCH запросов в RESTful API
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOM
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
 
основы Java для_any_logic
основы Java для_any_logicосновы Java для_any_logic
основы Java для_any_logic
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
 
Что API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон КорзуновЧто API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон Корзунов
 

Similar to Производительный специализированный поиск: архитектура, область применимости (Илья Шаповалов)

BigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: PersonalizationBigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: Personalization
Anton Gorokhov
 
Project Robotester
Project RobotesterProject Robotester
Project Robotester
bromozel
 
Ускорение сайта на стороне клиента
Ускорение сайта на стороне клиентаУскорение сайта на стороне клиента
Ускорение сайта на стороне клиента
yulia_k
 
Сергей Горобцов: Идеологии разработки веб интерфейсов, адаптивность, Accessib...
Сергей Горобцов: Идеологии разработки веб интерфейсов, адаптивность, Accessib...Сергей Горобцов: Идеологии разработки веб интерфейсов, адаптивность, Accessib...
Сергей Горобцов: Идеологии разработки веб интерфейсов, адаптивность, Accessib...
Yandex
 
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
Омские ИТ-субботники
 
0. основы r
0. основы r0. основы r
0. основы r
msuteam
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на Ruby
Alexey Nayden
 
Методы поиска уязвимостей в программах
Методы поиска уязвимостей в программахМетоды поиска уязвимостей в программах
Методы поиска уязвимостей в программах
Vasiliy Shapovalov
 

Similar to Производительный специализированный поиск: архитектура, область применимости (Илья Шаповалов) (20)

Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
 
BigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: PersonalizationBigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: Personalization
 
Vba 04
Vba 04Vba 04
Vba 04
 
Haskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageHaskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell language
 
Haskell
HaskellHaskell
Haskell
 
2014.10.15 блиц-доклад PostgreSQL kNN search
2014.10.15 блиц-доклад PostgreSQL kNN search2014.10.15 блиц-доклад PostgreSQL kNN search
2014.10.15 блиц-доклад PostgreSQL kNN search
 
Project Robotester
Project RobotesterProject Robotester
Project Robotester
 
Ускорение сайта на стороне клиента
Ускорение сайта на стороне клиентаУскорение сайта на стороне клиента
Ускорение сайта на стороне клиента
 
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
 
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Ускорение client-side для мобильных устройств. Failoverconf 2014
Ускорение client-side для мобильных устройств. Failoverconf 2014Ускорение client-side для мобильных устройств. Failoverconf 2014
Ускорение client-side для мобильных устройств. Failoverconf 2014
 
20131105 романенко
20131105 романенко20131105 романенко
20131105 романенко
 
Сергей Горобцов: Идеологии разработки веб интерфейсов, адаптивность, Accessib...
Сергей Горобцов: Идеологии разработки веб интерфейсов, адаптивность, Accessib...Сергей Горобцов: Идеологии разработки веб интерфейсов, адаптивность, Accessib...
Сергей Горобцов: Идеологии разработки веб интерфейсов, адаптивность, Accessib...
 
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
 
0. основы r
0. основы r0. основы r
0. основы r
 
Ускорение сайта на стороне клиента
Ускорение сайта на стороне клиентаУскорение сайта на стороне клиента
Ускорение сайта на стороне клиента
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на Ruby
 
Методы поиска уязвимостей
Методы поиска уязвимостейМетоды поиска уязвимостей
Методы поиска уязвимостей
 
Методы поиска уязвимостей в программах
Методы поиска уязвимостей в программахМетоды поиска уязвимостей в программах
Методы поиска уязвимостей в программах
 

More from Ontico

Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 

More from Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Производительный специализированный поиск: архитектура, область применимости (Илья Шаповалов)

  • 1. Производительный специализированный поиск: архитектура, область применимости Илья Шаповалов, «Мамба»
  • 3. Проблема • Много анкет • Много запросов – ещё и блоки
  • 4. Проблема • Много анкет • Много запросов – ещё и блоки • Часто обновляются
  • 5. Проблема • Много анкет • Много запросов – ещё и блоки • Часто обновляются • Сортировка
  • 6. Проблема • Много анкет • Много запросов – ещё и блоки • Часто обновляются • Сортировка • Много полей
  • 7. Проблема • Много анкет • Много запросов – ещё и блоки • Часто обновляются • Сортировка • Много полей • Сложные стандартные запросы
  • 8. Проблема • Много анкет • Много запросов – ещё и блоки • Часто обновляются • Сортировка • Много полей • Сложные стандартные запросы а запросы расширенного поиска ещё сложнее!
  • 9. Но всё ещё хуже! • Моё место в поиске
  • 10. Но всё ещё хуже! • Моё место в поиске • Всего найдено
  • 11. Но всё ещё хуже! • Моё место в поиске • Всего найдено • Нельзя взять и изолировать поиск. Нужна интеграция.
  • 12. MySQL? Так ты ищешь фулсканом?
  • 13. MySQL? • Индексы? как их строить? (возраст) (пол,возраст) (цель,пол,возраст) (цель,возраст) ??? Так у тебя фулскан?
  • 14. Sphinx? • Тестовая база, 2М анкет • Поля индексировались как sql_attr_uint • Индекс весь в памяти
  • 15. Sphinx? • Тестовая база, 2М анкет • Поля индексировались как sql_attr_uint • Индекс весь в памяти • 100-120 мс на запрос
  • 16. Sphinx? • У нас на той же базе от 0.2 до 1.1 мс
  • 18. Архитектура самого поиска запрос на поиск / wwwX получение анкет сёрчер сёрчер (слейв) (слейв) обновление анкет mysql анкеты, реги оны сёрчер (мастер)
  • 19. Пример запроса find_by_oid({'language_id'=>2,'oids'=>[173963232,173959954 …]}) find({"age_from":51, "age_to":55, "limit":2, "calculate_total":"accurate"}) find({"yes":{"drink":["Yes","Sometimes"]},"limit":2,"calculate_total":"accur ate"})
  • 20. Пример запроса и ответа find_by_oid({'language_id'=>2,'oids'=>[173963232,173959954 …]}) find({"age_from":51, "age_to":55, "limit":2, "calculate_total":"accurate"}) find({"yes":{"drink":["Yes","Sometimes"]},"limit":2,"calculate_total":"accurate"}) array ( 'name' => ‘Ivan', 'photo_id' => 173962495, 'generation_id' => 'login' => 'xzm', 'photo_updated' => 1317049524, 'country_id' => 3159, 1311597462, 'total' => 1, 'region_id' => 4312, 'photo_count' => 1, 'items' => array ( 0 => array ( 'city_id' => 4400, 'video_count' => 0, 'oid' => 173732021, 'metro_id' => 0, 'photo_adult_count' => 0, 'disabled' => false, 'country_name' => 'theme_id' => 123, 'gender' => 'M', 'Россия', 'mailru_id' => 0, 'lookfor' => array (‘F', 'M‘), 'region_name' => 'Москва 'package_id' => 122880, 'deleted' => false, и Московская обл.', 'lastaccess' => 'web', 'user_id' => 173732021, 'city_name' => 'Москва', 'leader_num_bets' => 'self_age' => 28, 'metro_name' => '', 494, 'age' => array ('16-20','21- 'changed' => 1310038953, 'leader_time' => 347496, 25','26-30','31-35','36-40'), 'created' => 1270111211, )))
  • 21. JSON RPC 2.0 • асинхронный • человекочитаемый • для любых языков и платформ • годится и для client-server, и для обмена между сервисами  {"jsonrpc": "2.0", "method": " find_by_oid", "params": {"oids":[173963232]}, "id": 1}  {"jsonrpc": "2.0", "result": 19, "id": 1}
  • 22. Архитектура связанных демонов запрос на поиск / wwwX получение анкет сёрчер сёрчер (слейв) (слейв) обновление анкет mysql анкеты, реги оны сёрчер (мастер) попутчики ставки активность / банерка лидеры Демон онлайн- пользователей
  • 23. ИНДЕКС И ПОИСК ПО НЕМУ
  • 24. Блоки анкет • %xmmN регистры • 128 бит каждый • анкеты разбиваются на блоки • по 512 анкет в 1 блоке
  • 25. Побитовое хранение блока • 1ый бит 1го поля всех анкет 1го блока (итого 512 бит = 64 байта) • 2ой бит 1го поля всех анкет 1го блока ... • потом - 2ое поле всех анкет 1го блока • последнее поле • А потом – следующий блок.
  • 26. Пример индекса (1) вкл 1 1 1 1 1 .. 1 пол 1 1 0 0 0 .. 0 возр>=18 1 1 1 1 1 .. 1 возр>=19 1 1 0 1 1 .. 1 возр>=20 0 1 0 1 1 .. 1 возр>=21 0 0 0 0 1 .. 1 возр>=22 0 0 0 0 1 .. 0 anketa_id 23 17 8 45 2 .. 7
  • 27. Типы полей Тип данных размер операции • Enum, компактно Ln(N) m*Ln(N) enum {a=00, b=01, c=10, d=11} • Int и Bool – частные случаи enum/compact
  • 28. Типы полей Тип данных размер операции • Enum, компактно Ln(N) m*Ln(N) enum {a=00, b=01, c=10, d=11} • Int и Bool – частные случаи enum/compact • Enum/Set, некомпактно N m enum {a=0001, b=0010, c=0100, d=1000}
  • 29. Типы полей Тип данных размер операции • Enum, компактно Ln(N) m*Ln(N) enum {a=00, b=01, c=10, d=11} • Int и Bool – частные случаи enum/compact • Enum/Set, некомпактно N m enum {a=0001, b=0010, c=0100, d=1000} • Range N 2 [18..25] {10000000, 11000000, 11100000, 11110000, 1111100 0, 11111100, 11111110, 11111111}
  • 30. Пример индекса (2) вкл 1 1 1 1 1 .. 1 пол 1 1 0 0 0 .. 0 возр>=18 1 1 1 1 1 .. 1 возр>=19 1 1 0 1 1 .. 1 возр>=20 0 1 0 1 1 .. 1 возр>=21 0 0 0 0 1 .. 1 возр>=22 0 0 0 0 1 .. 0 1 1 1 0 1 0 - активная анкета, мальчик, 20 лет {name: "Vasya", age: 20, sex: "male", active: true...}
  • 31. Пример запроса • ищу: "девочки в возрасте 19-21" x>=19; x<22  возр>=19, !(возр>=22) вкл && !пол && (возр>=19) && !(возр>=22) • также возможен запрос вида: вкл && !пол && (цель1 || цель3 || цель4)
  • 32. Пример поиска (1) вкл 1 1 1 1 1 .. 1 mov вкл, %xmm0 пол 1 1 0 0 0 .. 0 возр>=18 1 1 1 1 1 .. 1 возр>=19 1 1 0 1 1 .. 1 возр>=20 0 1 0 1 1 .. 1 возр>=21 0 0 0 0 1 .. 1 возр>=22 0 0 0 0 1 .. 0 результат 1 1 1 1 1 .. 1 вкл && !пол && возр19 && !возр22
  • 33. Пример поиска (2) вкл 1 1 1 1 1 .. 1 mov вкл, %xmm0 пол 1 1 0 0 0 .. 0 mov пол,%xmm4 возр>=18 1 1 1 1 1 .. 1 andnps %xmm0, %xmm4 возр>=19 1 1 0 1 1 .. 1 возр>=20 0 1 0 1 1 .. 1 возр>=21 0 0 0 0 1 .. 1 возр>=22 0 0 0 0 1 .. 0 результат 0 0 1 1 1 .. 1 вкл && !пол && возр19 && !возр22
  • 34. Пример поиска (3) вкл 1 1 1 1 1 .. 1 mov вкл, %xmm0 пол 1 1 0 0 0 .. 0 mov пол,%xmm4 возр>=18 1 1 1 1 1 .. 1 andnps %xmm0, %xmm4 возр>=19 1 1 0 1 1 .. 1 andps возр19, %xmm4 возр>=20 0 1 0 1 1 .. 1 возр>=21 0 0 0 0 1 .. 1 возр>=22 0 0 0 0 1 .. 0 результат 0 0 0 1 1 .. 1 вкл && !пол && возр19 && !возр22
  • 35. Пример поиска (4) вкл 1 1 1 1 1 .. 1 mov вкл, %xmm0 пол 1 1 0 0 0 .. 0 mov пол,%xmm4 возр>=18 1 1 1 1 1 .. 1 andnps %xmm0, %xmm4 возр>=19 1 1 0 1 1 .. 1 andps возр19, %xmm4 возр>=20 0 1 0 1 1 .. 1 mov возр22, %xmm0 возр>=21 0 0 0 0 1 .. 1 andnps %xmm4, %xmm0 возр>=22 0 0 0 0 1 .. 0 результат 0 0 0 1 0 .. 1  2 анкеты вкл && !пол && возр19 && !возр22
  • 36. Процесс поиска Json-запрос внутреннее представление исполняемый offset, limit, ре код зультат
  • 37. Все поля struct fields : field_list< anketa_id, disabled, intim, gender, gender_in_search, lookfor, t ype, vip, deleted, user_id, self_age, age, name, login, country_id , region_id, city_id, metro_id, country_name, region_name, city _name, metro_name, location, sign, orientation, target, constitu tion, hairshead, marital, circumstance, children, sponsor, smoke , drink, changed, created, photo_id, photo_updated, photo_cou nt, video_count, photo_adult_count, theme_id, mailru_id, packa ge_id, leader_num_bets, leader_time, languages1, languages2, birthdate, photo_small_face, photo_adult, user_prefix_id, i_am_ pair, photo, intim_photo, carnal, video, maketop, online_period, weight, height, auto_brand_id, auto_model_id, religion_id, reli gion_level, religion_partner … >::type {};
  • 38. Описание полей struct field_lookfor : fieldlist::opt_bitmap, fieldlist::opt_json_base, fieldlist::opt_result, fieldlist::opt_db, fieldlist::opt_backup { …
  • 39. Генерация кода add_code("x41x0fx28xc0" "x41x0fx28xc9" "x41x0fx28xd2" "x41x0fx28xdb" ) // movaps xmmL2 -> xmmL generate_add_code("movaps %xmm4,%xmm0"); generate_add_code("movaps %xmm5,%xmm1"); generate_add_code("movaps %xmm6,%xmm2"); generate_add_code("movaps %xmm7,%xmm3");
  • 40. Все индексы 1. все анкеты, все поля 2. Россия-М, поля простого поиска 3. Россия-Ж, поля простого поиска 4. ВИП, поля простого поиска 5. онлайны, все поля 6. созданные недавно, все поля
  • 41. Операции • поиск • получение по id • получение места анкеты в поиске • и репликация
  • 42. Нагрузка find: 2400 rps; get_place: 3000 rps; find_by_oid: 3500 rps
  • 43. Время отклика (find) Avg = 3.3ms t(50%) < 1.7 ms t(80%) < 4.2 ms t(95%) < 14 ms t(99%) < 28 ms https://github.com/mambaru/btp-daemon - отличная статистика!
  • 44. Надёжность • failover на стороне приложения • что если падает мастер? • что если падает слейв? • что если падает база?
  • 45. Особенности реализации • асинхронно, многопоточно • C++11 • много шаблонов и списков типов • виртуальных функций почти нет • множественное наследование, но основном от пустых родителей