Tarantool: как обработать
      8
1.5^10 запросов в сутки?

      Константин Осипов, Mail.Ru
План
Основные проблемы масштабирования СУБД
Tarantool: решение из области shared nothing
Data patterns
Scalability patterns
Обзор планов
СУБД: современный ландшафт
СУБД: прогноз
3 проблемы РСУБД
- горизонтальное масштабирование
- rigid schema
- производительность
NoSQL – мир энтузиастов:
- новые модели данных, модели консистентности данных
- новые языки доступа к данным
- новые алгоритмы хранения данных
- много, много новых методов масштабирования
Модель данных
Пространства
(spaces)
Кортежи
(tuples)
Поля
(fields)
Индексы
(indexes)
Модель данных (2)
Соответствие терминов: Типы данных:   Типы индексов:
Tarantool     РСУБД    NUM            HASH
Space         Table    NUM64          TREE
Field         Column   STRING
Модель данных (3)
Индексы: простые, составные, уникальные, неуникальные
Операции: INSERT/SELECT/UPDATE/DELETE/REPLACE
Поддерживается простой SQL
PHP интерфейс
$tnt = new Tarantool($host, $port, $admPort);
# $host – хост (def: localhost);
# $port – порт (def: 33013);
# $admPort – административный порт (def: 33015)
PHP: INSERT, UPDATE
define(‘SNO’,0);      // номер space
$key = 12345
$tuple = array($key,‘spb’,’Hello Word’);
# если данные существуют, они замещаются
$res = $tnt->insert(SNO, $tuple);
$res = $tnt->delete(SNO, $key, [$flag]);
$data = array(1 => ’msk’, 2 => ‘Hello Hi++!’);
$res = $tnt->update(SNO, $key, $data);
# $key – всегда первичный ключ
# $data – асс. массив № поля => нов. значение
PHP интерфейс: SELECT
$count = $tnt->select(SNO, $index, $key,[$limit,
$offset]);
# $key – ключ, возможен массив;
# $index – номер индекса, по которому
# осуществляется выборка;
# default $limit = 0хFFFFFFFF, $offset = 0;
# Возвращает количество найденных кортежей
# Выборка данных осуществляется методом
$tuple = $tnt->getTuple();
Производительность
Intel I5 , 4G RAM, 7200 RPM SATA
10 потоков, 200-300 байт кортеж
Tarantool: 100k writes, 260k reads
Auto-increment pattern
Field 0    Field 1 = Phone   Field2 = Name
(PK)


1          212-85-01         John Dow
2          212-85-02         Clint Smith
3          967-53-09         Cheryl Wood
4          Новая строка
Auto-increment: PHP
define(S_USER, 1); // номер space USER
define(INC_NO,1); // номер ключа счетчика
define(COUNTER,1); // номер поля счетчика

$key = $tnt->inc(SNO, INC_NO, COUNTER,
                 [1, true]);
$tnt->insert(NS_USER, $key, $data);
Auto-increment: Lua
function box.auto_increment(spaceno, ...)
    max_tuple = box.space[spaceno].index[0].idx:max()
    if max_tuple ~= nil then
         max = box.unpack('i', max_tuple[0])
    else
         max = -1
    end
    return box.insert(spaceno, max + 1, ...)
end

$tnt->call(SNO, “box.auto_increment”, $data);
Pattern FIFO: Lua
function fifo_push(name, val)
    fifo = find_or_create_fifo(name)
    top = box.unpack('i', fifo[1])
    bottom = box.unpack('i', fifo[2])
    if top == fifomax+2 then -- % size
        top = 3
     …
    end
    return box.update(0, name, '=p=p=p', 1, top,
                       2, bottom, top, val)
end
Pattern Memcache
• есть возможность создавать свои микро-потоки:
• box.fiber.create(), box.fiber.yield()
• создаёте хранимую процедуру, запускаете её
• получаете custom expire process

• используется для хранения сессий в mail.ru:
 4 машины, по 2 Tarantool/Box на каждой, 2 мастера,
 и 2 реплики
 40-60k requests/second, CPU usage < 20%
Pattern: нотификации



- 6 машин по 4 Tarantool/Box на каждом
- notification_push(), notification_read()
- 250 GB постоянно меняющихся данных
Масштабирование

                                0 ...10М   Shard 1

Application   Tarantool Proxy
                                10...20М   Shard 2


                                20+ М      Shard 3
