Осваиваем
Tarantool
Шадрин
Евгений
Что такое NoSQL?
• Не только SQL
• Простота масштабирования
• Производительность в
конкретных задачах
• Удобство и простота
использования
Мир NoSQL
Выбор решения
• Не стоит изобретать
велосипед
• Исходите из задачи
• Опирайтесь на опыт других
• Выбирайте, что знаете
Использование
NoSQL
• «Кэширование» данных
memcached
●
Большие объемы данных
Hbase
• Сервисы очередей
redis
• Платформы для статистики и
обработки данных
redis
• Удобный бекенд для хранения
mongoDB
Tarantool
A NoSQL database running in
a Lua application server
try.tarantool.org
Особенности
Tarantool
• Все данные в памяти
• Документно-ориентированная
модель данных
• Вторичные индексы
• Транзакции
• Легковесные потоки
• Работа с сетью и файлами
script.lua
#!/usr/bin/tarantool
-- This is lua script
function hw(a, b)
print (a.hello..b.world)
end
b = {}
a = { hello = 'Hello ' }
b['world'] = 'world!'
hw(a, b)`
#!/usr/bin/tarantool
-- Tarantool init script
local log = require('log')
local console = require('console')
local server = require('http.server')
local HOST = 'localhost'
local PORT = 8008
box.cfg {
log_level = 5,
slab_alloc_arena = 1,
}
console.listen('127.0.0.1:33013')
if not box.space.users then
s = box.schema.space.create('users')
s:create_index('primary',
{type = 'tree', parts = {1, 'NUM'}})
end
init.lua
function handler(self)
local id = self:cookie('tarantool_id')
local ip = self.peer.host
local data = ''
log.info('Users id = %s', id)
if not id then
data = 'Welcome to tarantool server!'
box.space.users:auto_increment({ip})
id = box.space.users:len()
return self:render({ text = data}):
setcookie({ name = 'tarantool_id', value
= id, expires = '+1y' })
else
local count = box.space.users:len()
data = 'You id is ' .. id .. '. We have ' ..
count .. ' users'
return self:render({ text = data })
end
end
httpd = server.new(HOST, PORT)
httpd:route({ path = '/' }, handler)
httpd:start()
Lua
• Простой
• Структуры данных – таблицы
• Быстрый luajit (luafun)
• Удобная интеграция с С
• tarantool – Lua интерпретатор
tarantool>
• /usr/bin/tarantool
• tarantool> print(‘Ola lua’)
Стартовый скрипт
init.lua
• /usr/bin/tarantool init.lua
Запуск
box.cfg
box.cfg {
log_level = 5,
slab_alloc_arena = 1,
}
Пакет box
box.cfg, box.info, box.slab,
box.stat
box.cfg
tarantool> box.cfg
---
- snapshot_count: 6
slab_alloc_arena: 1
background: false
snapshot_period: 3600
log_level: 5
snap_dir: .
wal_dir: .
...
box.info
tarantool> box.info.pid
---
- 17922
...
tarantool> box.info.version
---
- 1.6.5-98-ge279a5f
...
tarantool> box.info.uptime
---
- 143
...
tarantool> box.info.status
---
- running
...
Модель данных
База данных
if not box.space.users then
s = box.schema.space.create('users')
s:create_index('primary',
{type = 'tree', parts =
{1, 'NUM'}})
end
box.space.users:auto_increment({ip})
local count = box.space.users:len()
Lua application
server
●
https://github.com/tarantool
●
tarantool http
●
tarantool queue
●
try.tarantool.org
●
Rocks репозиторий
Пакеты
console = require('console')
log = require('log')
console.listen('127.0.0.1:33013')
log.info('Tarantool start')
Консоль администратора
---------------------------
$ rlwrap telnet 0 33013
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
Tarantool 1.6.5-98-ge279a5f (Lua console)
type 'help' for interactive help
Tarantool http
local server = require('http.server')
httpd = server.new(HOST, PORT)
httpd:route({ path = '/' }, handler)
httpd:start()
return self:render({ text = data}):
setcookie({ name =
'tarantool_id', value = id, expires =
'+1y' })
Tarantool http
●
Сервер
●
Клиент
●
Куки
●
Lua внутри Template
#!/usr/bin/tarantool
-- Tarantool init script
local log = require('log')
local console = require('console')
local server = require('http.server')
local HOST = 'localhost'
local PORT = 8008
box.cfg {
log_level = 5,
slab_alloc_arena = 1,
}
console.listen('127.0.0.1:33013')
if not box.space.users then
s = box.schema.space.create('users')
s:create_index('primary',
{type = 'tree', parts = {1, 'NUM'}})
end
init.lua
function handler(self)
local id = self:cookie('tarantool_id')
local ip = self.peer.host
local data = ''
log.info('Users id = %s', id)
if not id then
data = 'Welcome to tarantool server!'
box.space.users:auto_increment({ip})
id = box.space.users:len()
return self:render({ text = data}):
setcookie({ name = 'tarantool_id', value
= id, expires = '+1y' })
else
local count = box.space.users:len()
data = 'You id is ' .. id .. '. We have ' ..
count .. ' users'
return self:render({ text = data })
end
end
httpd = server.new(HOST, PORT)
httpd:route({ path = '/' }, handler)
httpd:start()
Пакеты
• json
• fiber
• yaml
• digest
• socket
• msgpack
• fio
• net.box
Fibers
• Модель green threads
• Быстро создаются
• Хорошая производительность
переключения
fiber.create()
fiber.sleep()
fiber_object:cancel()
fiber.time()
Документация
• tarantool.org (documentation,
downloads)
• Поддержка большинства unix
подобных систем (buildbot),
сопровождение пакетов
• Связь с разработчиками
Opensource
Итоги
●
Своя сфера применения
●
Инструмент разработки – это
важно
●
Идея и цель – важнее
●
tarantool – совсем не
сложный
Спасибо за внимание!
shadrin.e@gmail.com

Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)