Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
12 примеровиспользования Redis    – в Tarantool Александр Календарёв, Константин Осипов
ПланАрхитектура и модель данных NoSQL СУБД Tarantool/BoxПроизводительность в сравнении с RedisДоступ из PHPData patternsSc...
Модель данныхПространства(spaces)Кортежи(tuples)Поля(fields)Индексы(indexes)
Модель данных (2)Соответствие терминов: Типы данных:   Типы индексов:Tarantool     РСУБД    NUM            HASHSpace      ...
Модель данных (3)Индексы: простые, составные, уникальные, неуникальныеОперации: INSERT/SELECT/UPDATE/DELETE/REPLACEПоддерж...
PHP интерфейс$tnt = new Tarantool($host, $port, $admPort);# $host – хост (def: localhost);# $port – порт (def: 33013);# $a...
PHP: INSERT, UPDATEdefine(‘SNO’,0);      // номер space$key = 12345$tuple = array($key,‘spb’,’Hello Word’);# если данные с...
PHP интерфейс: SELECT$count = $tnt->select(SNO, $index, $key,[$limit,$offset]);# $key – ключ, возможен массив;# $index – н...
ПроизводительностьIntel I5 , 4G RAM, 7200 RPM SATA10 потоков, 200-300 байт кортежRedis: 120k writes, 270k readsTarantool: ...
Auto-increment patternField 0   Field 1 = Phone   Field2 = Name(PK)1         212-85-01         John Dow2         212-85-02...
Auto-increment: PHPdefine(S_USER, 1); // номер space USERdefine(INC_NO,1); // номер ключа счетчикаdefine(COUNTER,1); // но...
Auto-increment: Luafunction box.auto_increment(spaceno, ...)    max_tuple = box.space[spaceno].index[0].idx:max()    if ma...
Pattern FIFO: PHP                 primary key                 ...                 index.phpbegin pointer                 c...
Pattern FIFO: PHPFIFO POP:define(END_PTR, 5); // номер ключа End Pointer$key = $tnt->inc(NS, END_PTR, FD_COUNTER, -1,     ...
Pattern FIFO: Luafunction fifo_push(name, val)    fifo = find_or_create_fifo(name)    top = box.unpack(i, fifo[1])    bott...
Pattern Memcache• есть возможность создавать свои микро-потоки:• box.coro.create(), box.coro.yield()• создаёте хранимую пр...
Pattern: справочникField 0, Primary    Field1 = date   Field2 = CityINDEX=0                             INDEX=1rizaeyka@ma...
Масштабирование                                0 ...10М   Shard 1Application   Tarantool Proxy                            ...
Что такое Tarantool Proxy•    Многопоточный демон•    Отправляет запросы на разные сервера•   Определение сервера с помощь...
READ/WRITE scaling                                Shard 1                     0 ...10МTarantool Proxy                  10....
Не успели рассказать о:Интеграция в VoldemortДоступ из Perl, Python, C, Ruby, Javahttp://github.com/mailru/tntlua,http://g...
ПланыПоддержка транзакцийМастер-мастер репликацияКластер менеджерTarantool Proxy: load balancing
Спасибо!akalend@mail.ru, kostja.osipov@gmail.com           http://tarantool.org     http://habrahabr.ru/blogs/nosql/
Upcoming SlideShare
Loading in …5
×

12 вариантов использования Redis — в Tarantool (Александр Календарев, Константин Осипов)

5,126 views

Published on

  • Be the first to comment

