SlideShare a Scribd company logo
1 of 65
Download to read offline
Когда надо изобретать свой велосипед?
Строим NoSQL хранилище в приемлемые
сроки
Календарев Александр
Программист РБК-Медиа
akalend@mail.ru

2013

dev.it-portfolio.net
О чём доклад
-

о велосипедах
NoSQL
key/value хранилищах
это очень просто
Сделай сам

dev.it-portfolio.net

2
О велосипедах

dev.it-portfolio.net

3
О велосипедах

dev.it-portfolio.net

4
О велосипедах

dev.it-portfolio.net

5
О велосипедах
- Под конкретные условия местности свой
велосипед
- Велосипеды эволюционирует, как впрочем и
все на свете, в том числе системы хранения
данных
- Следовательно, всегда полезно думать над их
улучшением
- Значить, и стоит пытаться изобрести что-то
новое
dev.it-portfolio.net

6
О велосипедах
- Под конкретные условия местности свой
велосипед
- Велосипеды эволюционирует, как впрочем и
все на свете, в том числе системы хранения
данных
- Следовательно, всегда полезно думать над их
улучшением
- Значить, и стоит пытаться изобрести что-то
новое
- Или украсть идею и приспособить под свои
нужды
dev.it-portfolio.net

7
О велосипедах
- Может получиться

dev.it-portfolio.net

8
О велосипедах
- Может получиться
- А может и нет

dev.it-portfolio.net

9
О велосипедах
- Может получиться
- А может и нет
- Это как повезет

dev.it-portfolio.net

10
О велосипедах
- Может получиться
- А может и нет
- Но в любом случае Вы
всегда останетесь в
плюсе:
- получите новый опыт и
знание

dev.it-portfolio.net

11
О чём доклад
-

о велосипедах
NoSQL
key/value хранилищах
это очень просто
Сделай сам

dev.it-portfolio.net

12
NoSQL
- Термин озвучен 1991 Carlo Strozzi
- Carlo Strozzi 1998 представил ”NoSQL
RDBMS, Copyright (C)”, язык запросов 4GL
- 2009 на “Open Source” Конференции
применили этот термин ко всем
хранилищам, не относящимся к RDBMS

dev.it-portfolio.net

13
-

Документно-ориентированные БД
Key/value хранилища
Поколоночные БД
Графовые БД

Подробнее

http://nosql-database.org/

dev.it-portfolio.net

14
Документно-ориентированные
- Данные представлены в виде документов
- Форматы документы:
- XML: BerkeleyXML (XQuery), Sedna, Tamino (XQL)
- JSON/BSON: MondoDb(BSON), CoachDb(JSON)
- msgpack: Kumofs, tarantool 2.0

Рекомендуется использовать для слабо
структурированной информации

dev.it-portfolio.net

15
Key/value хранилища
Key-value хранилища запоминают и
извлекают документы по ключу.
Распределенные хеш-таблицы (DHT)
Пример: Riak, Voldemort, aerospike
Key/value хранилищa
Пример: Redis, Tokyo/Kyoto Tyrant , tarantool
1.5, MemcacheDb
dev.it-portfolio.net

16
Поколоночные БД
- Данные собраны в колонки и представляют
собой хеш таблицы.

dev.it-portfolio.net

17
Поколоночные БД
Преимущества:
- быстрая вставка,
- где документ представляем много колонок
- агрегирующие запросы в разы выше
Примеры: MonetDb, Accumulo, Vertica, Teradata
Недостаток: сложность загрузки данных
Cassandra, Hbase – не имеют поколоночную
модель данных (технология SSTAble)
dev.it-portfolio.net

18
Графовые БД
Данные в виде сетевой модели

Пример: Neo4, InfoGrid, GraphBase, DEX
dev.it-portfolio.net

19
NoSQL сравнение моделей хранения
key/value

RDBMS

документно-ориентированные

поколоночно-ориентированные

dev.it-portfolio.net

