SlideShare a Scribd company logo
Хранение
json-документов
в Tarantool
Дроздов Андрей. Mail.Ru Group
Agenda
Как хранить json-документы в Tarantool
Стратегии работы с версиями
Как это используется в production
Бенчмарки и сравнения
Проблема
Проблема
Виртуализация данных
Обогащение данных от источника
Интеграция с legacy проектами
Объединение данных от нескольких источников
Очень большие нагрузки
Все данные — JSON
Проблема
С чего начали?
Схемы Avro
{
"First": "John",
"Last": "Doe"
}
{
"name": "Person",
"type": "record",
"fields": [
{ "name": "First",
"type": "string" },
{ "name": "Last",
"type": "string" }
]
}
Хранится как: ["John", "Doe"]
[
"John",
"Doe",
"Was here!"
]
{
"First": "John",
"Last": "Doe"
"Notes": "Was here!"
}
V2 V2
Versions
[
"John",
"Doe",
"Was here!"
]
{
"First": "John",
"Last": "Doe"
}
V2 V1
Versions
[
"Jane",
"Doe"
]
{
"First": "Jane",
"Last": "Doe"
"Notes": ""
}
V1 V2
Versions
Compiler
Apache implementation (too slow)
Code generation?
LuaJIT
LLVM
RPS (×1000)
500
1000
1500
2000
Baseline (C) Codegen (LuaJIT)
Interpreter
JIT
RPS (×1000)
500
1000
1500
2000
2500
3000
3500
Baseline (C) Codegen (LuaJIT) Codegen (LLVM)
Ключевые понятия
compile(text): Schema
flatten(schema_in, schema_out, json): Tuple
unflatten(schema_in, schema_out, tuple): JSON
xflatten(schema_in, schema_out, json): UpdateQuery
Миграции
add — добавление поля в структуру
delete — удаление поля из документа
hide — удаление поля без удаления данных
rename — переименование поля при помощи alias
Стратегия read
Стратегии write
Все запросы выполнять в версии клиента?
Минусы
Версии не возрастают, один и тот же запрос
может вернуть разные ответы
Стратегия insert
Стратегия update
Стратегия update
Стратегия update
Стратегия update
[
"Jane",
"Doe"
]
{
"First": "Andrey",
}
Храним в версии 1
Запрос на обновление
Стратегия update
[
"Jane",
"Doe"
]
{
"First": "Andrey",
}
[
"Jane",
"Doe",
""
]
Храним в версии 1
Запрос на обновление
Приводим к max
[
"Jane",
"Doe"
]
Стратегия update
[
"Jane",
"Doe"
]
{
"First": "Andrey",
}
[
"Jane",
"Doe",
""
]
[
"Andrey",
"Doe",
""
]
Храним в версии 1
Запрос на обновление
Приводим к max Храним в версии 2
Результат xflatten
[
"=", 1, "Andrey"
]
[
"Jane",
"Doe"
]
Стратегия update
Плюсы: Версии будут приводиться к актуальной
Минусы: Теряем данные из удаленных полей
Лечение:
• Восстанавливаем значения при помощи defaults
• Hide вместо удаления полей
Дополнительно
• Валидация данных по схеме без преобразований
• Развертка полей JSON в tuple (имена, типы данных)
REST API?
REST API
Примеры архитектур
Одноуровневая система с репликацией
Отдельно приложение, отдельно хранение
Хранение по ttl
Совместное хранение в памяти и на диске (vinyl)
Хранение отдельно
Устаревание данных
Подводные камни
• Нужно описать логику преобразования версий
• Нужно написать обертки под каждый тип запроса
• Нужно связывать авро схему и индексы в tuple
• Удобно иметь связи между схемами
• Удобно создавать простые API автоматически (без lua)
Tarantino
Что это дает?
• Автоматическая настройка tarantool
• Вся конфигурация - один json-файл
• Версионирование запросов на лету
• Хранится только актуальная версия
• Иерархические связи между схемами
• Не нужно программировать на lua
Пример конфигурации
{
"memory": 30,
"port": 3301,
"index": [
"user":["uid"],
"device":["uid", "sno"]
],
"relations": {
"user": ["device"]
}
"api": {
"1": {
"user":{},
"device":{}
]
}
}
Что произойдет внутри?
box.cfg{
slab_alloc_arena=30,
listen=3301
wal_mode=«write»
}
box.schema.create_space(«user»)
box.space.user:create_index(…)
box.schema.create_space(«device»)
box.space.device:create_index(…)
Что произойдет снаружи?
• /api/v1/user/1
• /api/v1/user?limit=100&offset=0
• /api/v1/device/1/1
• /api/v1/device?limit=100&offset=0
• /api/v1/user/1/?related=prefetch
Join
{
"uid": 1,
"First": «John",
"Last": «Doe"
"device": [
{
"uid": 1,
"sno": 1,
"name":"myD",
}
]
}
Bench
Используем 4 физических ядра
Одинаковая модель данных (2 кб на запрос)
• GO: Go-restful + Mongodb (Mora)
• NodeJS: Express + Mongoose
• Python: Django Rest Framework (nginx + uwsgi)
• Tarantool: Tarantino (avro + memtx)
node js: express + mongo
Чтение
node js: express + mongo
Чтение
node js: express + mongo
Запись
node js: express + mongo
Запись
node js: express + mongo
go restful + mongo
Чтение
go restful + mongo
Чтение
go restful + mongo
Запись
go restful + mongo
Запись
go restful + mongo
go httprouter
go httprouter
Django rest framework
Django rest framework
Tarantino
• Одно ядро
• Преобразование схемы в каждом запросе
Чтение
tarantino (avro + tarantool memtx)
Чтение
tarantino (avro + tarantool memtx)
Запись
tarantino (avro + tarantool memtx)
Запись
tarantino (avro + tarantool memtx)
Результаты
0
7500
15000
22500
30000
NodeJS (4 ядра) GO (4 ядра) Tarantool (1 ядро)
Чтение Запись
Производительность 4 ядра
Чтение: 100000 rps
Запись: 60000 rps
tarantino (avro + tarantool memtx)
Use cases
• Легковесные restful сервисы
• Бэкенды для мобильных приложений
• Выкатывание нескольких версий приложения одновременно
• Scientific приложения (анализ данных) - хранение грязных и
чистых данных в разных версиях
Спасибо за внимание
• http://tarantool.org
• https://github.com/tarantool/tarantino
• https://github.com/tarantool/avro-schema
• https://github.com/tarantool/nginx_upstream_module
• andrey@tarantool.org