12 вариантов использования Redis — в Tarantool (Александр Календарев, Константин Осипов)

  1. 1. 12 примеровиспользования Redis – в Tarantool Александр Календарёв, Константин Осипов
  2. 2. ПланАрхитектура и модель данных NoSQL СУБД Tarantool/BoxПроизводительность в сравнении с RedisДоступ из PHPData patternsScalability patternsОбзор планов
  3. 3. Модель данныхПространства(spaces)Кортежи(tuples)Поля(fields)Индексы(indexes)
  4. 4. Модель данных (2)Соответствие терминов: Типы данных: Типы индексов:Tarantool РСУБД NUM HASHSpace Table NUM64 TREEField Column STRING
  5. 5. Модель данных (3)Индексы: простые, составные, уникальные, неуникальныеОперации: INSERT/SELECT/UPDATE/DELETE/REPLACEПоддерживается простой SQL
  6. 6. PHP интерфейс$tnt = new Tarantool($host, $port, $admPort);# $host – хост (def: localhost);# $port – порт (def: 33013);# $admPort – административный порт (def: 33015)
  7. 7. 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 – асс. массив № поля => нов. значение
  8. 8. PHP интерфейс: SELECT$count = $tnt->select(SNO, $index, $key,[$limit,$offset]);# $key – ключ, возможен массив;# $index – номер индекса, по которому# осуществляется выборка;# default $limit = 0хFFFFFFFF, $offset = 0;# Возвращает количество найденных кортежей# Выборка данных осуществляется методом$tuple = $tnt->getTuple();
  9. 9. ПроизводительностьIntel I5 , 4G RAM, 7200 RPM SATA10 потоков, 200-300 байт кортежRedis: 120k writes, 270k readsTarantool: 100k writes, 260k reads
  10. 10. Auto-increment patternField 0 Field 1 = Phone Field2 = Name(PK)1 212-85-01 John Dow2 212-85-02 Clint Smith3 967-53-09 Cheryl Wood4 Новая строка
  11. 11. 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);
  12. 12. 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);
  13. 13. Pattern FIFO: PHP primary key ... index.phpbegin pointer clients.phpend pointer contacts.php
  14. 14. Pattern FIFO: PHPFIFO POP:define(END_PTR, 5); // номер ключа End Pointer$key = $tnt->inc(NS, END_PTR, FD_COUNTER, -1, true);$data = $tnt->delete(NS_USER, $key, true);FIFO PUSH:define(BEG_PTR, 4); // номер ключа Beg Pointer$key = $tnt->inc(NS, BEG_PTR, FD_COUNTER, 1, true);$tnt->insert(NS_USER, $data);
  15. 15. 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
  16. 16. Pattern Memcache• есть возможность создавать свои микро-потоки:• box.coro.create(), box.coro.yield()• создаёте хранимую процедуру, запускаете её• получаете custom expire process• используется для хранения сессий в mail.ru: 4 машины, по 2 Tarantool/Box на каждой, 2 мастера, и 2 реплики 40-60k requests/second, CPU usage < 20%
  17. 17. Pattern: справочникField 0, Primary Field1 = date Field2 = CityINDEX=0 INDEX=1rizaeyka@mail.ru 2011-05-09 SPBslavsyper@mail.ru 2011-09-09 MSKoxic10@mail.ru 2011-10-01 SPB
  18. 18. Масштабирование 0 ...10М Shard 1Application Tarantool Proxy 10...20М Shard 2 20+ М Shard 3
  19. 19. Что такое Tarantool Proxy• Многопоточный демон• Отправляет запросы на разные сервера• Определение сервера с помощью конфигурационногофайла или плагина
  20. 20. READ/WRITE scaling Shard 1 0 ...10МTarantool Proxy 10...20М Shard 2 SELECT WHERE key=k1,k2INSERT, UPDATE, Shard 3DELETE, SELECT 20+ М 0 ...10М Shard 1WHERE key=PK Tarantool Proxy 10...20М Shard 2 20+ М Shard 3
  21. 21. Не успели рассказать о:Интеграция в VoldemortДоступ из Perl, Python, C, Ruby, Javahttp://github.com/mailru/tntlua,http://github.com/mailru/nosqlbench,http://github.com/akalend/
  22. 22. ПланыПоддержка транзакцийМастер-мастер репликацияКластер менеджерTarantool Proxy: load balancing
  23. 23. Спасибо!akalend@mail.ru, kostja.osipov@gmail.com http://tarantool.org http://habrahabr.ru/blogs/nosql/

×