20
О чём доклад
-

о велосипедах
NoSQL
key/value хранилищах
это очень просто
Сделай сам

dev.it-portfolio.net

21
Key/Value Хранилище
- Index и Массива данных (bucket)
- Сетевой части
- Вспомогательных Tools :
- Конфигурация
- Репликация
- Мониторинг

dev.it-portfolio.net

22
Index + Bucket

dev.it-portfolio.net

23
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
Hash таблица
f = crc32(key) % n

Хеш-функция:
crc32/64, md5, Jenkins,
Murmur

Масив данных [bucket]
для хранения

dev.it-portfolio.net

25
Hash таблица

Так как объем Банк
данных конечный, то
возможна коллизия:
Sabdra Dee & John
Smeet

dev.it-portfolio.net

26
Hash
Хеш таблицу характеризуют
– Ёмкость bucket
– Разреженность массива
– Длинна элемента массива
f = key % n

коллизия
Key 1

Хеш функция

Длинные
данные

Данные

Key 51

Данные

Key 2

Длинные данные . . . . . .
Длинные Данные часть II

dev.it-portfolio.net

27
О чём доклад
-

о велосипедах
NoSQL
key/value хранилищах
это очень просто , cделай сам

dev.it-portfolio.net

28
Что надо сделать?
- Понять требования
- Изучить существующие решения
- Найти подходящее API:
-

BerkeleyDb
dict, qhash,
Tokyo Cabinet
LevelDb
Sophia
dev.it-portfolio.net

29
Что надо сделать?
-

Понять требования
Изучить существующие решения
Найти подходящее API
Сделать тесты
Выбрать сетевую модель:
-

Однотредовая (corotine)/многотредовая модель
block/nonblock: select, poll, epoll, kqueue
libevent, libev (взять существующие библ.)
Найти готовый кусок кода
dev.it-portfolio.net

30
Что надо сделать?
-

Понять требования
Изучить существующие решения
Найти подходящее API
Сделать тесты
Выбрать сетевую модель
Определиться с протоколом.

dev.it-portfolio.net

31
О проекте
-

Служба знакомств
50 млн. анкет
25 млн. активных
25-90 тыс. сессий

dev.it-portfolio.net

32
О проекте (функциональная часть)
-

Просмотр и поиск анкет
Система сообщений
Голосовалки
Симпатии, Лайки
Сбор статистики
Геосервис : кто рядом.

dev.it-portfolio.net

33
Что хотелось хранить?
-

Результаты голосований
Лайки
Информация о просмотрах (счетчики)
Геоданные

dev.it-portfolio.net

34
Лайки, голосовалки, просмотры
Counter: 1

Alice

Кто : 01

Bob: 01

dev.it-portfolio.net

35
Лайки, голосовалки, просмотры
Counter: 2

Alice

Кто : 01, 02

Bob: 01
Carol : 02

dev.it-portfolio.net

36
Лайки, голосовалки, просмотры
Counter: 3

Alice

Кто : 01, 02, 05

Bob: 01
Carol : 02
Carlos : 05
dev.it-portfolio.net

37
Что хотелось?
- Простую функциональность:
- get(key)
- set(key)
- increment ( key )
- Кандидаты:
redis – можно использовать через Хеши
tarantool – удобный встроенный API (Lua)

dev.it-portfolio.net

38
Что хотелось?
- Простую функциональность;
get/set, Increment ( key1 , key2 )
- Персистентность
если упало, то данные не потерялись

dev.it-portfolio.net

39
Что хотелось?
- Простую функциональность
- Персистентность
- Что-то не сложное и быстрое
- не занимающее много места
- MongoDb такое же сложное, как MySQL

dev.it-portfolio.net

40
Что хотелось?
-

Простую функциональность:
Персистентность
Что-то не сложное
Не memory-only
- вдруг не хватит места:
- redis, tarantool не подходят
- Tokyo Tyrant – сложно реализовать лайки

dev.it-portfolio.net

