SlideShare una empresa de Scribd logo
1 de 39
Descargar para leer sin conexión
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: крупный план
                b0   b1 b2 b3    b4     tuples
                1    1   1   1   1    {…,   31,   …}
                0    0   0   0   0    {…,    0,   …}
 key={20}       1    0   1   0   0    {…,   20,   …}
                0    1   0   0   1    {…,    9,   …}
23 = 0b10100    1    0   1   1   1    {…,   23,   …}
                0    1   0   0   0    {…,    8,   …}
b0 — параметр   1    1   0   1   0    {…,   26,   …}
b1 — параметр   0    1   0   1   0    {…,   10,   …}
b2 — параметр   1    0   0   1   1    {…,   19,   …}
b3 — параметр   0    1   0   0   1    {…,    9,   …}

                     key bits           value
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.0rnrn")
hdr = s:readline({ "rnrn", "nn"})
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-
                  •B-tree balances INSERT, U

                  •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
PUT(37), PUT(16)   Self-Balancing Tree Memory

                                       Disk




WAL:
16 37 Self-Balancing Tree Memory

                                       Disk




WAL: 37, 16
7 41 Self-Balancing Tree Memory

                     16 37 Sorted String Table   Disk




WAL: 41, 7, 37, 16
Memory

                       7 37        Disk

                     7 16 37 41




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

                               7 37        Disk

                             7 16 37 41




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

                               10 28       Disk

                             7 16 37 41




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

                                    10 28     Disk

                                7 16 37 41




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

                                2 10 28 41

                       2   7 10 16 28 37 41 47



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

                                 2 10 28 41

                       2    7 10 16 28 37 41 47



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

                                 2 10 28 41

                       2    7 10 16 28 37 41 47



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

                                 2 10 28 41

                       2    7 10 16 28 37 41 47



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

                                 6 23 32 49

                       2    7 10 16 28 37 41 47



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

                                      6 32                  Disk

                                 6 23 32 49

                       2    7 10 16 28 37 41 47



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

                                     30 45                          Disk

                                 6 23 32 49

                       2    7 10 16 28 37 41 47



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

                                      2 30                                Disk

                                 2 14 30 41

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

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

                                     22 37                                Disk

                                 10 25 36 42

                        3   8 15 26 35 40 45 48
    2    6    7 10 14 16 23 28 30 32 37 38 41 45 47 49

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

                                     22 37                                Disk

                                 10 25 36 42

                        3   8 15 26 35 40 45 48
    2    6    7 10 14 16 23 28 30 32 37 38 41 45 47 49

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

                                     22 37                                Disk

                                 10 25 36 42

                        3   8 15 26 35 40 45 48
    2    6    7 10 14 16 23 28 30 32 37 38 41 45 47 49

WAL: 37, 22, 36, 10, 25, 42, 10, 6, 38, 14, 45, 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41,
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:
хранение данных на диске

Más contenido relacionado

Destacado (15)

Rabovoluk
RabovolukRabovoluk
Rabovoluk
 
Zacepin
ZacepinZacepin
Zacepin
 
Zenovich
ZenovichZenovich
Zenovich
 
Bubnov
BubnovBubnov
Bubnov
 
Smirnov dependency-injection-techforum(1)
Smirnov dependency-injection-techforum(1)Smirnov dependency-injection-techforum(1)
Smirnov dependency-injection-techforum(1)
 
Perepelitsa
PerepelitsaPerepelitsa
Perepelitsa
 
Smirnov reverse-engineering-techforum
Smirnov reverse-engineering-techforumSmirnov reverse-engineering-techforum
Smirnov reverse-engineering-techforum
 
Platov
PlatovPlatov
Platov
 
Haritonov
HaritonovHaritonov
Haritonov
 
Kalugin balashov
Kalugin balashovKalugin balashov
Kalugin balashov
 
Panfilov
PanfilovPanfilov
Panfilov
 
Zamyakin
ZamyakinZamyakin
Zamyakin
 
Romanenko
RomanenkoRomanenko
Romanenko
 
A.pleshkov
A.pleshkovA.pleshkov
A.pleshkov
 
Zagursky
ZagurskyZagursky
Zagursky
 

Más de kuchinskaya

