SlideShare a Scribd company logo
libfpta:
– в памяти
– с персистентностью
– быстрее хайпа
Леонид Юрьев
Advanced Research @ Positive Technologies
Алексей Копытов
Эксперт @ Голос Разума
Потребовалось
оперативное хранилище
– очень быстрое
– для локальных процессов
– без излишеств, но развиваемое…
Взяли и сделали.
libfpta: Постановка задачи
Локально, DATA < RAM
– один нагруженный сервер
– несколько читателей и 2-3 процесса-писателя
Быстро
– если медленно, то не нужно
Долговечность иногда не важна
– при аварии питания данные устаревают
Высокая готовность
– минимальное время восстановления
– падение не должно ломать или прятать данные
Позитивные таблицы
1. Обзор
2. Варианты использования: Целевой и Неправильный
3. Плюсы
4. Минусы
5. Планы
6. Чем не устроили: Ignite, Tarantool, SQLite, RocksDB…
libfpta – Движок хранения
Компактная библиотека с лицензией LGPL
libfpta = libmdbx (key-value) + libfptu (tuples) + t1ha (hash)
Таблицы с «утиной» схемой, всяческие индексы
Экстремально быстрый, но без WAL (пока)
Похожий, но Иной
libfpta: 80% как у всех
1. Набор таблиц с колонкам и индексами
2. Машинные типы, дата-время, строки, NULL…
3. Курсоры
4. BREAD
5. Рой процессов
6. Пока отсутствуют: FOREIGN KEYs, JOINs
Внутри транзакций
чтения/записи
libfpta: Внутри
Данные отображены в RAM
– B+Tree, не LSM
– ACID* поверх MVCC
– MVCC посредством COW на уровне страниц
Key-value, кортежи, список таблиц, список колонок…
– нет имен, только дайджесты t1ha
Предельно эффективно для машины
– считаем кэш-линии и такты
– ничего лишнего или неэффективного
libfpta: Не подойдет
Много «апдейтов» и
– нельзя потерять при аварии питания
– допустим простой при восстановлении
= показан WAL
READ < WRITE && RAM < DATA
= показан LSM
libfpta: Идеально
Требуется предельная производительность
– ACID для локальной группы процессов
– с выборкой диапазонов и курсорами
Не нужен WAL
– требуется минимальное время простоя
– допустимо потерять «хвост» при аварии
( при kill -9 ничего не потеряется )
– диск терпит WAF от апдейтов
READ > WRITE || RAM > DATA
– иначе LSM даст больше
libfpta: Скорость
READ / GET
𝑂 log(𝑁) = поиск в B+tree
Как std::map или чуть
быстрее (за счет локальности)
На каждом CPU
без блокировок в БД
Подкачка если DATA > RAM
WRITE / UPSERT
𝑂 log(𝑁) = Изменение B+tree
Копирование страниц по
высоте дерева
Транзакции строго
последовательны
Фиксация на диске
MDBX
RocksDB
READ4threads SYNC LAZY
libfpta: Попугаи
MDBX
RocksDB
I/O SPACECPU
Производительность
Стоимость
libfpta: «Утиная» схема
Записи являются кортежами
Схема задает минимальный набор
Полей может быть больше…
Для «лишних» полей
– машинный тип
– числовой тэг (до 1000)
– будет: справочник схемы
Дополнительные
полу-структурированные
данные
libfpta: Кортежи
Реализованы в libfptu:
– похожи на BSON и MessagePack
– без сжатия
– поддерживаются коллекции (repeated в ProtoBuf)
– в заголовке есть «индекс»
– предельно удобны для машины
– подключаемый словарь схемы (будет, вместе с JSON)
– могут быть вложенным
– предусмотрены массивы
libfpta: Дубликаты
Дубликаты – это multi-value
– во вложенных деревьях
– ключи не дублируются
– значения отсортированы
– курсоры могут ходить по «дубликатам»
– быстрый поиск и позиционирование
libfpta: Конкуренция
Один писатель
– Один разделяемый мьютекс (1)
– Изменения всегда последовательны
Много читателей
– Подключение/отключение под вторым мьютексом (2)
– Выполнение без блокировок внутри БД
Временно
– Изменение схемы под мьютексом внутри процесса (3)
libfpta: Индексы
Составные
– по совокупному значению колонок
Неупорядоченные
– хэши t1ha вместо значений, требуют меньше места
Реверсивные
– ключи сравниваются с конца, хорошо для доменов
Функциональные / Пользовательские (обдумываем)
– как генераторы ключей, не компараторы
– collate/uppercase
libfpta: Немного деталей
Первичный индекс есть всегда
Нет RowID
– есть последовательности
– будет auto (эмуляция RowID)
Вторичные индекс через PK
– как в MySQL, НЕ как в PostgreSQL
– требуют уникальности PK
libfpta: Не как у людей…
Контроль уникальности
– это атрибут индекса
NULL в индексах
– заменяется на Designated NIL
– проверяется на уникальность
Триггеры
– пока не хотим, нет «сервера»
Пока отсутствуют
– Collate и Case Insensitive
– FOREIGN KEYs
– JOINs
– OPTIMIZER / REWRITER
Пока не требовалось,
но будет…
libfpta: Недостатки
Отсутствие WAL
– требует смены формата
Проблема долгих чтений
– требует большого рефакторинга
Наследство от LMDB
Были причины не трогать
Будем устранять
libfpta: WAL или NO-WAL?
Без WAL
– Большой WAF
– Медленно на HDD
+ Моментальная готовность
Тем не менее
+ OOM и kill = не проблема
+ есть LIFO для BBWC
Нам было достаточно,
но WAL скоро будет
+ Небольшой WAF
+ Быстрее на HDD
± sync/flush (всё-таки нужен…)
– Replay после аварии
libfpta: Планы и хотелки
libmdbx (key-value):
– Новое API
– Рефакторинг…
– Асинхронная фиксация
– Merkle Tree
– WAL
– Другая «сборка мусора»
– Вынос span-pages и
поддержка RAW-устройств
(Nexenta Edge)
libfptu (кортежи):
– поддержка справочника схемы
– (де)сериализация в JSON
– (де)сериализация в MsgPack
libfpta (всё вместе):
– поддержка python…
– «оптимизатор» запросов
– FK, JOIN, GIN…
libfpta: Трудности
KISS
– взвешенный аскетизм, не переинженерить, меньше ребусов
Тесты
– комбинаторная сложность
– оркестр процессов
– поведенческие паттерны
Люди
– ищем в команду
Apache Ignite?
Java = неустранимые накладные расходы
– не для предельной производительности
libfpta:
1) Не нужна распределённость
2) Не делает лишнего
3) В несколько раз быстрее
Tarantool, Aerospike, etc…?
Сеть = неустранимые накладные расходы
– системные вызовы, маршалинг, event loop
libfpta:
1) Чтение линейно масштабируется по CPU
2) Чтение без блокировок, непосредственно из RAM
3) Интегрально в несколько раз быстрее*
SQLite, RocksDB…?
Одна БД = Один процесс