More Related Content

PDF
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
PDF
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
PDF
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
PDF
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
PDF
Консольные приложения на Go
PPTX
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
PDF
Анатомия веб сервиса (HighLoad-2014)
PDF
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Консольные приложения на Go
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
Анатомия веб сервиса (HighLoad-2014)
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...

What's hot (20)

PDF
Анатомия веб-сервиса (РИТ-2014)
PDF
Twisted Framework - сетевые приложения в Python
PDF
Денис Иванов
PDF
Семь тысяч Rps, один go
PDF
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
PDF
Avito Stachka 2012
PDF
Где живут Ваши объявления / Тюрин Михаил (Avito)
PDF
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
PDF
Современная операционная система: что надо знать разработчику / Александр Кри...
PDF
pgconf.ru 2015 avito postgresql
PDF
Нагруженный поиск на Sphinx
PDF
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
PDF
Anton Turetckii "What does it take to build a host?"
PDF
Вячеслав Бахмутов
PDF
Облако в Badoo год спустя
PPTX
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
PPTX
Как собирать gps треки раз в секунду, экономя траффик
PPTX
Tarantool, .net, newsql
PDF
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
PDF
Архитектура хранения фотографий в Badoo
Анатомия веб-сервиса (РИТ-2014)
Twisted Framework - сетевые приложения в Python
Денис Иванов
Семь тысяч Rps, один go
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Avito Stachka 2012
Где живут Ваши объявления / Тюрин Михаил (Avito)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Современная операционная система: что надо знать разработчику / Александр Кри...
pgconf.ru 2015 avito postgresql
Нагруженный поиск на Sphinx
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
Anton Turetckii "What does it take to build a host?"
Вячеслав Бахмутов
Облако в Badoo год спустя
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Как собирать gps треки раз в секунду, экономя траффик
Tarantool, .net, newsql
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Архитектура хранения фотографий в Badoo
Ad

Viewers also liked (20)

PPTX
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
PDF
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
PPTX
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
PDF
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
PDF
Хранение данных на виниле / Константин Осипов (tarantool.org)
PDF
Использование Tarantool в качестве платформы виртуализации данных / Константи...
PPTX
Как выбрать In-memory NoSQL базу данных с умом. Тестируем производительность ...
PPTX
Собираем GPS-треки от водителей в такси раз в секунду, экономя трафик / Андре...
PDF
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
PDF
Tarantool как платформа для микросервисов / Антон Резников, Владимир Перепели...
PPT
Tarantool: как сэкономить миллион долларов на базе данных на высоконагруженно...
PPTX
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
PPTX
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
PDF
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
PPTX
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
PPTX
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
PDF
Tarantool 1.6: NoSQL database and application server
PDF
Барнаул15
PDF
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
Хранение данных на виниле / Константин Осипов (tarantool.org)
Использование Tarantool в качестве платформы виртуализации данных / Константи...
Как выбрать In-memory NoSQL базу данных с умом. Тестируем производительность ...
Собираем GPS-треки от водителей в такси раз в секунду, экономя трафик / Андре...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Tarantool как платформа для микросервисов / Антон Резников, Владимир Перепели...
Tarantool: как сэкономить миллион долларов на базе данных на высоконагруженно...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Tarantool 1.6: NoSQL database and application server
Барнаул15
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Ad

Similar to Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group) (20)

PDF
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
PDF
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
PPTX
Tomita
PPTX
Alexei Sintsov - "Between error and vulerability - one step"
PDF
Reform: путь к лучшему ORM
PPT
Node.JS: возможности для РНР-разработчика
PDF
Про асинхронное сетевое программирование
PDF
CSS глазами машин
PDF
Ф'Yii'лософия
PDF
Web осень 2013 лекция 6
PDF
Виктор Грищенко
PDF
Scala and LiftWeb presentation (Russian)
PPTX
работа с потоками ввода вывода
PPTX
Clojure: Lisp for the modern world (русская версия)
PDF
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
PPT
Django. Web project full circle
PDF
Как превратить приложение в платформу
PPTX
20110227 csseminar alvor_breslav
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
Tomita
Alexei Sintsov - "Between error and vulerability - one step"
Reform: путь к лучшему ORM
Node.JS: возможности для РНР-разработчика
Про асинхронное сетевое программирование
CSS глазами машин
Ф'Yii'лософия
Web осень 2013 лекция 6
Виктор Грищенко
Scala and LiftWeb presentation (Russian)
работа с потоками ввода вывода
Clojure: Lisp for the modern world (русская версия)
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Django. Web project full circle
Как превратить приложение в платформу
20110227 csseminar alvor_breslav

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...

Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)