владимир габриелян
владимир габриелянвладимир габриелян
владимир габриелян
kuchinskaya
 
чашкин иван
чашкин иванчашкин иван
чашкин иван
kuchinskaya
 
сумин андрей
сумин андрейсумин андрей
сумин андрей
kuchinskaya
 
митасов роман
митасов романмитасов роман
митасов роман
kuchinskaya
 
кренин владимир
кренин владимиркренин владимир
кренин владимир
kuchinskaya
 
константин лебедев
константин лебедевконстантин лебедев
константин лебедев
kuchinskaya
 
дыдыкин егор
дыдыкин егордыдыкин егор
дыдыкин егор
kuchinskaya
 
ярослав рабоволюк
ярослав рабоволюкярослав рабоволюк
ярослав рабоволюк
kuchinskaya
 
сергей спиридонов
сергей спиридоновсергей спиридонов
сергей спиридонов
kuchinskaya
 
игорь ермаков
игорь ермаковигорь ермаков
игорь ермаков
kuchinskaya
 
дмитрий юдин3
дмитрий юдин3дмитрий юдин3
дмитрий юдин3
kuchinskaya
 

Más de kuchinskaya (12)

Kharkov
KharkovKharkov
Kharkov
 
владимир габриелян
владимир габриелянвладимир габриелян
владимир габриелян
 
чашкин иван
чашкин иванчашкин иван
чашкин иван
 
сумин андрей
сумин андрейсумин андрей
сумин андрей
 
митасов роман
митасов романмитасов роман
митасов роман
 
кренин владимир
кренин владимиркренин владимир
кренин владимир
 
константин лебедев
константин лебедевконстантин лебедев
константин лебедев
 
дыдыкин егор
дыдыкин егордыдыкин егор
дыдыкин егор
 
ярослав рабоволюк
ярослав рабоволюкярослав рабоволюк
ярослав рабоволюк
 
сергей спиридонов
сергей спиридоновсергей спиридонов
сергей спиридонов
 
игорь ермаков
игорь ермаковигорь ермаков
игорь ермаков
 
дмитрий юдин3
дмитрий юдин3дмитрий юдин3
дмитрий юдин3
 