Планы
Поддержка транзакций
Мастер-мастер репликация
Кластер менеджер
Спасибо!
http://github.com/mailru/tarantool - исходный код
http://github.com/mailru/tntlua - репозиторий хранимых процедур
http://nosql-databases.org - обзор альтернатив NoSQL
http://groups.google.com/group/tarantool-ru - список рассылки
http://tarantool.org/dist/ - всегда свежие .tar.gz и .rpm
http://habrahabr.ru/blogs/nosql - NoSQL на хабре

                   kostja.osipov@gmail.com
                      http://tarantool.org

Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?

  • 1.
    Tarantool: как обработать 8 1.5^10 запросов в сутки? Константин Осипов, Mail.Ru
  • 2.
    План Основные проблемы масштабированияСУБД Tarantool: решение из области shared nothing Data patterns Scalability patterns Обзор планов
  • 3.
  • 4.
  • 5.
    3 проблемы РСУБД -горизонтальное масштабирование - rigid schema - производительность NoSQL – мир энтузиастов: - новые модели данных, модели консистентности данных - новые языки доступа к данным - новые алгоритмы хранения данных - много, много новых методов масштабирования
  • 6.
  • 7.
    Модель данных (2) Соответствиетерминов: Типы данных: Типы индексов: Tarantool РСУБД NUM HASH Space Table NUM64 TREE Field Column STRING
  • 8.
    Модель данных (3) Индексы:простые, составные, уникальные, неуникальные Операции: INSERT/SELECT/UPDATE/DELETE/REPLACE Поддерживается простой SQL
  • 9.
    PHP интерфейс $tnt =new Tarantool($host, $port, $admPort); # $host – хост (def: localhost); # $port – порт (def: 33013); # $admPort – административный порт (def: 33015)
  • 10.
    PHP: INSERT, UPDATE define(‘SNO’,0); // номер space $key = 12345 $tuple = array($key,‘spb’,’Hello Word’); # если данные существуют, они замещаются $res = $tnt->insert(SNO, $tuple); $res = $tnt->delete(SNO, $key, [$flag]); $data = array(1 => ’msk’, 2 => ‘Hello Hi++!’); $res = $tnt->update(SNO, $key, $data); # $key – всегда первичный ключ # $data – асс. массив № поля => нов. значение
  • 11.
    PHP интерфейс: SELECT $count= $tnt->select(SNO, $index, $key,[$limit, $offset]); # $key – ключ, возможен массив; # $index – номер индекса, по которому # осуществляется выборка; # default $limit = 0хFFFFFFFF, $offset = 0; # Возвращает количество найденных кортежей # Выборка данных осуществляется методом $tuple = $tnt->getTuple();
  • 12.
    Производительность Intel I5 ,4G RAM, 7200 RPM SATA 10 потоков, 200-300 байт кортеж Tarantool: 100k writes, 260k reads
  • 16.
    Auto-increment pattern Field 0 Field 1 = Phone Field2 = Name (PK) 1 212-85-01 John Dow 2 212-85-02 Clint Smith 3 967-53-09 Cheryl Wood 4 Новая строка
  • 17.
    Auto-increment: PHP define(S_USER, 1);// номер space USER define(INC_NO,1); // номер ключа счетчика define(COUNTER,1); // номер поля счетчика $key = $tnt->inc(SNO, INC_NO, COUNTER, [1, true]); $tnt->insert(NS_USER, $key, $data);
  • 18.
    Auto-increment: Lua function box.auto_increment(spaceno,...) max_tuple = box.space[spaceno].index[0].idx:max() if max_tuple ~= nil then max = box.unpack('i', max_tuple[0]) else max = -1 end return box.insert(spaceno, max + 1, ...) end $tnt->call(SNO, “box.auto_increment”, $data);
  • 19.
    Pattern FIFO: Lua functionfifo_push(name, val) fifo = find_or_create_fifo(name) top = box.unpack('i', fifo[1]) bottom = box.unpack('i', fifo[2]) if top == fifomax+2 then -- % size top = 3 … end return box.update(0, name, '=p=p=p', 1, top, 2, bottom, top, val) end
  • 20.
    Pattern Memcache • естьвозможность создавать свои микро-потоки: • box.fiber.create(), box.fiber.yield() • создаёте хранимую процедуру, запускаете её • получаете custom expire process • используется для хранения сессий в mail.ru: 4 машины, по 2 Tarantool/Box на каждой, 2 мастера, и 2 реплики 40-60k requests/second, CPU usage < 20%
  • 21.
    Pattern: нотификации - 6машин по 4 Tarantool/Box на каждом - notification_push(), notification_read() - 250 GB постоянно меняющихся данных
  • 22.
    Масштабирование 0 ...10М Shard 1 Application Tarantool Proxy 10...20М Shard 2 20+ М Shard 3
  • 23.
  • 24.
    Спасибо! http://github.com/mailru/tarantool - исходныйкод http://github.com/mailru/tntlua - репозиторий хранимых процедур http://nosql-databases.org - обзор альтернатив NoSQL http://groups.google.com/group/tarantool-ru - список рассылки http://tarantool.org/dist/ - всегда свежие .tar.gz и .rpm http://habrahabr.ru/blogs/nosql - NoSQL на хабре kostja.osipov@gmail.com http://tarantool.org