Osipov

Preview:

Citation preview

Tarantool 1.5:

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

Konstantin Osipov,

kostja@tarantool.org

April 09th, 2013

http://techforum.mail.ru

Прейскурант

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

р.

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

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

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

- 20 р.

ДЕЙСТВИЕ ПЕРВОЕ, Явление 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

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

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

● b1 & !b2 || b3 & b4

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

bit per value vs 16 bytes in TREE)

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

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

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ов!

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)

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

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

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

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

● → single-round-trip database proxy and cache

Антракт

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

Diskstore

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

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

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

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

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

LSM example: LevelDB

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

WAL:

Memory

Disk

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

16 37

WAL: 37, 16

Memory

Disk

Self-Balancing Tree

7 41

WAL: 41, 7, 37, 16

Memory

Disk 16 37

Self-Balancing Tree

Sorted String Table

WAL: 41, 7, 28, 16

Memory

Disk

7 16 37 41

7 37

10 28

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

Memory

Disk

7 16 37 41

7 37

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

Memory

Disk

7 16 37 41

10 28

2 47

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

Memory

Disk

7 16 37 41

10 28

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

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

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

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

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

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

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

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

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

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)

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)

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

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

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

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

– Чаты

– События

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

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

Эпилог

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

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

существует

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

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

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

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

?

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

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

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

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

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

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

Tarantool 1.5:

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

Recommended