Паттерны и примеры структур данных в NoSQL на примере Tarantool

3,181 views

Published on

Презентация к докладу на HiLoad++
часть информации устарела с выходом новой версии tarantool
так как часть паттернов решается через lua-процедуры

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,181
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
27
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Паттерны и примеры структур данных в NoSQL на примере Tarantool

  1. 1. Шаблоны структур данных  NoSQL  на примере  Tarantool    Александр Календарёв
  2. 2.  План  Коротко паттернах   Структуры данных в Tarantool  РНР Интерфейс    Реализация Паттернов данных  Масштабирование
  3. 3. Виды паттернов   Системной архитектуры  Кодирования  Структур данных (РСУБД)     Паттерны данных NoSQL
  4. 4. Структура данных Tarantool Namespace 0 I I I N N N D D D E E E X X X Tuple 0 1 2 Field 0 Field 1 Field 2 . . .Field N
  5. 5. Структура данных Tarantool  Namespace (Пространство имен)  Tuple (Кортеж)   Field (Поле)  Index (Индекс)
  6. 6. Аналог структур данных  Namespace -   Таблица  РСУБД  Field – Колонка (столбец) РСУБД
  7. 7. Структура данных TarantoolТипы полей   Num  Num64   String
  8. 8. Структура данных TarantoolТипы  индексов  Hash / Tree  Простой / Составной
  9. 9. Операции в Tarantool  INSERT  SELECT  UPDATE  DELETE
  10. 10. PHP  интерфейс ‐ Конструктор               Tarantool$tnt = new Tarantool($host,$port,$admPort);$host – хост (def: localhost);$port – порт (def: 33013);$admPort – административный порт (33015).
  11. 11. PHP  интерфейс ‐  INSERT               Tarantooldefine( ‘NS’,0); // номер namespace$tnt = new Tarantool();$tuple = array(12345,‘spb’,’Hello Word’);$res = $tnt->insert(NS, $tuple);Если данные существуют – они замещаютсяВозвращается результат true- успех / false...
  12. 12. PHP  интерфейс ‐  DELETE               Tarantool$tnt = new Tarantool();$res = $tnt->delete(NS, $key, [$flag]);1)Удаление всегда по первичному ключу2) $flag = true – возвращать данные (def: $flag = false)Возвращает: true/false – результат операции или данные (массив) если $flag = true
  13. 13. 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...
  14. 14. 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
  15. 15. 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();
  16. 16. 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();
  17. 17. PHP  интерфейс – прочие методы   TarantoolgetTuple() – возвращает данные методов select() и mselect();getError() – описание ошибки последней операцииgetConf() – конфигурационный файл сервераgetInfo() – переменные сервераgetStat() – информация по статистики сервера
  18. 18. Паттерн: справочник 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
  19. 19. Паттерн: справочник   реализация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());
  20. 20. Паттерн: обратный справочник 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
  21. 21. Паттерн: обратный справочник реализацияdefine(‘IDX_NAME’, 1);$key = ’Маня’;$res = $tnt->select(NS, IDX_NAME, $key);if($res===false) echo $tnt->getError();else print_r( $tnt->getTuple());
  22. 22. Паттерн: справочник с разделами  поиск по одному разделу Field 0, Primary index Field1 = Name Field2 = City  INDEX=0 (PK) 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
  23. 23. Паттерн: справочник с разделами  реализацияdefine(‘IDX_CITY’, 2);$key = ’SPB’;$res = $tnt->select(NS, IDX_CITY, $key);if($res===false) echo $tnt->getError();else print_r( $tnt->getTuple());
  24. 24. Паттерн: справочник с разделами  выборка по нескольким разделам Field 0, Primary Field1 = Name Field2 = City Field3=Sex index (INDEX=3) INDEX=3 (PK)=0 11-22-33-44 Маня SPB Ж 11-22-33-55 Ваня MSK M 11-22-33-66 Таня SPB Ж 11-22-33-77 Саня SPB MCтроится составной индекс по двум и более полям;Доступ осуществляется по вторичному ключу;SQL аналог:SELECT * FROM T0 WHERE (Field2=$city AND Field3=$sex)
  25. 25. Паттерн: Матрица  x M ХМатрица [M x N]Po = (x,y) y PoKey = y * M + x N Y
  26. 26. Паттерн: Матрица Задача: выбор области  x M Х w y Po р h N Y
  27. 27. Паттерн: Матрица выбор области$key = array();for ($i=0; $i<W; $i++ ) for ($j=0; $j<H; $j++ ) $key[] = $P0 + I + j *M;$tnt->mselect(NS, PK, $key);
  28. 28. Паттерн: Автоинкрементная таблица 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
  29. 29. Паттерн: Автоинкрементная таблица реализацияdefine(NS_USER, 1); // номер namespace USERdefine(INC_USER,1); // номер ключа счетчикаdefine(FD_COUNTER,1); // номер поля счетчика$key = $tnt->inc(NS, INC_USER, FD_COUNTER,1,true);$tnt->insert(NS_USER, $key, $data);
  30. 30. Паттерн: Отношение многие ко многим Подход 1: создать Ns с двумя полямииспользовать составной индексПодход 2: использовать первичный индекс num64Первая часть слова user_id, вторая часть map_id
  31. 31. Паттерн: Многие ко многим реализация варианта 2define(NS_USER_TO_MAP, 3);$key= $user_id << 32 + $map_id$res=$tnt->select(NS_USER_TO_MAP, PK,$key);
  32. 32. Паттерн: Очередь PK ... Data 1 Begin Pointer Data 2 End Pointer Data 3Принцип FIFO - Первый пришел, первый ушелРеализуется через два указателя на начало и конец очереди
  33. 33. Паттерн: Очередь добавление в очередьdefine(BEG_PTR, 4); // номер ключа Beg Pointer$key= $tnt->inc(NS, BEG_PTR, FD_COUNTER,1,true);$tnt->insert(NS_USER, $data);
  34. 34. Паттерн: Очередь взятие из очередиdefine(END_PTR, 5); // номер ключа End Pointer$key= $tnt->inc(NS, END_PTR, FD_COUNTER,-1,true);$data = $tnt->delete(NS_USER, $key, true);
  35. 35.  Масштабирование
  36. 36. Принцип шардинга 0 ... 10М 0 ... 10М 10 ... 20М 10 ... 20М 20 ... 30М 20 ... 30М
  37. 37. Реализация  шардинга Tarantool Proxy 0 ... 10М Server 1Application Tarantool Proxy 10 ... 20М Server 2 20 ... 30М Server 3
  38. 38. Tarantool ProxyПредставляет многопоточный демон, перенаправляющий запросы на Tarantool сервера.Определение номера сервера:•  По конфигу или•  С помощью плагина
  39. 39. Tarantool Proxy: Операции с первичным ключом Server 1•  INSERT•  UPDATE Tarantool Proxy Server 2•  DELETE•  SELECT * BY PK Server 3
  40. 40. Tarantool Proxy: Операции со вторичным ключомSELECT * FROM T1 Server 1WHERE k1=… Tarantool Proxy Server 2 Server 3
  41. 41.    Александр Календарёвakalend@mail.ru@akalend http://githab.com/akalendhttp://akalend.habrahabr.ru/blog

×