Паттерны и примеры структур данных в nosql на примере...
DESCRIPTION
Презентация к докладу на HiLoad++ часть информации устарела с выходом новой версии tarantool так как часть паттернов решается через lua-процедурыTRANSCRIPT
![Page 1: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/1.jpg)
Александр Календарёв
Шаблоны структур данных NoSQL на примере Tarantool
![Page 2: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/2.jpg)
План
Коротко паттернах
Структуры данных в Tarantool
РНР Интерфейс
Реализация Паттернов данных
Масштабирование
![Page 3: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/3.jpg)
Виды паттернов
Системной архитектуры
Кодирования
Структур данных (РСУБД)
Паттерны данных NoSQL
![Page 4: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/4.jpg)
Структура данных Tarantool
Namespace 0
Field 0 Field 1 Field 2
INDEX
1
INDEX
0
INDEX
2 . . .Field N
Tuple
![Page 5: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/5.jpg)
Структура данных Tarantool
Namespace (Пространство имен)
Tuple (Кортеж)
Field (Поле)
Index (Индекс)
![Page 6: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/6.jpg)
Аналог структур данных
Namespace - Таблица РСУБД
Field – Колонка (столбец) РСУБД
![Page 7: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/7.jpg)
Структура данных Tarantool Типы полей
Num
Num64
String
![Page 8: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/8.jpg)
Структура данных Tarantool Типы индексов
Hash / Tree
Простой / Составной
![Page 9: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/9.jpg)
Операции в Tarantool
INSERT
SELECT
UPDATE
DELETE
![Page 10: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/10.jpg)
PHP интерфейс ‐ Конструктор Tarantool
$tnt = new Tarantool($host,$port,$admPort);
$host – хост (def: localhost);
$port – порт (def: 33013);
$admPort – административный порт (33015).
![Page 11: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/11.jpg)
PHP интерфейс ‐ INSERT Tarantool
define( ‘NS’,0); // номер namespace
$tnt = new Tarantool();
$tuple = array(12345,‘spb’,’Hello Word’);
$res = $tnt->insert(NS, $tuple);
Если данные существуют – они замещаются
Возвращается результат true- успех / false...
![Page 12: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/12.jpg)
PHP интерфейс ‐ DELETE Tarantool
$tnt = new Tarantool();
$res = $tnt->delete(NS, $key, [$flag]);
1)Удаление всегда по первичному ключу
2) $flag = true – возвращать данные (def: $flag = false)
Возвращает: true/false – результат операции
или данные (массив) если $flag = true
![Page 13: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/13.jpg)
PHP интерфейс ‐ UPDATE Tarantool
$tnt = new Tarantool();
$data = array(1=>’msk’, 2=> ‘Hello Hi++!’);
$res = $tnt->update(NS, $key, $data);
1)$key – всегда первичный ключ
2) $data – асс. массив № поля => нов. значение
Возвращает результат операции : true=успех/false...
![Page 14: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/14.jpg)
PHP интерфейс ‐ INC (update) Tarantool
$tnt = new Tarantool();
$res = $tnt->inc(NS, $key, $fieldNo, [$delta, $flag]);
1)$key – всегда первичный ключ;
2) $fieldNo – номер инкременитируемого поля тип Num;
3) $delta – инкрементируемое значение (def: $delta = 1);
4) $flag = true – возвращать данные (def: $flag = false);
Возвращает результат операции : true=успех/false ...
или новые данные если $flag = true
![Page 15: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/15.jpg)
PHP интерфейс ‐ SELECT Tarantool
$tnt = new Tarantool();
$count = $tnt->select(NS, $indexNo, $key,[ $limit, $offset]);
1)$key – ключ, если используем составной то массив;
2) $indexNo – номер индексного поля, по которому осуществляется выборка;
3) def: $limit = хFFFFFFFF; ,def: $offset = 0;
Возвращает: кол-во найденных кортежей,
Выборка данных осуществляется методом getTuple();
![Page 16: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/16.jpg)
PHP интерфейс ‐ MSELECT Tarantool множественный выбор
Является аналогом mget($keys) в memcache
или: SELECT * FROM t0 WHERE key IN ($keyList);
$count = $tnt->mselect(NS, $indexNo, $keys,[ $limit, $offset]);
1)$keys –массив ключей;
2) $indexNo – номер индексного поля, осуществляется выборка;
3) $limi , $offset – аналог метода select();
Возвращает: кол-во найденных кортежей, false- ошибка
Выборка данных осуществляется методом getTuple();
![Page 17: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/17.jpg)
PHP интерфейс – прочие методы Tarantool
getTuple() – возвращает данные методов
select() и mselect();
getError() – описание ошибки последней операции
getConf() – конфигурационный файл сервера
getInfo() – переменные сервера
getStat() – информация по статистики сервера
![Page 18: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/18.jpg)
Паттерн: справочник
Field 0 , Primary index (PK)=0 Field1 = Name
11-22-33-44 Маня
11-22-33-55 Ваня
11-22-33-66 Таня
Аналог key/value Доступ осуществляется по первичному ключу; Возвращается один кортеж; SQL аналог:
SELECT * FROM T0 WHERE key0=$key
![Page 19: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/19.jpg)
Паттерн: справочник реализация
define(‘PK’, 0);
$key = ’11-22-33-44’;
$res = $tnt->select(NS,PK, $key);
if($res===false)
echo $tnt->getError();
else
print_r( $tnt->getTuple());
![Page 20: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/20.jpg)
Паттерн: обратный справочник
Field 0 , Primary index (PK)=0 Field1 = Name INDEX 1
11-22-33-44 Маня
11-22-33-55 Ваня
11-22-33-66 Таня
Доступ осуществляется по вторичному ключу; Возвращается массив кортежей;
SQL аналог:
SELECT * FROM T0 WHERE key1=$key
![Page 21: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/21.jpg)
Паттерн: обратный справочник реализация define(‘IDX_NAME’, 1);
$key = ’Маня’;
$res = $tnt->select(NS, IDX_NAME, $key);
if($res===false)
echo $tnt->getError();
else
print_r( $tnt->getTuple());
![Page 22: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/22.jpg)
Паттерн: справочник с разделами поиск по одному разделу
Field 0, Primary index INDEX=0 (PK)
Field1 = Name Field2 = City INDEX=2
11-22-33-44 Маня SPB
11-22-33-55 Ваня MSK
11-22-33-66 Таня SPB
Представляет денормолизованное отношение Один ко Многим Cтроится индекс по разделу Доступ осуществляется по вторичному ключу; SQL аналог: SELECT * FROM T0 WHERE key1=$key
![Page 23: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/23.jpg)
Паттерн: справочник с разделами реализация define(‘IDX_CITY’, 2);
$key = ’SPB’;
$res = $tnt->select(NS, IDX_CITY, $key);
if($res===false)
echo $tnt->getError();
else
print_r( $tnt->getTuple());
![Page 24: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/24.jpg)
Паттерн: справочник с разделами выборка по нескольким разделам
Field 0, Primary index (PK)=0
Field1 = Name Field2 = City (INDEX=3)
Field3=Sex INDEX=3
11-22-33-44 Маня SPB Ж
11-22-33-55 Ваня MSK M
11-22-33-66 Таня SPB Ж
11-22-33-77 Саня SPB M
Cтроится составной индекс по двум и более полям; Доступ осуществляется по вторичному ключу; SQL аналог:
SELECT * FROM T0 WHERE (Field2=$city AND Field3=$sex)
![Page 25: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/25.jpg)
Паттерн: Матрица
Матрица [M x N]
Po = (x,y)
Key = y * M + x
Х
Y
M
N
Po
x
y
![Page 26: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/26.jpg)
Паттерн: Матрица Задача: выбор области
Х
Y
M
р
N
Po
x
y
h
w
![Page 27: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/27.jpg)
Паттерн: Матрица выбор области
$key = array();
for ($i=0; $i<W; $i++ )
for ($j=0; $j<H; $j++ )
$key[] = $P0 + I + j *M;
$tnt->mselect(NS, PK, $key);
![Page 28: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/28.jpg)
Паттерн: Автоинкрементная таблица
Field 0 (PK) Field 1 = Phone Field2 = Name
1 11-22-33-44 Маня
2 11-22-33-55 Ваня
3 11-22-33-66 Таня
4 Новая строка
При каждой вставки увеличиваем PK на 1 Аналог Autoincrement в MySQL или SEQUENCE
![Page 29: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/29.jpg)
Паттерн: Автоинкрементная таблица реализация
define(NS_USER, 1); // номер namespace USER
define(INC_USER,1); // номер ключа счетчика
define(FD_COUNTER,1); // номер поля счетчика
$key =
$tnt->inc(NS, INC_USER, FD_COUNTER,1,true);
$tnt->insert(NS_USER, $key, $data);
![Page 30: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/30.jpg)
Паттерн: Отношение многие ко многим
Подход 1: создать Ns с двумя полями использовать составной индекс
Подход 2: использовать первичный индекс num64 Первая часть слова user_id, вторая часть map_id
![Page 31: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/31.jpg)
Паттерн: Многие ко многим реализация варианта 2
define(NS_USER_TO_MAP, 3);
$key= $user_id << 32 + $map_id
$res=$tnt->select(NS_USER_TO_MAP, PK,$key);
![Page 32: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/32.jpg)
Паттерн: Очередь
Принцип FIFO - Первый пришел, первый ушел
Реализуется через два указателя на начало и конец
очереди
PK
. . .
Data 1
Data 2
Data 3
Begin Pointer
End Pointer
![Page 33: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/33.jpg)
Паттерн: Очередь добавление в очередь
define(BEG_PTR, 4); // номер ключа Beg Pointer
$key=
$tnt->inc(NS, BEG_PTR, FD_COUNTER,1,true);
$tnt->insert(NS_USER, $data);
![Page 34: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/34.jpg)
Паттерн: Очередь взятие из очереди
define(END_PTR, 5); // номер ключа End Pointer
$key=
$tnt->inc(NS, END_PTR, FD_COUNTER,-1,true);
$data = $tnt->delete(NS_USER, $key, true);
![Page 35: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/35.jpg)
Масштабирование
![Page 36: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/36.jpg)
Принцип шардинга
0 ... 10М
10 ... 20М
20 ... 30М
0 ... 10М
10 ... 20М
20 ... 30М
![Page 37: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/37.jpg)
Реализация шардинга Tarantool Proxy
0 ... 10М
10 ... 20М
20 ... 30М
Tarantool Proxy
Server 1
Server 2
Server 3
Application
![Page 38: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/38.jpg)
Tarantool Proxy
Представляет многопоточный демон,
перенаправляющий запросы на Tarantool сервера.
Определение номера сервера:
• По конфигу или
• С помощью плагина
![Page 39: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/39.jpg)
Tarantool Proxy: Операции с первичным ключом
• INSERT
• UPDATE
• DELETE
• SELECT * BY PK
Tarantool Proxy
Server 1
Server 2
Server 3
![Page 40: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/40.jpg)
Tarantool Proxy: Операции со вторичным ключом
SELECT * FROM T1
WHERE k1=…
Tarantool Proxy
Server 1
Server 2
Server 3
![Page 41: Паттерны и примеры структур данных в NoSQL на примере Tarantool](https://reader036.vdocuments.pub/reader036/viewer/2022081720/5594bfcb1a28aba3748b4666/html5/thumbnails/41.jpg)
Александр Календарёв
@akalend http://githab.com/akalend
http://akalend.habrahabr.ru/blog