Upload
kuchinskaya
View
455
Download
4
Embed Size (px)
Citation preview
Tarantool 1.5:
хранение данных на диске
Konstantin Osipov,
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:
хранение данных на диске