Osipov

  • 1. Tarantool 1.5: хранение данных на диске Konstantin Osipov, kostja@tarantool.org April 09th, 2013 http://techforum.mail.ru
  • 2. Прейскурант ● Новые возможности Tarantool 1.4.9 - 62 р. ● Алгоритмы хранения данных на диске - 165 р. ● Log-structured merge trees в Tarantool - 200 р. ● Компот из сухофруктов - 20 р.
  • 3. ДЕЙСТВИЕ ПЕРВОЕ, Явление 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
  • 4. BITSET index: применение ● вычисление логических выражений ● b1 & !b2 || b3 & b4 ● наиболее компактный индекс по разреженным данным (1 bit per value vs 16 bytes in TREE) ● поиск по интересам, рекомендательные сети, tag clouds
  • 5. BITSET index: крупный план b0 b1 b2 b3 b4 tuples 1 1 1 1 1 {…, 31, …} 0 0 0 0 0 {…, 0, …} key={20} 1 0 1 0 0 {…, 20, …} 0 1 0 0 1 {…, 9, …} 23 = 0b10100 1 0 1 1 1 {…, 23, …} 0 1 0 0 0 {…, 8, …} b0 — параметр 1 1 0 1 0 {…, 26, …} b1 — параметр 0 1 0 1 0 {…, 10, …} b2 — параметр 1 0 0 1 1 {…, 19, …} b3 — параметр 0 1 0 0 1 {…, 9, …} key bits value
  • 6. 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ов!
  • 7. Lua box.socket example s = box.socket.tcp() s:connect('google.com', 80) s:send("GET / HTTP/1.0rnrn") hdr = s:readline({ "rnrn", "nn"}) body = s:recv(parse_header(hdr).content_length)
  • 8. Lua box.socket: выход на бис ● box.net.box: работа с удалёнными Tarantool/Box ● box.net.mysql, box.net.pg – доступ к MySQL и PostgreSQL из хранимых процедур ● → single-round-trip database proxy and cache
  • 10. ДЕЙСТВИЕ ПЕРВОЕ, Явление II Diskstore •B-tree – most popular disk- •B-tree balances INSERT, U •DELETEs can be slow
  • 16. 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
  • 17. PUT(37), PUT(16) Self-Balancing Tree Memory Disk WAL:
  • 18. 16 37 Self-Balancing Tree Memory Disk WAL: 37, 16
  • 19. 7 41 Self-Balancing Tree Memory 16 37 Sorted String Table Disk WAL: 41, 7, 37, 16
  • 20. Memory 7 37 Disk 7 16 37 41 WAL: 41, 7, 28, 16
  • 21. 10 28 Memory 7 37 Disk 7 16 37 41 WAL: 10, 28, 41, 7, 37, 16
  • 22. Memory 10 28 Disk 7 16 37 41 WAL: 10, 28, 41, 7, 37, 16
  • 23. 2 47 Memory 10 28 Disk 7 16 37 41 WAL: 47, 2, 10, 28, 41, 7, 37, 16
  • 24. Memory 2 28 Disk 2 10 28 41 2 7 10 16 28 37 41 47 WAL: 47, 2, 10, 28, 41, 7, 37, 16
  • 25. 6 49 Memory 2 28 Disk 2 10 28 41 2 7 10 16 28 37 41 47 WAL: 49, 6, 47, 2, 10, 28, 41, 7, 37, 16
  • 26. Memory 6 49 Disk 2 10 28 41 2 7 10 16 28 37 41 47 WAL: 49, 6, 47, 2, 10, 28, 41, 7, 37, 16
  • 27. 23 32 Memory 6 49 Disk 2 10 28 41 2 7 10 16 28 37 41 47 WAL: 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16
  • 28. Memory 6 32 Disk 6 23 32 49 2 7 10 16 28 37 41 47 WAL: 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16
  • 29. 30 45 Memory 6 32 Disk 6 23 32 49 2 7 10 16 28 37 41 47 WAL: 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16
  • 30. 14 38 Memory 30 45 Disk 6 23 32 49 2 7 10 16 28 37 41 47 WAL: 38, 14, 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16
  • 31. 6 10 Memory 2 30 Disk 2 14 30 41 2 7 14 23 30 37 41 47 2 6 7 10 14 16 23 28 30 32 37 38 41 45 47 49 WAL: 10, 6, 38, 14, 45, 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41, 7, 37, 16
  • 32. Memory 22 37 Disk 10 25 36 42 3 8 15 26 35 40 45 48 2 6 7 10 14 16 23 28 30 32 37 38 41 45 47 49 WAL: 37, 22, 36, 10, 25, 42, 10, 6, 38, 14, 45, 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41,
  • 33. GET(16) Memory 22 37 Disk 10 25 36 42 3 8 15 26 35 40 45 48 2 6 7 10 14 16 23 28 30 32 37 38 41 45 47 49 WAL: 37, 22, 36, 10, 25, 42, 10, 6, 38, 14, 45, 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41,
  • 34. GET(16) Memory 22 37 Disk 10 25 36 42 3 8 15 26 35 40 45 48 2 6 7 10 14 16 23 28 30 32 37 38 41 45 47 49 WAL: 37, 22, 36, 10, 25, 42, 10, 6, 38, 14, 45, 30, 45, 32, 23, 49, 6, 47, 2, 10, 28, 41,
  • 35. LSM-tree: применение ● Данные с разной степенью актуальности – Ленты сообщений – Стена в соцсети – Чаты – События ● Сегрегация данных – Данные в LSM space, индекс в MEMORY space
  • 36. Эпилог ● Tarantool/Box - *fast* in-memory database ● Идеального способа хранения данных на диске не существует ● Плохих способов реализовано предостаточно ● LSM-деревья оптимальны для часто меняющихся данных ● in-memory + disk-store в одном продукте = возможность тонко подстроиться под нужды конкретной задачи
  • 37. ?
  • 38. Действующие лица Dmitry Simonenko – клиенты, библиотеки Lua, билды ● Dmitry E. Oboukhov, – Perl monger, главный тролль ● Roman Tsisyk, – алгоритмы, ● Konstantin Osipov – продавец-кассир ● … а также актёры ведущих московских театров