41
Протокол
- Разработать свой
Преимущества: учтены все особенности

- Взять существующий
Преимущества: не нужно разрабатывать клиенты
Недостатки: необходимо расширение, доработка под
свои особенности

dev.it-portfolio.net

42
Протокол взять существующий
- Бинарный: protobuf, msgpack, memcached-bin,
Apache-thrift, Apache-Avro, BSON,…
компактнее, быстрее, сложнее отладка

- Текстовый: XML, JSON, memcached, redis, …
Проще отладка

Есть утилиты: telnet, nc, memget, redis-cli

dev.it-portfolio.net

43
Протокол memcached
-

GET ˽ [key] rn
SET ˽ [key] ˽ [flag] ˽ [expire] ˽ [bytes] rn
INCR ˽ [key] ˽ [value] ˽ [NOREPLAY] rn
DELETE ˽ [key] ˽ [NOREPLAY] rn
STATS rn
FLUSH_ALLrn

dev.it-portfolio.net

44
Расширяем протокол
- Добавляем новые служебные команды:
- FLUSH ˽ 1rn
- SHOW INIrn
- STAT CLEAR rn

- Расширяем существующие команды через
ключ:
- key: prefix.key[.subkey]
- Вводим понятие относительная адресация /
- Вводим понятие символьный вид #
dev.it-portfolio.net

45
Философия построения хранилища
- Используем понятие «Банк данных»
Банк данных – обособленный массив
данных, место для хранения (bucket)
- Разбиваем данные по функциональности:
лайки, голосования, просмотры
- Каждой сущности по своему банку.
- Номер банка определен префиксом ключа

dev.it-portfolio.net

46
Принцип построения хранилища
Номер банка определен префиксом ключа
Key prefix
32 bit

``

key
32 bit
Банк 1

GET 1.23456

Банк 2

GET 3.23456
GET 2.23456

Банк 3

dev.it-portfolio.net

47
Принцип построения хранилища
Номер банка определен префиксом ключа
Несколько банков могут быть объединены в
одну физическую хеш таблицу
(определяется конфигом)
Достоинство такого распределения:
• уменьшаем нагрузку на каждую хеш таблицу
• Шаг к масштабированию
• Распределение по типу использования

dev.it-portfolio.net

48
Типы банков
-

Бинарные данные
Символьные данные
Счетчики [4 байта]
«Индексные данные» на базе RB-tree
Индексные данные могут быть привязаны к
счетчикам
Привязка осуществляется в конфиге.

dev.it-portfolio.net

49
Реализация счетчика просмотров

Счетчики просмотров:
INCR ˽ 1.5 ˽ 1 rn
ключ анкеты = 5
SET˽ 1.5 ˽ 0 ˽ 0 ˽ 1 rn 0 rn
сброс
50
Реализация лайка
Alice
Bob:01

- Увеличение счетчика Алисы :
INCR ˽ 1.5 ˽ 1 rn
ключ Алисы = 5
- Добавляем в хеш Алисы ключ Боба:
SET ˽ 2.5.1 ˽0˽0˽1rn1rn ключ Боба = 1
dev.it-portfolio.net

51
Реализация лайка
Alice
Bob:01

Однако если расширить протокол:
INCR ˽ 2.5.1/1 ˽ 1 rn
key

Вместо двух обращений – одно.
dev.it-portfolio.net

52
Реализация лайка
- Вариант 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
Расширяем протокол
Вводим понятие символьный вид #
Запомнили в символьном виде:
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
чистка мусора (garbage collector)
Удаленные профили
нужно удалять из хранилища
Требуется перебор всех данных
Делается, блоками, когда
процессор наименее загружен
Вычисляем загрузку сервиса,
Подбираем опытным путем.
dev.it-portfolio.net

55
Проблемы
- Удаленные профили надо чистить
- Постоянно растет память, нужно
сбрасывать кеш, переоткрывать таблицы
- Вывод: Необходим мониторинг