libfpta:
1) Рой локальных процессов
2) Два разделяемых мьютекса
3) В несколько раз быстрее
Спасибо!
Увидимся на «Хабре»
https://github.com/PositiveTechnologies/libfpta
https://github.com/PositiveTechnologies/libfptu
https://github.com/leo-yuriev/libmdbx
libfpta

More Related Content

PDF
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PPTX
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
PPT
Как устроен NoSQL, Андрей Аксенов (Sphinx)
PPTX
Как устроен поиск / Андрей Аксенов (Sphinx)
PDF
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
PPTX
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
PDF
Хранение данных на виниле / Константин Осипов (tarantool.org)
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Как устроен NoSQL, Андрей Аксенов (Sphinx)
Как устроен поиск / Андрей Аксенов (Sphinx)
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Хранение данных на виниле / Константин Осипов (tarantool.org)

What's hot (20)

PDF
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
PPTX
Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
PDF
My talk at Highload++ 2015
PDF
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PDF
My talk on LeoFS, Highload++ 2014
PDF
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
PPTX
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
PDF
Константин Осипов
PPTX
Тестируем производительность распределённых систем, Александр Киров (Parallels)
PDF
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
PDF
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
PDF
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
PPT
Цена абстракции, Андрей Аксёнов (Sphinx)
PDF
Владимир Бородин - PostgreSQL
PPTX
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
PPTX
Спасение 6 миллионов файлов в условиях полного Хецнера
PDF
pgconf.ru 2015 avito postgresql
PDF
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
PPTX
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...
PPTX
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
My talk at Highload++ 2015
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
My talk on LeoFS, Highload++ 2014
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
Константин Осипов
Тестируем производительность распределённых систем, Александр Киров (Parallels)
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
Цена абстракции, Андрей Аксёнов (Sphinx)
Владимир Бородин - PostgreSQL
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Спасение 6 миллионов файлов в условиях полного Хецнера
pgconf.ru 2015 avito postgresql
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Ad

Similar to libfpta: в памяти, с персистентностью, быстрее хайпа (20)

