Велосипедостраительство в NoSQL, строим собственное NoSQL хранилище
1. Когда надо изобретать свой велосипед?
Строим NoSQL хранилище в приемлемые
сроки
Календарев Александр
Программист РБК-Медиа
akalend@mail.ru
2013
dev.it-portfolio.net
2. О чём доклад
-
о велосипедах
NoSQL
key/value хранилищах
это очень просто
Сделай сам
dev.it-portfolio.net
2
6. О велосипедах
- Под конкретные условия местности свой
велосипед
- Велосипеды эволюционирует, как впрочем и
все на свете, в том числе системы хранения
данных
- Следовательно, всегда полезно думать над их
улучшением
- Значить, и стоит пытаться изобрести что-то
новое
dev.it-portfolio.net
6
7. О велосипедах
- Под конкретные условия местности свой
велосипед
- Велосипеды эволюционирует, как впрочем и
все на свете, в том числе системы хранения
данных
- Следовательно, всегда полезно думать над их
улучшением
- Значить, и стоит пытаться изобрести что-то
новое
- Или украсть идею и приспособить под свои
нужды
dev.it-portfolio.net
7
10. О велосипедах
- Может получиться
- А может и нет
- Это как повезет
dev.it-portfolio.net
10
11. О велосипедах
- Может получиться
- А может и нет
- Но в любом случае Вы
всегда останетесь в
плюсе:
- получите новый опыт и
знание
dev.it-portfolio.net
11
12. О чём доклад
-
о велосипедах
NoSQL
key/value хранилищах
это очень просто
Сделай сам
dev.it-portfolio.net
12
13. NoSQL
- Термин озвучен 1991 Carlo Strozzi
- Carlo Strozzi 1998 представил ”NoSQL
RDBMS, Copyright (C)”, язык запросов 4GL
- 2009 на “Open Source” Конференции
применили этот термин ко всем
хранилищам, не относящимся к RDBMS
dev.it-portfolio.net
13
15. Документно-ориентированные
- Данные представлены в виде документов
- Форматы документы:
- XML: BerkeleyXML (XQuery), Sedna, Tamino (XQL)
- JSON/BSON: MondoDb(BSON), CoachDb(JSON)
- msgpack: Kumofs, tarantool 2.0
Рекомендуется использовать для слабо
структурированной информации
dev.it-portfolio.net
15
16. Key/value хранилища
Key-value хранилища запоминают и
извлекают документы по ключу.
Распределенные хеш-таблицы (DHT)
Пример: Riak, Voldemort, aerospike
Key/value хранилищa
Пример: Redis, Tokyo/Kyoto Tyrant , tarantool
1.5, MemcacheDb
dev.it-portfolio.net
16
17. Поколоночные БД
- Данные собраны в колонки и представляют
собой хеш таблицы.
dev.it-portfolio.net
17
18. Поколоночные БД
Преимущества:
- быстрая вставка,
- где документ представляем много колонок
- агрегирующие запросы в разы выше
Примеры: MonetDb, Accumulo, Vertica, Teradata
Недостаток: сложность загрузки данных
Cassandra, Hbase – не имеют поколоночную
модель данных (технология SSTAble)
dev.it-portfolio.net
18
19. Графовые БД
Данные в виде сетевой модели
Пример: Neo4, InfoGrid, GraphBase, DEX
dev.it-portfolio.net
19
20. NoSQL сравнение моделей хранения
key/value
RDBMS
документно-ориентированные
поколоночно-ориентированные
dev.it-portfolio.net
20
21. О чём доклад
-
о велосипедах
NoSQL
key/value хранилищах
это очень просто
Сделай сам
dev.it-portfolio.net
21
22. Key/Value Хранилище
- Index и Массива данных (bucket)
- Сетевой части
- Вспомогательных Tools :
- Конфигурация
- Репликация
- Мониторинг
dev.it-portfolio.net
22
24. Index
- Hash (хеш)
- Теоретически доступ/вставка за пост время: O(a)
- Поиск строго по ключу (операция равно).
- BTree (двоичное дерево)
- Поиск по диапазону
- Теоретически доступ за O(log2(n) ÷ n) или O(h)
- Удаление – очень дорого O(l *log2(n) )
Недостаток: разбалансировка
Разновидности: Btree+, AVL-Tree, RB-tree, 2-3-tree …
dev.it-portfolio.net
24
25. Hash таблица
f = crc32(key) % n
Хеш-функция:
crc32/64, md5, Jenkins,
Murmur
Масив данных [bucket]
для хранения
dev.it-portfolio.net
25
26. Hash таблица
Так как объем Банк
данных конечный, то
возможна коллизия:
Sabdra Dee & John
Smeet
dev.it-portfolio.net
26
27. Hash
Хеш таблицу характеризуют
– Ёмкость bucket
– Разреженность массива
– Длинна элемента массива
f = key % n
коллизия
Key 1
Хеш функция
Длинные
данные
Данные
Key 51
Данные
Key 2
Длинные данные . . . . . .
Длинные Данные часть II
dev.it-portfolio.net
27
28. О чём доклад
-
о велосипедах
NoSQL
key/value хранилищах
это очень просто , cделай сам
dev.it-portfolio.net
28
29. Что надо сделать?
- Понять требования
- Изучить существующие решения
- Найти подходящее API:
-
BerkeleyDb
dict, qhash,
Tokyo Cabinet
LevelDb
Sophia
dev.it-portfolio.net
29
30. Что надо сделать?
-
Понять требования
Изучить существующие решения
Найти подходящее API
Сделать тесты
Выбрать сетевую модель:
-
Однотредовая (corotine)/многотредовая модель
block/nonblock: select, poll, epoll, kqueue
libevent, libev (взять существующие библ.)
Найти готовый кусок кода
dev.it-portfolio.net
30
31. Что надо сделать?
-
Понять требования
Изучить существующие решения
Найти подходящее API
Сделать тесты
Выбрать сетевую модель
Определиться с протоколом.
dev.it-portfolio.net
31
33. О проекте (функциональная часть)
-
Просмотр и поиск анкет
Система сообщений
Голосовалки
Симпатии, Лайки
Сбор статистики
Геосервис : кто рядом.
dev.it-portfolio.net
33
38. Что хотелось?
- Простую функциональность:
- get(key)
- set(key)
- increment ( key )
- Кандидаты:
redis – можно использовать через Хеши
tarantool – удобный встроенный API (Lua)
dev.it-portfolio.net
38
39. Что хотелось?
- Простую функциональность;
get/set, Increment ( key1 , key2 )
- Персистентность
если упало, то данные не потерялись
dev.it-portfolio.net
39
40. Что хотелось?
- Простую функциональность
- Персистентность
- Что-то не сложное и быстрое
- не занимающее много места
- MongoDb такое же сложное, как MySQL
dev.it-portfolio.net
40
42. Протокол
- Разработать свой
Преимущества: учтены все особенности
- Взять существующий
Преимущества: не нужно разрабатывать клиенты
Недостатки: необходимо расширение, доработка под
свои особенности
dev.it-portfolio.net
42
45. Расширяем протокол
- Добавляем новые служебные команды:
- FLUSH ˽ 1rn
- SHOW INIrn
- STAT CLEAR rn
- Расширяем существующие команды через
ключ:
- key: prefix.key[.subkey]
- Вводим понятие относительная адресация /
- Вводим понятие символьный вид #
dev.it-portfolio.net
45
46. Философия построения хранилища
- Используем понятие «Банк данных»
Банк данных – обособленный массив
данных, место для хранения (bucket)
- Разбиваем данные по функциональности:
лайки, голосования, просмотры
- Каждой сущности по своему банку.
- Номер банка определен префиксом ключа
dev.it-portfolio.net
46
47. Принцип построения хранилища
Номер банка определен префиксом ключа
Key prefix
32 bit
``
key
32 bit
Банк 1
GET 1.23456
Банк 2
GET 3.23456
GET 2.23456
Банк 3
dev.it-portfolio.net
47
48. Принцип построения хранилища
Номер банка определен префиксом ключа
Несколько банков могут быть объединены в
одну физическую хеш таблицу
(определяется конфигом)
Достоинство такого распределения:
• уменьшаем нагрузку на каждую хеш таблицу
• Шаг к масштабированию
• Распределение по типу использования
dev.it-portfolio.net
48
49. Типы банков
-
Бинарные данные
Символьные данные
Счетчики [4 байта]
«Индексные данные» на базе RB-tree
Индексные данные могут быть привязаны к
счетчикам
Привязка осуществляется в конфиге.
dev.it-portfolio.net
49
53. Реализация лайка
- Вариант 1, как сортированный массив.
- Доступ за ln(n), n = 100 – 4 000 ( 7-14 шагов )
- Трудности с алгоритмом Garbage Collector.
- Вариант 2, используем Tree индекс
- Индекс составной 64 bit: key1 `` key2
32 bit
32 bit
- Выборка диапазона Key1 0x00 - Key1 0xFFFFFFFF
dev.it-portfolio.net
53
54. Расширяем протокол
Вводим понятие символьный вид #
Запомнили в символьном виде:
SET ˽ #1.5 ˽0˽0˽1rn1rn
GET ˽ #1.5 rn вернет символ “1” – 1 байт
GET ˽ 1.5 rn вернет int32: 0x1 – 4 байта
SET ˽ 1.5 ˽0˽0˽1rn1rn
GET ˽ 1.5 rn вернет int32: 0x31
Пригодится в отладке типа index
dev.it-portfolio.net
54
55. чистка мусора (garbage collector)
Удаленные профили
нужно удалять из хранилища
Требуется перебор всех данных
Делается, блоками, когда
процессор наименее загружен
Вычисляем загрузку сервиса,
Подбираем опытным путем.
dev.it-portfolio.net
55
56. Проблемы
- Удаленные профили надо чистить
- Постоянно растет память, нужно
сбрасывать кеш, переоткрывать таблицы
- Вывод: Необходим мониторинг
dev.it-portfolio.net
56
58. Мониторинг
- Память из /proc/self/stat
- Производительность: кол-во запросов в сек
- Загрузка: отношение времени исполнения к
циклу измерения
- Размер корзины
- Общее кол-во ключей
dev.it-portfolio.net
58
64. Рекомендуем почитать
Блог о высоких нагрузках
http://highloadblog.ru/
http://ru.wikipedia.org/wiki/Хеш-таблица
http://ru.wikipedia.org/wiki/B-дерево
Алгоритмы и структуры http://algolist.ru/
Опыт создания key/value хранилищ
СА сент,окт,нояб,дек 2012, март 2013.
dev.it-portfolio.net
64
65. Вопросы
Q:
Open Source ?
A:
в полной версии нет, не вижу смысла
есть прототип, который можно заточить под
любые нужды вашего проекта
https://github.com/akalend/mymc
dev.it-portfolio.net
65