dev.it-portfolio.net

56
Мониторинг
- Команда stats
- Настраиваем rdd
- Рисуем графики

dev.it-portfolio.net

57
Мониторинг
- Память из /proc/self/stat
- Производительность: кол-во запросов в сек
- Загрузка: отношение времени исполнения к
циклу измерения
- Размер корзины
- Общее кол-во ключей

dev.it-portfolio.net

58
Мониторинг

dev.it-portfolio.net

59
Тестирование
API покрыли тестами Схх http://cxxtest.com
Тестирование производительности:
aналог Apache ab, протокол memcached
https://github.com/akalend/mcstrass

dev.it-portfolio.net

60
Используемые Библиотеки
libev – сетевая однотредовая модель
libtokyocabinet – hashdb & treedb
tcmalloc - Memory pool allocator

dev.it-portfolio.net

61
Рекомендуемые Библиотеки
Сетевые:
libevent2 http://libevent.org/
libev
http://software.schmorp.de/pkg/libev.html

Коротины:
libcoro http://software.schmorp.de/pkg/libcoro.html
pcl
http://xmailserver.org/libpcl.html
libtask http://swtch.com/libtask/

dev.it-portfolio.net

62
Рекомендуемые Библиотеки
Хештаблицы:
Tokyo/Kyoto http://fallabs.com/ [cabinet]
libdict
https://github.com/fmela/libdic
strmap
http://pokristensson.com/strmap.html
sglib
http://sglib.sourceforge.net/
Judy
http://judy.sourceforge.net/
levelDb
http://code.google.com/p/leveldb/
Sophia
http://sphia.org/
uthash http://troydhanson.github.io/uthash/index.html
sunriseDb http://www.sunrisetel.net/software/devtools/sunrise-datadictionary.shtml
dev.it-portfolio.net

63
Рекомендуем почитать
Блог о высоких нагрузках
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
Вопросы
Q:

Open Source ?

A:

в полной версии нет, не вижу смысла
есть прототип, который можно заточить под
любые нужды вашего проекта
https://github.com/akalend/mymc

dev.it-portfolio.net

65

More Related Content

What's hot

Новые возможности распределенной обработки данных в памяти (Coherence)
Новые возможности распределенной обработки данных в памяти (Coherence)Новые возможности распределенной обработки данных в памяти (Coherence)
Новые возможности распределенной обработки данных в памяти (Coherence)Andrey Akulov
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Ontico
 
Devconf2013 new-features-in-mysql-and-mariadb
Devconf2013 new-features-in-mysql-and-mariadbDevconf2013 new-features-in-mysql-and-mariadb
Devconf2013 new-features-in-mysql-and-mariadbSergey Petrunya
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_drupalconf
 
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...Ontico
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Ilyas Salikhov
 
андрей паньгин
андрей паньгинандрей паньгин
андрей паньгинkuchinskaya
 
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...CUBRID
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...phpdevby
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview ReleaseDenis Shestakov
 
Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Yandex
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»e-Legion
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)Ontico
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"Technopark
 
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Oleg Tsarev
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. SparkTechnopark
 
Что нужно знать о трёх топовых фичах MySQL
Что нужно знать  о трёх топовых фичах  MySQLЧто нужно знать  о трёх топовых фичах  MySQL
Что нужно знать о трёх топовых фичах MySQLSveta Smirnova
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхVasil Remeniuk
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Alexey Zinoviev
 