PPTX
Open source субд глазами обычного программиста
PPTX
Hosting for forbes.ru_
PDF
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
PDF
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
PDF
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
PDF
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
PDF
Tarantool/Silverbox (Юрий Востриков)
PPTX
High Load
PPTX
MyRocks: табличный движок для MySQL на основе RocksDB
PPT
Пути увеличения эффективности реализации алгоритмов машинного обучения
PDF
Isilapp — Extreme Cloud Storage on FreeBSD
PDF
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
ODP
GetDev.NET: Снова Эрланг
PPTX
Elasticsearch(java) fluentd(ruby) kibana(javascript)
PDF
DevConf-2015: Lightning Memory-Mapped Database (LMDB), ReOpen IT
PDF
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
PPT
phpConf 2010 Классификация систем хранения
PPTX
Практический опыт использования некоторых современных решений репликации MySQL
PPTX
2014.12.23 Александр Андреев, Parallels
PDF
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Open source субд глазами обычного программиста
Hosting for forbes.ru_
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Tarantool/Silverbox (Юрий Востриков)
High Load
MyRocks: табличный движок для MySQL на основе RocksDB
Пути увеличения эффективности реализации алгоритмов машинного обучения
Isilapp — Extreme Cloud Storage on FreeBSD
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
GetDev.NET: Снова Эрланг
Elasticsearch(java) fluentd(ruby) kibana(javascript)
DevConf-2015: Lightning Memory-Mapped Database (LMDB), ReOpen IT
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
phpConf 2010 Классификация систем хранения
Практический опыт использования некоторых современных решений репликации MySQL
2014.12.23 Александр Андреев, Parallels
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Ad

More from Leonid Yuriev (7)

PDF
Сегментация и поиск совпадений в бинарном потоке
PDF
Движок LMDB - особенный чемпион
PDF
OSSDEV-2015: ReOpenLDAP
PDF
Highload++2014: 1Hippeus - zerocopy messaging in the spirit of Sparta!
PPTX
Devconf-2014: Ноотропы для BigData
PPTX
РИТ-2014: Ноотропы RDF для BigData
PPTX
Highload++2013: TopGun - архитектура терабитной платформы DPI
Сегментация и поиск совпадений в бинарном потоке
Движок LMDB - особенный чемпион
OSSDEV-2015: ReOpenLDAP
Highload++2014: 1Hippeus - zerocopy messaging in the spirit of Sparta!
Devconf-2014: Ноотропы для BigData
РИТ-2014: Ноотропы RDF для BigData
Highload++2013: TopGun - архитектура терабитной платформы DPI

