Осваиваем tarantool 1.6 / Евгений Шадрин (sberbank digital ventures)
TRANSCRIPT
Осваиваем Tarantool
Шадрин Евгений
Что такое NoSQL?• Не только SQL• Простота масштабирования• Производительность в конкретных задачах
• Удобство и простота использования
Мир NoSQL
Выбор решения• Не стоит изобретать велосипед
• Исходите из задачи• Опирайтесь на опыт других• Выбирайте, что знаете
Использование NoSQL
• «Кэширование» данныхmemcached
● Большие объемы данныхHbase
• Сервисы очередейredis
• Платформы для статистики и обработки данных
redis• Удобный бекенд для хранения
mongoDB
TarantoolA 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 thens = 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 }) endend
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, }
Пакет boxbox.cfg, box.info, box.slab,
box.stat
box.cfgtarantool> box.cfg---- snapshot_count: 6 slab_alloc_arena: 1 background: false snapshot_period: 3600 log_level: 5 snap_dir: . wal_dir: ....
box.infotarantool> 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 thens = 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 33013Trying 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 thens = 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 }) endend
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 – совсем не сложный
Спасибо за внимание[email protected]