"PostgreSQL для разработчиков приложений", Павел Лузанов, (Постгрес Профессио...
"PostgreSQL для разработчиков приложений", Павел Лузанов, (Постгрес Профессио..."PostgreSQL для разработчиков приложений", Павел Лузанов, (Постгрес Профессио...
"PostgreSQL для разработчиков приложений", Павел Лузанов, (Постгрес Профессио...Badoo Development
 

What's hot (20)

Новые возможности распределенной обработки данных в памяти (Coherence)
Новые возможности распределенной обработки данных в памяти (Coherence)Новые возможности распределенной обработки данных в памяти (Coherence)
Новые возможности распределенной обработки данных в памяти (Coherence)
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
 
Devconf2013 new-features-in-mysql-and-mariadb
Devconf2013 new-features-in-mysql-and-mariadbDevconf2013 new-features-in-mysql-and-mariadb
Devconf2013 new-features-in-mysql-and-mariadb
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
 
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2
 
андрей паньгин
андрей паньгинандрей паньгин
андрей паньгин
 
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
 
Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Что нужно знать о трёх топовых фичах MySQL
Что нужно знать  о трёх топовых фичах  MySQLЧто нужно знать  о трёх топовых фичах  MySQL
Что нужно знать о трёх топовых фичах MySQL
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событиях
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
 
"PostgreSQL для разработчиков приложений", Павел Лузанов, (Постгрес Профессио...
"PostgreSQL для разработчиков приложений", Павел Лузанов, (Постгрес Профессио..."PostgreSQL для разработчиков приложений", Павел Лузанов, (Постгрес Профессио...
"PostgreSQL для разработчиков приложений", Павел Лузанов, (Постгрес Профессио...
 

Similar to Велосипедостраительство в NoSQL, строим собственное NoSQL хранилище

Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrusAlex Chistyakov
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...IT-Portfolio
 
Software Analytics in frontend
Software Analytics in frontendSoftware Analytics in frontend
Software Analytics in frontendDenis Kolesnikov
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновOntico
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned Alexander Syrotenko
 
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...IT-Portfolio
 
Dev {highload}. When you should do your own db.
Dev {highload}. When you should do your own db.Dev {highload}. When you should do your own db.
Dev {highload}. When you should do your own db.Oleg Kwerty
 
Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"Yandex
 
My Open Source (Sept 2017)
My Open Source (Sept 2017)My Open Source (Sept 2017)
My Open Source (Sept 2017)Roman Dvornov
 
Построение системы аналитики
Построение системы аналитикиПостроение системы аналитики
Построение системы аналитикиИлья Середа
 
Наташа Арефьева — Семантика или смерть
Наташа Арефьева — Семантика или смертьНаташа Арефьева — Семантика или смерть
Наташа Арефьева — Семантика или смертьYandex
 
Выступление Сергея Аверина, Badoo, на High Performance Conference
Выступление Сергея Аверина, Badoo, на High Performance ConferenceВыступление Сергея Аверина, Badoo, на High Performance Conference
Выступление Сергея Аверина, Badoo, на High Performance ConferenceEYevseyeva
 
Не все базы данных одинаково полезны
Не все базы данных одинаково полезныНе все базы данных одинаково полезны
Не все базы данных одинаково полезныSergey Xek
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)Pavel Tsukanov
 
Не все базы данных одинаково полезны
Не все базы данных одинаково полезныНе все базы данных одинаково полезны
Не все базы данных одинаково полезныSergey Xek
 
Денис Иванов
Денис ИвановДенис Иванов
Денис ИвановCodeFest
 
Open source субд глазами обычного программиста
Open source субд глазами обычного программистаOpen source субд глазами обычного программиста
Open source субд глазами обычного программистаSlach
 
Top-10 популярных вопросов администраторам баз данных или почему я против св...
Top-10  популярных вопросов администраторам баз данных или почему я против св...Top-10  популярных вопросов администраторам баз данных или почему я против св...
Top-10 популярных вопросов администраторам баз данных или почему я против св...Ilya Kosmodemiansky
 

Similar to Велосипедостраительство в NoSQL, строим собственное NoSQL хранилище (20)

Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
2 bdw.key
2 bdw.key2 bdw.key
2 bdw.key
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
 
Software Analytics in frontend
Software Analytics in frontendSoftware Analytics in frontend
Software Analytics in frontend
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...
 
Dev {highload}. When you should do your own db.
Dev {highload}. When you should do your own db.Dev {highload}. When you should do your own db.
Dev {highload}. When you should do your own db.
 
Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"
 
My Open Source (Sept 2017)
My Open Source (Sept 2017)My Open Source (Sept 2017)
My Open Source (Sept 2017)
 
Построение системы аналитики
Построение системы аналитикиПостроение системы аналитики
Построение системы аналитики
 
Наташа Арефьева — Семантика или смерть
Наташа Арефьева — Семантика или смертьНаташа Арефьева — Семантика или смерть
Наташа Арефьева — Семантика или смерть
 
Выступление Сергея Аверина, Badoo, на High Performance Conference
Выступление Сергея Аверина, Badoo, на High Performance ConferenceВыступление Сергея Аверина, Badoo, на High Performance Conference
Выступление Сергея Аверина, Badoo, на High Performance Conference
 
Не все базы данных одинаково полезны
Не все базы данных одинаково полезныНе все базы данных одинаково полезны
Не все базы данных одинаково полезны
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
Не все базы данных одинаково полезны
Не все базы данных одинаково полезныНе все базы данных одинаково полезны
Не все базы данных одинаково полезны
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
Little Service in 2h
Little Service in 2hLittle Service in 2h
Little Service in 2h
 
Open source субд глазами обычного программиста
Open source субд глазами обычного программистаOpen source субд глазами обычного программиста
Open source субд глазами обычного программиста
 
Top-10 популярных вопросов администраторам баз данных или почему я против св...
Top-10  популярных вопросов администраторам баз данных или почему я против св...Top-10  популярных вопросов администраторам баз данных или почему я против св...
Top-10 популярных вопросов администраторам баз данных или почему я против св...
 

More from Alexandre Kalendarev

шардинг на коленке
шардинг на коленкешардинг на коленке
шардинг на коленкеAlexandre Kalendarev
 
Очереди и блокировки
Очереди и блокировкиОчереди и блокировки
Очереди и блокировкиAlexandre Kalendarev
 
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolПаттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolAlexandre Kalendarev
 

More from Alexandre Kalendarev (6)

шардинг на коленке
шардинг на коленкешардинг на коленке
шардинг на коленке
 
Рецепты RabbitMQ
Рецепты RabbitMQ Рецепты RabbitMQ
Рецепты RabbitMQ
 
Очереди и блокировки
Очереди и блокировкиОчереди и блокировки
Очереди и блокировки
 
PHP daemons into social games
PHP daemons into social gamesPHP daemons into social games
PHP daemons into social games
 
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolПаттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере Tarantool
 
TreeDb key/value noSQL database
TreeDb key/value noSQL databaseTreeDb key/value noSQL database
TreeDb key/value noSQL database
 

Велосипедостраительство в 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
  • 8. О велосипедах - Может получиться dev.it-portfolio.net 8
  • 9. О велосипедах - Может получиться - А может и нет dev.it-portfolio.net 9
  • 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
  • 14. - Документно-ориентированные БД Key/value хранилища Поколоночные БД Графовые БД Подробнее http://nosql-database.org/ dev.it-portfolio.net 14
  • 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
  • 32. О проекте - Служба знакомств 50 млн. анкет 25 млн. активных 25-90 тыс. сессий dev.it-portfolio.net 32
  • 33. О проекте (функциональная часть) - Просмотр и поиск анкет Система сообщений Голосовалки Симпатии, Лайки Сбор статистики Геосервис : кто рядом. dev.it-portfolio.net 33
  • 34. Что хотелось хранить? - Результаты голосований Лайки Информация о просмотрах (счетчики) Геоданные dev.it-portfolio.net 34
  • 35. Лайки, голосовалки, просмотры Counter: 1 Alice Кто : 01 Bob: 01 dev.it-portfolio.net 35
  • 36. Лайки, голосовалки, просмотры Counter: 2 Alice Кто : 01, 02 Bob: 01 Carol : 02 dev.it-portfolio.net 36
  • 37. Лайки, голосовалки, просмотры Counter: 3 Alice Кто : 01, 02, 05 Bob: 01 Carol : 02 Carlos : 05 dev.it-portfolio.net 37
  • 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
  • 41. Что хотелось? - Простую функциональность: Персистентность Что-то не сложное Не memory-only - вдруг не хватит места: - redis, tarantool не подходят - Tokyo Tyrant – сложно реализовать лайки dev.it-portfolio.net 41
  • 42. Протокол - Разработать свой Преимущества: учтены все особенности - Взять существующий Преимущества: не нужно разрабатывать клиенты Недостатки: необходимо расширение, доработка под свои особенности dev.it-portfolio.net 42
  • 43. Протокол взять существующий - Бинарный: protobuf, msgpack, memcached-bin, Apache-thrift, Apache-Avro, BSON,… компактнее, быстрее, сложнее отладка - Текстовый: XML, JSON, memcached, redis, … Проще отладка Есть утилиты: telnet, nc, memget, redis-cli dev.it-portfolio.net 43
  • 44. Протокол memcached - GET ˽ [key] rn SET ˽ [key] ˽ [flag] ˽ [expire] ˽ [bytes] rn INCR ˽ [key] ˽ [value] ˽ [NOREPLAY] rn DELETE ˽ [key] ˽ [NOREPLAY] rn STATS rn FLUSH_ALLrn dev.it-portfolio.net 44
  • 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
  • 50. Реализация счетчика просмотров Счетчики просмотров: INCR ˽ 1.5 ˽ 1 rn ключ анкеты = 5 SET˽ 1.5 ˽ 0 ˽ 0 ˽ 1 rn 0 rn сброс 50
  • 51. Реализация лайка Alice Bob:01 - Увеличение счетчика Алисы : INCR ˽ 1.5 ˽ 1 rn ключ Алисы = 5 - Добавляем в хеш Алисы ключ Боба: SET ˽ 2.5.1 ˽0˽0˽1rn1rn ключ Боба = 1 dev.it-portfolio.net 51
  • 52. Реализация лайка Alice Bob:01 Однако если расширить протокол: INCR ˽ 2.5.1/1 ˽ 1 rn key Вместо двух обращений – одно. dev.it-portfolio.net 52
  • 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
  • 57. Мониторинг - Команда stats - Настраиваем rdd - Рисуем графики dev.it-portfolio.net 57
  • 58. Мониторинг - Память из /proc/self/stat - Производительность: кол-во запросов в сек - Загрузка: отношение времени исполнения к циклу измерения - Размер корзины - Общее кол-во ключей dev.it-portfolio.net 58
  • 60. Тестирование API покрыли тестами Схх http://cxxtest.com Тестирование производительности: aналог Apache ab, протокол memcached https://github.com/akalend/mcstrass dev.it-portfolio.net 60
  • 61. Используемые Библиотеки libev – сетевая однотредовая модель libtokyocabinet – hashdb & treedb tcmalloc - Memory pool allocator dev.it-portfolio.net 61
  • 62. Рекомендуемые Библиотеки Сетевые: libevent2 http://libevent.org/ libev http://software.schmorp.de/pkg/libev.html Коротины: libcoro http://software.schmorp.de/pkg/libcoro.html pcl http://xmailserver.org/libpcl.html libtask http://swtch.com/libtask/ dev.it-portfolio.net 62
  • 63. Рекомендуемые Библиотеки Хештаблицы: Tokyo/Kyoto http://fallabs.com/ [cabinet] libdict https://github.com/fmela/libdic strmap http://pokristensson.com/strmap.html sglib http://sglib.sourceforge.net/ Judy http://judy.sourceforge.net/ levelDb http://code.google.com/p/leveldb/ Sophia http://sphia.org/ uthash http://troydhanson.github.io/uthash/index.html sunriseDb http://www.sunrisetel.net/software/devtools/sunrise-datadictionary.shtml dev.it-portfolio.net 63
  • 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