tarantool: как обрабатывать 1,5 млрд запросов в сутки?
TRANSCRIPT
Tarantool: как обработать 1.5^108 запросов в сутки?
Константин Осипов, Mail.Ru
ПланОсновные проблемы масштабирования СУБД
Tarantool: решение из области shared nothing
Data patterns
Scalability patterns
Обзор планов
СУБД: современный ландшафт
СУБД: прогноз
3 проблемы РСУБД- горизонтальное масштабирование
- rigid schema
- производительность
NoSQL – мир энтузиастов:
- новые модели данных, модели консистентности данных
- новые языки доступа к данным
- новые алгоритмы хранения данных
- много, много новых методов масштабирования
Модель данныхПространства
(spaces)
Кортежи
(tuples)
Поля
(fields)
Индексы
(indexes)
Модель данных (2)
Tarantool РСУБД
Space Table
Field Column
Соответствие терминов: Типы данных:
NUM
NUM64
STRING
Типы индексов:
HASH
TREE
Модель данных (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, UPDATEdefine(‘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 (PK)
Field 1 = Phone Field2 = Name
1 212-85-01 John Dow
2 212-85-02 Clint Smith
3 967-53-09 Cheryl Wood
4 Новая строка
Auto-increment: PHPdefine(S_USER, 1); // номер space USERdefine(INC_NO,1); // номер ключа счетчикаdefine(COUNTER,1); // номер поля счетчика
$key = $tnt->inc(SNO, INC_NO, COUNTER, [1, true]);
$tnt->insert(NS_USER, $key, $data);
Auto-increment: Luafunction 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: Luafunction 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 постоянно меняющихся данных
Application
Масштабирование
0 ...10М
Tarantool Proxy
Shard 1
10...20М Shard 2
20+ М Shard 3
ПланыПоддержка транзакций
Мастер-мастер репликация
Кластер менеджер
Спасибо!
http://tarantool.org
http://github.com/mailru/tarantool - исходный кодhttp://github.com/mailru/tntlua - репозиторий хранимых процедурhttp://nosql-databases.org - обзор альтернатив NoSQLhttp://groups.google.com/group/tarantool-ru - список рассылкиhttp://tarantool.org/dist/ - всегда свежие .tar.gz и .rpmhttp://habrahabr.ru/blogs/nosql - NoSQL на хабре