23
12 примеров использования Redis – в Tarantool Александр Календарёв, Константин Осипов

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

  • Upload
    ontico

  • View
    3.381

  • Download
    10

Embed Size (px)

Citation preview

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

12 примеров использования Redis

– в TarantoolАлександр Календарёв, Константин Осипов

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

ПланАрхитектура и модель данных NoSQL СУБД Tarantool/Box

Производительность в сравнении с Redis

Доступ из PHP

Data patterns

Scalability patterns

Обзор планов

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

Модель данныхПространства

(spaces)

Кортежи

(tuples)

Поля

(fields)

Индексы

(indexes)

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

Модель данных (2)

Tarantool РСУБД

Space Table

Field Column

Соответствие терминов: Типы данных:

NUM

NUM64

STRING

Типы индексов:

HASH

TREE

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

Модель данных (3)Индексы: простые, составные, уникальные, неуникальные

Операции: INSERT/SELECT/UPDATE/DELETE/REPLACE

Поддерживается простой SQL

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

PHP интерфейс

$tnt = new Tarantool($host, $port, $admPort);# $host – хост (def: localhost);# $port – порт (def: 33013);# $admPort – административный порт (def: 33015)

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

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 – асс. массив № поля => нов. значение

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

PHP интерфейс: SELECT$count = $tnt->select(SNO, $index, $key,[$limit, $offset]);# $key – ключ, возможен массив; # $index – номер индекса, по которому# осуществляется выборка;# default $limit = 0хFFFFFFFF, $offset = 0; # Возвращает количество найденных кортежей# Выборка данных осуществляется методом$tuple = $tnt->getTuple();

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

ПроизводительностьIntel I5 , 4G RAM, 7200 RPM SATA

10 потоков, 200-300 байт кортеж

Redis: 120k writes, 270k reads

Tarantool: 100k writes, 260k reads

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

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 Новая строка

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

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);

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

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);

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

Pattern FIFO: PHPprimary key

. . .

index.php

clients.php

contacts.php

begin pointer

end pointer

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

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);

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

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

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

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%

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

Field 0, PrimaryINDEX=0

Field1 = date Field2 = CityINDEX=1

[email protected] 2011-05-09 SPB

[email protected] 2011-09-09 MSK

[email protected] 2011-10-01 SPB

Pattern: справочник

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

Application

Масштабирование

0 ...10М

Tarantool Proxy

Shard 1

10...20М Shard 2

20+ М Shard 3

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

Что такое Tarantool Proxy• Многопоточный демон• Отправляет запросы на разные сервера• Определение сервера с помощью конфигурационного файла или плагина

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

READ/WRITE scaling

0 ...10М Shard 1

10...20М Shard 2

20+ М Shard 3

0 ...10М

Tarantool Proxy

Shard 1

INSERT, UPDATE, DELETE, SELECTWHERE key=PK

SELECT WHERE key=k1,k210...20М Shard 2

20+ М Shard 3

Tarantool Proxy

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

Не успели рассказать о:Интеграция в Voldemort

Доступ из Perl, Python, C, Ruby, Java

http://github.com/mailru/tntlua, http://github.com/mailru/nosqlbench, http://github.com/akalend/

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

ПланыПоддержка транзакций

Мастер-мастер репликация

Кластер менеджер

Tarantool Proxy: load balancing

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

Спасибо!

[email protected], [email protected]

http://tarantool.org

http://habrahabr.ru/blogs/nosql/