Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Как мы сбежали от PostgreSQL или когда реляционная БД не справляется

Как мы сбежали от PostgreSQL или когда реляционная БД не справляется

Доклад на Конференцию "Стачка"
Большое количество данных - это здорово. Сложная бизнес логика - интересно. Работает быстро - прекрасно! Выкинешь какой-нибудь пункт - идеально. Расскажу о том, что случилось, как решали проблемы и к чему, в итоге, пришли.

Andrew Kumanyaev

April 11, 2015
Tweet

More Decks by Andrew Kumanyaev

Other Decks in Programming

Transcript

  1. 4

  2. 5

  3. 6

  4. — N миллионов записей — Взять из них 10 записей

    — Подготовить JSON — Отправить пользователю 7
  5. + 8

  6. — Большой JSON ~140 Kb — Нетривиальная выборка — Записи

    обновляются часто — Tree — Нет старого контента 9
  7. 10

  8. 12 0 175 350 525 700 1 10 20 40

    50 100 200 300 500 700 1000 t, ms follows
  9. 13

  10. 14

  11. 15

  12. 16

  13. 17

  14. SELECT * FROM coubs LIMIT 10; SELECT * FROM coubs

    LIMIT 10 OFFSET 10; INSERT INTO coubs ........; SELECT * FROM coubs LIMIT 10 OFFSET 20; 18
  15. SELECT * FROM coubs LIMIT 10; SELECT * FROM coubs

    LIMIT 10 OFFSET 10; DELETE FROM coubs WHERE ........; SELECT * FROM coubs LIMIT 10 OFFSET 20; 19
  16. SELECT * FROM coubs LIMIT 10; SELECT * FROM coubs

    LIMIT 10 OFFSET 10; UPDATE coubs ........; SELECT * FROM coubs LIMIT 10 OFFSET 20; 20
  17. — Большой JSON ~140 Kb — Нетривиальная выборка — Записи

    обновляются часто — Tree — Нет старого контента 21
  18. — Большой JSON ~140 Kb — Нетривиальная выборка — Записи

    обновляются часто — Tree — Нет старого контента 22
  19. SELECT * FROM coubs ORDER BY key LIMIT 10; SELECT

    * FROM coubs WHERE key < ... ORDER BY key LIMIT 10; INSERT INTO coubs ……..; SELECT * FROM coubs WHERE key < ... ORDER BY key LIMIT 10; 23
  20. SELECT * FROM coubs ORDER BY key DESC LIMIT 10;

    SELECT * FROM coubs WHERE key < ... ORDER BY key DESC LIMIT 10; DELETE FROM coubs WHERE ...; SELECT * FROM coubs WHERE key < ... ORDER BY key DESC LIMIT 10; 24
  21. — Нужно хотя бы 1 раз сгенерировать — Нужно где-то

    хранить — Нужно как-то актуализировать 26
  22. — Нужно хотя бы 1 раз сгенерировать — Нужно где-то

    хранить — Нужно как-то актуализировать 27
  23. Page 1: делаем копию доступных данных Page 2: работаем с

    данными из копии Page 3: работаем с данными из копии 28
  24. — Нужно хотя бы 1 раз сгенерировать — Нужно где-то

    хранить — Нужно как-то актуализировать 29
  25. 30

  26. — Нужно хотя бы 1 раз сгенерировать — Нужно где-то

    хранить — Нужно как-то актуализировать 32
  27. Page 1: делаем копию доступных данных Page 1: добавляем новые

    записи Page 2: работаем с данными из копии 33
  28. 36 — Берем все кобы, которые попадают в подписки —

    Среди этих кобов ищем дублирующиеся рекобы — Выкидываем их, оставляем только первые — Выкидываем все то, что не должно быть видно ÁБÛЫËЛÎО ÊКÀАÊК-ÒТÎО ÒТÀАÊК
  29. 38

  30. 40

  31. 43

  32. 44

  33. 47

  34. FRONTEND SERVERS DATABASE SERVERS TIMELINE SERVER BACKEND SERVERS 1 2

    3 4 5 6 0.02-2ms 1.5——-–2ms ~200-500ms 50
  35. FRONTEND SERVERS DATABASE SERVERS TIMELINE SERVER BACKEND SERVERS 1 2

    3 2 3 4 äдîо 5 ìмèи… 0.05 - 5ms 51 4 5
  36. 52 api workers workers hot data fetch worker data refresh

    worker update worker immediate workers workers
  37. 53 hash table record user_id integer coub_ids list tech_data integer/binary

    hash table record user_id integer coubs record tech_data integer/binary hot data data