63
Хранение json-документов в Tarantool Дроздов Андрей. Mail.Ru Group

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

  • Upload
    ontico

  • View
    527

  • Download
    7

Embed Size (px)

Citation preview

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

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

в TarantoolДроздов Андрей. Mail.Ru Group

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

Agenda

Как хранить json-документы в Tarantool

Стратегии работы с версиями

Как это используется в production

Бенчмарки и сравнения

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

Проблема

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

ПроблемаВиртуализация данных

Обогащение данных от источника

Интеграция с legacy проектами

Объединение данных от нескольких источников

Очень большие нагрузки

Все данные — JSON

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

Проблема

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

С чего начали?

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

Схемы Avro{ "First": "John", "Last": "Doe" }

{ "name": "Person", "type": "record", "fields": [

{ "name": "First", "type": "string" },

{ "name": "Last", "type": "string" } ] }

Хранится как: ["John", "Doe"]

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

[ "John", "Doe", "Was here!" ]

{ "First": "John", "Last": "Doe" "Notes": "Was here!" }

V2 V2

Versions

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

[ "John", "Doe", "Was here!" ]

{ "First": "John", "Last": "Doe" }

V2 V1

Versions

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

[ "Jane", "Doe" ]

{ "First": "Jane", "Last": "Doe" "Notes": "" }

V1 V2

Versions

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

Compiler

Apache implementation (too slow)

Code generation?

LuaJIT

LLVM

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

RPS (×1000)

500

1000

1500

2000

Baseline (C) Codegen (LuaJIT)

Interpreter

JIT

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

RPS (×1000)

500

1000

1500

2000

2500

3000

3500

Baseline (C) Codegen (LuaJIT) Codegen (LLVM)

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

Ключевые понятия

compile(text): Schema

flatten(schema_in, schema_out, json): Tuple

unflatten(schema_in, schema_out, tuple): JSON

xflatten(schema_in, schema_out, json): UpdateQuery

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

Миграции

add — добавление поля в структуру

delete — удаление поля из документа

hide — удаление поля без удаления данных

rename — переименование поля при помощи alias

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

Стратегия read

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

Стратегии write

Все запросы выполнять в версии клиента?

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

Минусы

Версии не возрастают, один и тот же запрос может вернуть разные ответы

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

Стратегия insert

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

Стратегия update

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

Стратегия update

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

Стратегия update

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

Стратегия update

[ "Jane", "Doe" ]

{ "First": "Andrey", }

Храним в версии 1

Запрос на обновление

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

Стратегия update

[ "Jane", "Doe" ]

{ "First": "Andrey", }

[ "Jane", "Doe", "" ]

Храним в версии 1

Запрос на обновление

Приводим к max[ "Jane", "Doe" ]

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

Стратегия update

[ "Jane", "Doe" ]

{ "First": "Andrey", }

[ "Jane", "Doe", "" ]

[ "Andrey", "Doe", "" ]

Храним в версии 1

Запрос на обновление

Приводим к max Храним в версии 2

Результат xflatten

[ "=", 1, "Andrey" ]

[ "Jane", "Doe" ]

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

Стратегия update

Плюсы: Версии будут приводиться к актуальной

Минусы: Теряем данные из удаленных полей

Лечение:

• Восстанавливаем значения при помощи defaults

• Hide вместо удаления полей

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

Дополнительно

• Валидация данных по схеме без преобразований

• Развертка полей JSON в tuple (имена, типы данных)

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

REST API?

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

REST API

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

Примеры архитектур

Одноуровневая система с репликацией

Отдельно приложение, отдельно хранение

Хранение по ttl

Совместное хранение в памяти и на диске (vinyl)

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

Хранение отдельно

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

Устаревание данных

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

Подводные камни

• Нужно описать логику преобразования версий

• Нужно написать обертки под каждый тип запроса

• Нужно связывать авро схему и индексы в tuple

• Удобно иметь связи между схемами

• Удобно создавать простые API автоматически (без lua)

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

Tarantino

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

Что это дает?• Автоматическая настройка tarantool

• Вся конфигурация - один json-файл

• Версионирование запросов на лету

• Хранится только актуальная версия

• Иерархические связи между схемами

• Не нужно программировать на lua

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

Пример конфигурации{ "memory": 30, "port": 3301, "index": [ "user":["uid"], "device":["uid", "sno"] ], "relations": { "user": ["device"] } "api": { "1": { "user":{}, "device":{} ] } }

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

Что произойдет внутри?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(…)

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

Что произойдет снаружи?• /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

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

Join{ "uid": 1, "First": «John", "Last": «Doe" "device": [ { "uid": 1, "sno": 1, "name":"myD", } ] }

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

BenchИспользуем 4 физических ядра

Одинаковая модель данных (2 кб на запрос)

• GO: Go-restful + Mongodb (Mora)

• NodeJS: Express + Mongoose

• Python: Django Rest Framework (nginx + uwsgi)

• Tarantool: Tarantino (avro + memtx)

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

node js: express + mongo

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

Чтениеnode js: express + mongo

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

Чтениеnode js: express + mongo

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

Записьnode js: express + mongo

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

Записьnode js: express + mongo

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

go restful + mongo

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

Чтениеgo restful + mongo

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

Чтениеgo restful + mongo

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

Записьgo restful + mongo

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

Записьgo restful + mongo

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

go httprouter

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

go httprouter

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

Django rest framework

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

Django rest framework

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

Tarantino

• Одно ядро

• Преобразование схемы в каждом запросе

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

Чтениеtarantino (avro + tarantool memtx)

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

Чтениеtarantino (avro + tarantool memtx)

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

Записьtarantino (avro + tarantool memtx)

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

Записьtarantino (avro + tarantool memtx)

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

Результаты

0

7500

15000

22500

30000

NodeJS (4 ядра) GO (4 ядра) Tarantool (1 ядро)

Чтение Запись

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

Производительность 4 ядра

Чтение: 100000 rps Запись: 60000 rps

tarantino (avro + tarantool memtx)

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

Use cases

• Легковесные restful сервисы

• Бэкенды для мобильных приложений

• Выкатывание нескольких версий приложения одновременно

• Scientific приложения (анализ данных) - хранение грязных и чистых данных в разных версиях

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

Спасибо за внимание

• http://tarantool.org

• https://github.com/tarantool/tarantino

• https://github.com/tarantool/avro-schema

• https://github.com/tarantool/nginx_upstream_module

[email protected]