39
Tarantool 1.5: хранение данных на диске Konstantin Osipov, [email protected] April 09th, 2013 http://techforum.mail.ru

Osipov

Embed Size (px)

Citation preview

Page 1: Osipov

Tarantool 1.5:

хранение данных на диске

Konstantin Osipov,

[email protected]

April 09th, 2013

http://techforum.mail.ru

Page 2: Osipov

Прейскурант

● Новые возможности Tarantool 1.4.9 - 62

р.

● Алгоритмы хранения данных на диске - 165 р.

● Log-structured merge trees в Tarantool - 200 р.

● Компот из сухофруктов

- 20 р.

Page 3: Osipov

ДЕЙСТВИЕ ПЕРВОЕ, Явление I

Новые возможности 1.4.9:

● 90% ускорение TREE индексов

● BITSET index

● Lua box.socket API

● on_connect/on_disconnect triggers

● См. https://launchpad.net/tarantool/1.4/1.4.9

Page 4: Osipov

BITSET index: применение

● вычисление логических выражений

● b1 & !b2 || b3 & b4

● наиболее компактный индекс по разреженным данным (1

bit per value vs 16 bytes in TREE)

● поиск по интересам, рекомендательные сети, tag clouds

Page 5: Osipov

BITSET index: крупный план

1

0

1

0

1

0

1

0

1

0

1

0

0

1

0

1

1

1

0

1

1

0

1

0

1

0

0

0

0

0

1

0

0

0

1

0

1

1

1

0

b0 b1 b2 b3

key={20}

{…, 31, …}

key bits

1

0

0

1

1

0

0

0

1

1

b4 tuples

{…, 0, …}

{…, 20, …}

{…, 23, …}

{…, 8, …}

{…, 10, …}

{…, 19, …}

{…, 9, …}

{…, 26, …}

{…, 9, …}

value

b0 — параметр b1 — параметр b2 — параметр b3 — параметр

23 = 0b10100

Page 6: Osipov

Lua box.socket API

● LuaSocket совместимое API

● box.socket.udp(), box.socket.tcp()

● socket:recv(), send(), readline(), recvfrom(), sendto()

● cерверные сокеты: socket:bind(), socket:listen()

● встроенный асинхронный DNS resolver

● → zero-conf, proactive monitoring via UDP

● → node.js для Lua, но без callbackов!

Page 7: Osipov

Lua box.socket example

s = box.socket.tcp()

s:connect('google.com', 80)

s:send("GET / HTTP/1.0\r\n\r\n")

hdr = s:readline({ "\r\n\r\n", "\n\n"})

body = s:recv(parse_header(hdr).content_length)

Page 8: Osipov

Lua box.socket: выход на бис

● box.net.box: работа с удалёнными Tarantool/Box

● box.net.mysql, box.net.pg – доступ к MySQL и PostgreSQL

из хранимых процедур

● → single-round-trip database proxy and cache

Page 9: Osipov

Антракт

Page 10: Osipov

ДЕЙСТВИЕ ПЕРВОЕ, Явление II

Diskstore

•B-tree – most popular disk-based data structure •B-tree balances INSERT, UPDATE and SELECT speed •DELETEs can be slow

Page 11: Osipov

СУБД быстрая, настраивать надо уметь

Page 12: Osipov

B-tree: внутреннее устройство

Page 13: Osipov

LSM-tree: внутреннее устройство

Page 14: Osipov

LSM-tree: внутреннее устройство

Page 15: Osipov

LSM example: LevelDB

Page 16: Osipov

Diskstore: крупный план

● отдельный тип хранения данных, по аналогии с MySQL

storage engine

● 0% performance overhead if not used

● .engine = MEMORY, .engine = LSM

● key/value only (no secondary keys yet)

● оптимально для 50/50 READ-WRITE workload

Page 17: Osipov

WAL:

Memory

Disk

Self-Balancing Tree PUT(37), PUT(16)

Page 18: Osipov

16 37

WAL: 37, 16

Memory

Disk

Self-Balancing Tree

Page 19: Osipov

7 41

