Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Производительный   специализированный поиск:архитектура, область применимости     Илья Шаповалов, «Мамба»
Проблема• Много анкет
Проблема• Много анкет• Много запросов – ещё и блоки
Проблема• Много анкет• Много запросов – ещё и блоки• Часто обновляются
Проблема•   Много анкет•   Много запросов – ещё и блоки•   Часто обновляются•   Сортировка
Проблема•   Много анкет•   Много запросов – ещё и блоки•   Часто обновляются•   Сортировка•   Много полей
Проблема•   Много анкет•   Много запросов – ещё и блоки•   Часто обновляются•   Сортировка•   Много полей•   Сложные станд...
Проблема•   Много анкет•   Много запросов – ещё и блоки•   Часто обновляются•   Сортировка•   Много полей•   Сложные станд...
Но всё ещё хуже!• Моё место в поиске
Но всё ещё хуже!• Моё место в поиске• Всего найдено
Но всё ещё хуже!• Моё место в поиске• Всего найдено• Нельзя взять и изолировать поиск. Нужна  интеграция.
MySQL?Так ты ищешь фулсканом?
MySQL?• Индексы? как их строить?(возраст)(пол,возраст)(цель,пол,возраст)(цель,возраст)???                             Так ...
Sphinx?• Тестовая база, 2М анкет• Поля индексировались как sql_attr_uint• Индекс весь в памяти
Sphinx?•   Тестовая база, 2М анкет•   Поля индексировались как sql_attr_uint•   Индекс весь в памяти•   100-120 мс на запрос
Sphinx?• У нас на той же базе от 0.2 до 1.1 мс
НАШ ДЕМОН ПОИСКА
Архитектура самого поиска                         запрос на поиск /wwwX                     получение анкет            сёр...
Пример запросаfind_by_oid({language_id=>2,oids=>[173963232,173959954 …]})find({"age_from":51, "age_to":55, "limit":2, "cal...
Пример запроса и ответа find_by_oid({language_id=>2,oids=>[173963232,173959954 …]}) find({"age_from":51, "age_to":55, "lim...
JSON RPC 2.0•   асинхронный•   человекочитаемый•   для любых языков и платформ•   годится и для client-server, и для обмен...
Архитектура связанных демонов                                 запрос на поиск /wwwX                             получение ...
ИНДЕКС И ПОИСК ПО НЕМУ
Блоки анкет• %xmmN регистры• 128 бит каждый• анкеты разбиваются на блоки• по 512 анкет в 1 блоке
Побитовое хранение блока• 1ый бит 1го поля всех анкет 1го блока  (итого 512 бит = 64 байта)• 2ой бит 1го поля всех анкет 1...
Пример индекса (1)вкл         1   1   1   1   1   ..   1пол         1   1   0   0   0   ..   0возр>=18    1   1   1   1   ...
Типы полейТип данных                 размер операции• Enum, компактно          Ln(N)    m*Ln(N)  enum {a=00, b=01, c=10, d...
Типы полейТип данных                 размер операции• Enum, компактно          Ln(N)    m*Ln(N)  enum {a=00, b=01, c=10, d...
Типы полейТип данных                 размер операции• Enum, компактно          Ln(N)    m*Ln(N)  enum {a=00, b=01, c=10, d...
Пример индекса (2)вкл             1     1     1    1     1     ..    1пол             1     1     0    0     0     ..    0...
Пример запроса• ищу: "девочки в возрасте 19-21" x>=19; x<22  возр>=19, !(возр>=22) вкл && !пол && (возр>=19) && !(возр>=2...
Пример поиска (1)вкл         1   1   1   1   1   ..   1                                       mov вкл, %xmm0пол         1 ...
Пример поиска (2)вкл         1   1   1   1   1   ..   1                                       mov вкл, %xmm0пол         1 ...
Пример поиска (3)вкл         1   1   1   1   1   ..   1                                         mov вкл, %xmm0пол         ...
Пример поиска (4)вкл         1   1   1   1   1   ..   1                                         mov вкл, %xmm0пол         ...
Процесс поиска Json-запрос внутреннеепредставлениеисполняемый        offset, limit, ре    код                зультат
Все поляstruct fields : field_list<anketa_id, disabled, intim, gender, gender_in_search, lookfor, type, vip, deleted, user...
Описание полейstruct field_lookfor :  fieldlist::opt_bitmap,  fieldlist::opt_json_base,  fieldlist::opt_result,  fieldlist...
Генерация кодаadd_code("x41x0fx28xc0" "x41x0fx28xc9"  "x41x0fx28xd2" "x41x0fx28xdb" ) //  movaps xmmL2 -> xmmLgenerate_add...
Все индексы1. все анкеты, все поля2. Россия-М, поля простого поиска3. Россия-Ж, поля простого поиска4. ВИП, поля простого ...
Операции•   поиск•   получение по id•   получение места анкеты в поиске•   и репликация
Нагрузкаfind: 2400 rps; get_place: 3000 rps; find_by_oid: 3500 rps
Время отклика (find)Avg = 3.3mst(50%) < 1.7 mst(80%) < 4.2 mst(95%) < 14 mst(99%) < 28 mshttps://github.com/mambaru/btp-da...
Надёжность•   failover на стороне приложения•   что если падает мастер?•   что если падает слейв?•   что если падает база?
Особенности реализации•   асинхронно, многопоточно•   C++11•   много шаблонов и списков типов•   виртуальных функций почти...
Вопросы?Илья Шаповаловshepik@yandex.ru
Upcoming SlideShare
Loading in …5
×

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

1,612 views

Published on

  • Be the first to comment

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

  1. 1. Производительный специализированный поиск:архитектура, область применимости Илья Шаповалов, «Мамба»
  2. 2. Проблема• Много анкет
  3. 3. Проблема• Много анкет• Много запросов – ещё и блоки
  4. 4. Проблема• Много анкет• Много запросов – ещё и блоки• Часто обновляются
  5. 5. Проблема• Много анкет• Много запросов – ещё и блоки• Часто обновляются• Сортировка
  6. 6. Проблема• Много анкет• Много запросов – ещё и блоки• Часто обновляются• Сортировка• Много полей
  7. 7. Проблема• Много анкет• Много запросов – ещё и блоки• Часто обновляются• Сортировка• Много полей• Сложные стандартные запросы
  8. 8. Проблема• Много анкет• Много запросов – ещё и блоки• Часто обновляются• Сортировка• Много полей• Сложные стандартные запросы а запросы расширенного поиска ещё сложнее!
  9. 9. Но всё ещё хуже!• Моё место в поиске
  10. 10. Но всё ещё хуже!• Моё место в поиске• Всего найдено
  11. 11. Но всё ещё хуже!• Моё место в поиске• Всего найдено• Нельзя взять и изолировать поиск. Нужна интеграция.
  12. 12. MySQL?Так ты ищешь фулсканом?
  13. 13. MySQL?• Индексы? как их строить?(возраст)(пол,возраст)(цель,пол,возраст)(цель,возраст)??? Так у тебя фулскан?
  14. 14. Sphinx?• Тестовая база, 2М анкет• Поля индексировались как sql_attr_uint• Индекс весь в памяти
  15. 15. Sphinx?• Тестовая база, 2М анкет• Поля индексировались как sql_attr_uint• Индекс весь в памяти• 100-120 мс на запрос
  16. 16. Sphinx?• У нас на той же базе от 0.2 до 1.1 мс
  17. 17. НАШ ДЕМОН ПОИСКА
  18. 18. Архитектура самого поиска запрос на поиск /wwwX получение анкет сёрчер сёрчер (слейв) (слейв) обновление анкет mysql анкеты, реги оны сёрчер (мастер)
  19. 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. 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. 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. 22. Архитектура связанных демонов запрос на поиск /wwwX получение анкет сёрчер сёрчер (слейв) (слейв) обновление анкет mysql анкеты, реги оны сёрчер (мастер) попутчики ставки активность / банерка лидеры Демон онлайн- пользователей
  23. 23. ИНДЕКС И ПОИСК ПО НЕМУ
  24. 24. Блоки анкет• %xmmN регистры• 128 бит каждый• анкеты разбиваются на блоки• по 512 анкет в 1 блоке
  25. 25. Побитовое хранение блока• 1ый бит 1го поля всех анкет 1го блока (итого 512 бит = 64 байта)• 2ой бит 1го поля всех анкет 1го блока ...• потом - 2ое поле всех анкет 1го блока• последнее поле• А потом – следующий блок.
  26. 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 .. 0anketa_id 23 17 8 45 2 .. 7
  27. 27. Типы полейТип данных размер операции• Enum, компактно Ln(N) m*Ln(N) enum {a=00, b=01, c=10, d=11}• Int и Bool – частные случаи enum/compact
  28. 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. 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. 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. 31. Пример запроса• ищу: "девочки в возрасте 19-21" x>=19; x<22  возр>=19, !(возр>=22) вкл && !пол && (возр>=19) && !(возр>=22)• также возможен запрос вида: вкл && !пол && (цель1 || цель3 || цель4)
  32. 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. 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. 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. 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. 36. Процесс поиска Json-запрос внутреннеепредставлениеисполняемый offset, limit, ре код зультат
  37. 37. Все поляstruct fields : field_list<anketa_id, disabled, intim, gender, gender_in_search, lookfor, type, 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, constitution, hairshead, marital, circumstance, children, sponsor, smoke, drink, changed, created, photo_id, photo_updated, photo_count, video_count, photo_adult_count, theme_id, mailru_id, package_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, religion_level, religion_partner … >::type {};
  38. 38. Описание полейstruct field_lookfor : fieldlist::opt_bitmap, fieldlist::opt_json_base, fieldlist::opt_result, fieldlist::opt_db, fieldlist::opt_backup{ …
  39. 39. Генерация кодаadd_code("x41x0fx28xc0" "x41x0fx28xc9" "x41x0fx28xd2" "x41x0fx28xdb" ) // movaps xmmL2 -> xmmLgenerate_add_code("movaps %xmm4,%xmm0");generate_add_code("movaps %xmm5,%xmm1");generate_add_code("movaps %xmm6,%xmm2");generate_add_code("movaps %xmm7,%xmm3");
  40. 40. Все индексы1. все анкеты, все поля2. Россия-М, поля простого поиска3. Россия-Ж, поля простого поиска4. ВИП, поля простого поиска5. онлайны, все поля6. созданные недавно, все поля
  41. 41. Операции• поиск• получение по id• получение места анкеты в поиске• и репликация
  42. 42. Нагрузкаfind: 2400 rps; get_place: 3000 rps; find_by_oid: 3500 rps
  43. 43. Время отклика (find)Avg = 3.3mst(50%) < 1.7 mst(80%) < 4.2 mst(95%) < 14 mst(99%) < 28 mshttps://github.com/mambaru/btp-daemon - отличная статистика!
  44. 44. Надёжность• failover на стороне приложения• что если падает мастер?• что если падает слейв?• что если падает база?
  45. 45. Особенности реализации• асинхронно, многопоточно• C++11• много шаблонов и списков типов• виртуальных функций почти нет• множественное наследование, но основном от пустых родителей
  46. 46. Вопросы?Илья Шаповаловshepik@yandex.ru

×