• Like
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Upcoming SlideShare
Loading in...5
×

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

  • 1,962 views
Uploaded on

Презентация к докладу на HiLoad++ …

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,962
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
18
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Шаблоны структур данных  NoSQL  на примере  Tarantool    Александр Календарёв
  • 2.  План  Коротко паттернах   Структуры данных в Tarantool  РНР Интерфейс    Реализация Паттернов данных  Масштабирование
  • 3. Виды паттернов   Системной архитектуры  Кодирования  Структур данных (РСУБД)     Паттерны данных NoSQL
  • 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. Структура данных Tarantool  Namespace (Пространство имен)  Tuple (Кортеж)   Field (Поле)  Index (Индекс)
  • 6. Аналог структур данных  Namespace -   Таблица  РСУБД  Field – Колонка (столбец) РСУБД
  • 7. Структура данных TarantoolТипы полей   Num  Num64   String
  • 8. Структура данных TarantoolТипы  индексов  Hash / Tree  Простой / Составной
  • 9. Операции в Tarantool  INSERT  SELECT  UPDATE  DELETE
  • 10. PHP  интерфейс ‐ Конструктор               Tarantool$tnt = new Tarantool($host,$port,$admPort);$host – хост (def: localhost);$port – порт (def: 33013);$admPort – административный порт (33015).
  • 11. PHP  интерфейс ‐  INSERT               Tarantooldefine( ‘NS’,0); // номер namespace$tnt = new Tarantool();$tuple = array(12345,‘spb’,’Hello Word’);$res = $tnt->insert(NS, $tuple);Если данные существуют – они замещаютсяВозвращается результат true- успех / false...
  • 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. 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. 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. 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. 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. PHP  интерфейс – прочие методы   TarantoolgetTuple() – возвращает данные методов select() и mselect();getError() – описание ошибки последней операцииgetConf() – конфигурационный файл сервераgetInfo() – переменные сервераgetStat() – информация по статистики сервера
  • 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. Паттерн: справочник   реализация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. Паттерн: обратный справочник 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. Паттерн: обратный справочник реализацияdefine(‘IDX_NAME’, 1);$key = ’Маня’;$res = $tnt->select(NS, IDX_NAME, $key);if($res===false) echo $tnt->getError();else print_r( $tnt->getTuple());
  • 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. Паттерн: справочник с разделами  реализация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. Паттерн: справочник с разделами  выборка по нескольким разделам 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. Паттерн: Матрица  x M ХМатрица [M x N]Po = (x,y) y PoKey = y * M + x N Y
  • 26. Паттерн: Матрица Задача: выбор области  x M Х w y Po р h N Y
  • 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. Паттерн: Автоинкрементная таблица 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. Паттерн: Автоинкрементная таблица реализация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. Паттерн: Отношение многие ко многим Подход 1: создать Ns с двумя полямииспользовать составной индексПодход 2: использовать первичный индекс num64Первая часть слова user_id, вторая часть map_id
  • 31. Паттерн: Многие ко многим реализация варианта 2define(NS_USER_TO_MAP, 3);$key= $user_id << 32 + $map_id$res=$tnt->select(NS_USER_TO_MAP, PK,$key);
  • 32. Паттерн: Очередь PK ... Data 1 Begin Pointer Data 2 End Pointer Data 3Принцип FIFO - Первый пришел, первый ушелРеализуется через два указателя на начало и конец очереди
  • 33. Паттерн: Очередь добавление в очередьdefine(BEG_PTR, 4); // номер ключа Beg Pointer$key= $tnt->inc(NS, BEG_PTR, FD_COUNTER,1,true);$tnt->insert(NS_USER, $data);
  • 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.  Масштабирование
  • 36. Принцип шардинга 0 ... 10М 0 ... 10М 10 ... 20М 10 ... 20М 20 ... 30М 20 ... 30М
  • 37. Реализация  шардинга Tarantool Proxy 0 ... 10М Server 1Application Tarantool Proxy 10 ... 20М Server 2 20 ... 30М Server 3
  • 38. Tarantool ProxyПредставляет многопоточный демон, перенаправляющий запросы на Tarantool сервера.Определение номера сервера:•  По конфигу или•  С помощью плагина
  • 39. Tarantool Proxy: Операции с первичным ключом Server 1•  INSERT•  UPDATE Tarantool Proxy Server 2•  DELETE•  SELECT * BY PK Server 3
  • 40. Tarantool Proxy: Операции со вторичным ключомSELECT * FROM T1 Server 1WHERE k1=… Tarantool Proxy Server 2 Server 3
  • 41.    Александр Календарёвakalend@mail.ru@akalend http://githab.com/akalendhttp://akalend.habrahabr.ru/blog