WAL: 41, 7, 37, 16

Memory

Disk 16 37

Self-Balancing Tree

Sorted String Table

Page 20: Osipov

WAL: 41, 7, 28, 16

Memory

Disk

7 16 37 41

7 37

Page 21: Osipov

10 28

WAL: 10, 28, 41, 7, 37, 16

Memory

Disk

7 16 37 41

7 37

Page 22: Osipov

WAL: 10, 28, 41, 7, 37, 16

Memory

Disk

7 16 37 41

10 28

Page 23: Osipov

2 47

WAL: 47, 2, 10, 28, 41, 7, 37, 16

Memory

Disk

7 16 37 41

10 28

Page 24: Osipov

WAL: 47, 2, 10, 28, 41, 7, 37, 16

Memory

Disk

2 7 10 16 28 37 41 47

2 10 28 41

2 28

Page 25: Osipov

6 49

WAL: 49, 6, 47, 2, 10, 28, 41, 7, 37, 16

Memory

Disk

2 7 10 16 28 37 41 47

2 10 28 41

2 28

Page 26: Osipov

WAL: 49, 6, 47, 2, 10, 28, 41, 7, 37, 16

Memory

Disk

2 7 10 16 28 37 41 47

2 10 28 41

6 49

Page 27: Osipov

23 32

WAL: 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16

Memory

Disk

2 7 10 16 28 37 41 47

2 10 28 41

6 49

Page 28: Osipov

WAL: 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16

Memory

Disk

2 7 10 16 28 37 41 47

6 23 32 49

6 32

Page 29: Osipov

30 45

WAL: 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16

Memory

Disk

2 7 10 16 28 37 41 47

6 23 32 49

6 32

Page 30: Osipov

14 38

WAL: 38, 14, 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16

Memory

Disk

2 7 10 16 28 37 41 47

6 23 32 49

30 45

Page 31: Osipov

6 10

WAL: 10, 6, 38, 14, 45, 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16

Memory

Disk

2 6 7 10 14 16 23 28 30 32 37 38 41 45 47 49

2 7 14 23 30 37 41 47

2 14 30 41

2 30

Page 32: Osipov

WAL: 37, 22, 36, 10, 25, 42, 10, 6, 38, 14, 45, 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16

Memory

Disk

2 6 7 10 14 16 23 28 30 32 37 38 41 45 47 49

3 8 15 26 35 40 45 48

10 25 36 42

22 37

Page 33: Osipov

WAL: 37, 22, 36, 10, 25, 42, 10, 6, 38, 14, 45, 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16

Memory

Disk

2 6 7 10 14 16 23 28 30 32 37 38 41 45 47 49

3 8 15 26 35 40 45 48

10 25 36 42

22 37

GET(16)

Page 34: Osipov

WAL: 37, 22, 36, 10, 25, 42, 10, 6, 38, 14, 45, 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16

Memory

Disk

2 6 7 10 14 16 23 28 30 32 37 38 41 45 47 49

3 8 15 26 35 40 45 48

10 25 36 42

22 37

GET(16)

Page 35: Osipov

LSM-tree: применение

● Данные с разной степенью актуальности

– Ленты сообщений

– Стена в соцсети

– Чаты

– События

● Сегрегация данных

– Данные в LSM space, индекс в MEMORY space

Page 36: Osipov

Эпилог

● Tarantool/Box - *fast* in-memory database

● Идеального способа хранения данных на диске не

существует

● Плохих способов реализовано предостаточно

● LSM-деревья оптимальны для часто меняющихся данных

● in-memory + disk-store в одном продукте = возможность

тонко подстроиться под нужды конкретной задачи

Page 37: Osipov

?

Page 38: Osipov

Действующие лица

Dmitry Simonenko – клиенты, библиотеки Lua, билды

● Dmitry E. Oboukhov, – Perl monger, главный тролль

● Roman Tsisyk, – алгоритмы,

● Konstantin Osipov – продавец-кассир

● … а также актёры ведущих московских театров

Page 39: Osipov

Tarantool 1.5:

хранение данных на диске