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

55

Upload: coub

Post on 19-Jul-2015

53 views

Category:

Engineering


3 download

TRANSCRIPT

2

@zzetorg

ÏПËЛÀАÒТÔФÎОÐРÌМÀА ÄДËЛßЯ ÑСÎОÇЗÄДÀАÍНÈИßЯ ÈИ ÏПÐРÎОÑСÌМÎОÒТÐРÀА ÊКÎОÐРÎОÒТÊКÈИÕХ ÇЗÀАÖЦÈИÊКËЛÅЕÍНÍНÛЫÕХ ÂВÈИÄДÅЕÎО ÄДÎО

10 ÑСÅЕÊКÓУÍНÄД ÄДËЛÈИÍНÍНÎОÉЙ

3

4

5

6

— N миллионов записей— Взять из них 10 записей— Подготовить JSON— Отправить пользователю

7

+

8

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

9

10

11

Erotica Banned Private Friends only Copyright Subscription … etc.

12

0

175

350

525

700

1 10 20 40 50 100 200 300 500 700 1000

t, ms

follows

13

14

15

16

17

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

18

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

19

SELECT * FROM coubs LIMIT 10;SELECT * FROM coubs LIMIT 10 OFFSET 10;UPDATE coubs ........;SELECT * FROM coubs LIMIT 10 OFFSET 20;

20

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

21

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

22

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

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

SNAPSHOT (CACHE)

25

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

26

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

27

Page 1: делаем копию доступных данныхPage 2: работаем с данными из копииPage 3: работаем с данными из копии

28

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

29

30

Page 1: делаем копию доступных данныхPage 2: работаем с данными из копии

31

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

32

Page 1: делаем копию доступных данных

Page 1: добавляем новые записиPage 2: работаем с данными из копии

33

Генерация первого набора - долгоДостройка кеша - долго*

* при редких посещениях34

ÎОÏПÒТÈИÌМÈИÇЗÈИÐРÓУÉЙ SQL

35

36

— Берем все кобы, которые попадают в подписки — Среди этих кобов ищем дублирующиеся рекобы — Выкидываем их, оставляем только первые — Выкидываем все то, что не должно быть видно

ÁБÛЫËЛÎО ÊКÀАÊК-ÒТÎО ÒТÀАÊК

40 000

600

Несколько запросов

1 запросms

37

ms

38

39

502

40

×ЧÒТÎО ÄДÀАËЛÜЬØШÅЕ?

41

ÏПÎОËЛÓУ×ЧÅЕÍНÈИÅЕ ÄДÀАÍНÍНÛЫÕХ

ÏПÀАÐРÀАËЛËЛÅЕËЛÜЬÍНÎО

42

43

44

45

ÎОÒТÄДÅЕËЛÜЬÍНÛЫÉЙ ÑСÅЕÐРÂВÈИÑС

46

Write:

— New coub / recoub — Follow

Read:

— Page + PerPage = [ids]

47

48

ÏПÎО×ЧÅЕÌМÓУ ERLANG?

HOW IT WORKS

49

FRONTEND SERVERS

DATABASE SERVERS TIMELINE SERVER

BACKEND SERVERS

1

2 34 5

6

0.02-2ms1.5——-–2ms

~200-500ms

50

FRONTEND SERVERS

DATABASE SERVERS TIMELINE SERVER

BACKEND SERVERS

1

2 32 3

4

äдîо 5 ìмèи…

0.05 - 5ms

51

4

5

52

api workers

workershot data

fetch worker

data

refresh worker

update worker

immediate workers

workers

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

ÏПÎО×ЧÅЕÌМÓУ ÂВÑСÅЕ ÒТÀАÊК ÏПÎОËЛÓУ×ЧÈИËЛÎОÑСÜЬ?

54

@zzetorg