libfpta: в памяти, с персистентностью, быстрее хайпа

  • 1. libfpta: – в памяти – с персистентностью – быстрее хайпа Леонид Юрьев Advanced Research @ Positive Technologies Алексей Копытов Эксперт @ Голос Разума
  • 2. Потребовалось оперативное хранилище – очень быстрое – для локальных процессов – без излишеств, но развиваемое… Взяли и сделали.
  • 3. libfpta: Постановка задачи Локально, DATA < RAM – один нагруженный сервер – несколько читателей и 2-3 процесса-писателя Быстро – если медленно, то не нужно Долговечность иногда не важна – при аварии питания данные устаревают Высокая готовность – минимальное время восстановления – падение не должно ломать или прятать данные
  • 4. Позитивные таблицы 1. Обзор 2. Варианты использования: Целевой и Неправильный 3. Плюсы 4. Минусы 5. Планы 6. Чем не устроили: Ignite, Tarantool, SQLite, RocksDB…
  • 5. libfpta – Движок хранения Компактная библиотека с лицензией LGPL libfpta = libmdbx (key-value) + libfptu (tuples) + t1ha (hash) Таблицы с «утиной» схемой, всяческие индексы Экстремально быстрый, но без WAL (пока) Похожий, но Иной
  • 6. libfpta: 80% как у всех 1. Набор таблиц с колонкам и индексами 2. Машинные типы, дата-время, строки, NULL… 3. Курсоры 4. BREAD 5. Рой процессов 6. Пока отсутствуют: FOREIGN KEYs, JOINs Внутри транзакций чтения/записи
  • 7. libfpta: Внутри Данные отображены в RAM – B+Tree, не LSM – ACID* поверх MVCC – MVCC посредством COW на уровне страниц Key-value, кортежи, список таблиц, список колонок… – нет имен, только дайджесты t1ha Предельно эффективно для машины – считаем кэш-линии и такты – ничего лишнего или неэффективного
  • 8. libfpta: Не подойдет Много «апдейтов» и – нельзя потерять при аварии питания – допустим простой при восстановлении = показан WAL READ < WRITE && RAM < DATA = показан LSM
  • 9. libfpta: Идеально Требуется предельная производительность – ACID для локальной группы процессов – с выборкой диапазонов и курсорами Не нужен WAL – требуется минимальное время простоя – допустимо потерять «хвост» при аварии ( при kill -9 ничего не потеряется ) – диск терпит WAF от апдейтов READ > WRITE || RAM > DATA – иначе LSM даст больше
  • 10. libfpta: Скорость READ / GET 𝑂 log(𝑁) = поиск в B+tree Как std::map или чуть быстрее (за счет локальности) На каждом CPU без блокировок в БД Подкачка если DATA > RAM WRITE / UPSERT 𝑂 log(𝑁) = Изменение B+tree Копирование страниц по высоте дерева Транзакции строго последовательны Фиксация на диске
  • 11. MDBX RocksDB READ4threads SYNC LAZY libfpta: Попугаи MDBX RocksDB I/O SPACECPU Производительность Стоимость
  • 12. libfpta: «Утиная» схема Записи являются кортежами Схема задает минимальный набор Полей может быть больше… Для «лишних» полей – машинный тип – числовой тэг (до 1000) – будет: справочник схемы Дополнительные полу-структурированные данные
  • 13. libfpta: Кортежи Реализованы в libfptu: – похожи на BSON и MessagePack – без сжатия – поддерживаются коллекции (repeated в ProtoBuf) – в заголовке есть «индекс» – предельно удобны для машины – подключаемый словарь схемы (будет, вместе с JSON) – могут быть вложенным – предусмотрены массивы
  • 14. libfpta: Дубликаты Дубликаты – это multi-value – во вложенных деревьях – ключи не дублируются – значения отсортированы – курсоры могут ходить по «дубликатам» – быстрый поиск и позиционирование
  • 15. libfpta: Конкуренция Один писатель – Один разделяемый мьютекс (1) – Изменения всегда последовательны Много читателей – Подключение/отключение под вторым мьютексом (2) – Выполнение без блокировок внутри БД Временно – Изменение схемы под мьютексом внутри процесса (3)
  • 16. libfpta: Индексы Составные – по совокупному значению колонок Неупорядоченные – хэши t1ha вместо значений, требуют меньше места Реверсивные – ключи сравниваются с конца, хорошо для доменов Функциональные / Пользовательские (обдумываем) – как генераторы ключей, не компараторы – collate/uppercase
  • 17. libfpta: Немного деталей Первичный индекс есть всегда Нет RowID – есть последовательности – будет auto (эмуляция RowID) Вторичные индекс через PK – как в MySQL, НЕ как в PostgreSQL – требуют уникальности PK
  • 18. libfpta: Не как у людей… Контроль уникальности – это атрибут индекса NULL в индексах – заменяется на Designated NIL – проверяется на уникальность Триггеры – пока не хотим, нет «сервера» Пока отсутствуют – Collate и Case Insensitive – FOREIGN KEYs – JOINs – OPTIMIZER / REWRITER Пока не требовалось, но будет…
  • 19. libfpta: Недостатки Отсутствие WAL – требует смены формата Проблема долгих чтений – требует большого рефакторинга Наследство от LMDB Были причины не трогать Будем устранять
  • 20. libfpta: WAL или NO-WAL? Без WAL – Большой WAF – Медленно на HDD + Моментальная готовность Тем не менее + OOM и kill = не проблема + есть LIFO для BBWC Нам было достаточно, но WAL скоро будет + Небольшой WAF + Быстрее на HDD ± sync/flush (всё-таки нужен…) – Replay после аварии
  • 21. libfpta: Планы и хотелки libmdbx (key-value): – Новое API – Рефакторинг… – Асинхронная фиксация – Merkle Tree – WAL – Другая «сборка мусора» – Вынос span-pages и поддержка RAW-устройств (Nexenta Edge) libfptu (кортежи): – поддержка справочника схемы – (де)сериализация в JSON – (де)сериализация в MsgPack libfpta (всё вместе): – поддержка python… – «оптимизатор» запросов – FK, JOIN, GIN…
  • 22. libfpta: Трудности KISS – взвешенный аскетизм, не переинженерить, меньше ребусов Тесты – комбинаторная сложность – оркестр процессов – поведенческие паттерны Люди – ищем в команду
  • 23. Apache Ignite? Java = неустранимые накладные расходы – не для предельной производительности libfpta: 1) Не нужна распределённость 2) Не делает лишнего 3) В несколько раз быстрее
  • 24. Tarantool, Aerospike, etc…? Сеть = неустранимые накладные расходы – системные вызовы, маршалинг, event loop libfpta: 1) Чтение линейно масштабируется по CPU 2) Чтение без блокировок, непосредственно из RAM 3) Интегрально в несколько раз быстрее*
  • 25. SQLite, RocksDB…? Одна БД = Один процесс  libfpta: 1) Рой локальных процессов 2) Два разделяемых мьютекса 3) В несколько раз быстрее