SlideShare a Scribd company logo
libfpta - обгоняя
SQLite и Tarantool
Леонид Юрьев
Advanced Research @ Positive Technologies
Алексей Копытов
Эксперт @ Голос Разума
Обогнали!
Увидимся на «Хабре»
https://github.com/PositiveTechnologies/libfpta
https://github.com/PositiveTechnologies/libfptu
https://github.com/leo-yuriev/libmdbx
libfpta
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
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
PDF
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
PDF
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PPTX
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
PDF
Константин Осипов
PDF
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
Константин Осипов
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...

What's hot (20)

PDF
My talk at Highload++ 2015
PPTX
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
PDF
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
PDF
Хранение данных на виниле / Константин Осипов (tarantool.org)
PDF
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
PPTX
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
PDF
Профилирование кода на C/C++ в *nix системах
PPTX
Как ускорить MySQL Handler Socket в 9 раз / Александр Яковлев (Мамба)
PDF
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
PPTX
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
PDF
Олег Бартунов и Иван Панченко
PDF
Benchmarking PostgreSQL in Linux and FreeBSD
PPTX
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
PDF
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
PDF
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
PDF
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
PDF
Highload на GPU, опыт Vinci / Олег Илларионов (ВКонтакте)
PPTX
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
PDF
Облако в Badoo год спустя
PDF
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
My talk at Highload++ 2015
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Хранение данных на виниле / Константин Осипов (tarantool.org)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Профилирование кода на C/C++ в *nix системах
Как ускорить MySQL Handler Socket в 9 раз / Александр Яковлев (Мамба)
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
Олег Бартунов и Иван Панченко
Benchmarking PostgreSQL in Linux and FreeBSD
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Highload на GPU, опыт Vinci / Олег Илларионов (ВКонтакте)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Облако в Badoo год спустя
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
Ad

Viewers also liked (13)

PDF
libfpta: в памяти, с персистентностью, быстрее хайпа
PPTX
Как выбирать тимлидов на разных этапах роста компании / Евгений Потапов (ITSu...
PDF
Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PDF
Gobblin как ETL-фреймворк / Иван Ахлестин (Rambler&Co)
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PDF
Защищаемость от DDoS на этапе проектирования системы / Рамиль Хантимиров (Sto...
PPTX
Распределенный отказоустойчивый сервис финансовых транзакций / Алексей Бурыло...
PDF
Состояние Состояния / Алексей Охрименко (IPONWEB)
PPTX
Lambda architecture для realtime-аналитики — риски и преимущества / Николай Г...
PDF
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
PPTX
Как мы поддерживаем 100 разных версий клиентов в Badoo / Ярослав Голуб (Badoo)
libfpta: в памяти, с персистентностью, быстрее хайпа
Как выбирать тимлидов на разных этапах роста компании / Евгений Потапов (ITSu...
Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Gobblin как ETL-фреймворк / Иван Ахлестин (Rambler&Co)
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Защищаемость от DDoS на этапе проектирования системы / Рамиль Хантимиров (Sto...
Распределенный отказоустойчивый сервис финансовых транзакций / Алексей Бурыло...
Состояние Состояния / Алексей Охрименко (IPONWEB)
Lambda architecture для realtime-аналитики — риски и преимущества / Николай Г...
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы поддерживаем 100 разных версий клиентов в Badoo / Ярослав Голуб (Badoo)
Ad

Similar to libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies) (20)

PDF
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
PDF
DevConf-2015: Lightning Memory-Mapped Database (LMDB), ReOpen IT
PDF
Обзор перспективных баз данных для highload / Юрий Насретдинов
PPTX
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
PPTX
Cassandra
PPTX
Open source субд глазами обычного программиста
PDF
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
PDF
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
PPT
Как устроен NoSQL, Андрей Аксенов (Sphinx)
PDF
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данных
PDF
Where is the space, Postgres?
PDF
Nosql and Mongodb
PDF
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
PPTX
Andrew Aksyonoff "Архитектура вокруг поиска"
PDF
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
PDF
Hacking PostgreSQL. Разделяемая память и блокировки.
PPTX
django-and-postgresql
PDF
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
PPT
Цена абстракции, Андрей Аксёнов (Sphinx)
ODP
Wonderful World Of Mysql Storage Engines Hl2008 Rus
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
DevConf-2015: Lightning Memory-Mapped Database (LMDB), ReOpen IT
Обзор перспективных баз данных для highload / Юрий Насретдинов
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Cassandra
Open source субд глазами обычного программиста
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
Как устроен NoSQL, Андрей Аксенов (Sphinx)
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данных
Where is the space, Postgres?
Nosql and Mongodb
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Andrew Aksyonoff "Архитектура вокруг поиска"
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
Hacking PostgreSQL. Разделяемая память и блокировки.
django-and-postgresql
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
Цена абстракции, Андрей Аксёнов (Sphinx)
Wonderful World Of Mysql Storage Engines Hl2008 Rus

More from Ontico (20)

PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
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
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
PPTX
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
PPTX
Отказоустойчивая архитектура фронтальной системы банка / Роман Шеховцов, Алек...
PPTX
Синхронизация данных из PgSQL в Tarantool / Вениамин Гвоздиков (Calltouch)
PPTX
Хранимые процедуры в NoSQL СУБД на примере Tarantool / Денис Линник (Mail.Ru)
PDF
Оптимизации поисковой выдачи Яндекса / Иван Хватов, Сергей Ляджин (Яндекс)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
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. Как разрабатывать мобильное приложение большим количе...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Отказоустойчивая архитектура фронтальной системы банка / Роман Шеховцов, Алек...
Синхронизация данных из PgSQL в Tarantool / Вениамин Гвоздиков (Calltouch)
Хранимые процедуры в NoSQL СУБД на примере Tarantool / Денис Линник (Mail.Ru)
Оптимизации поисковой выдачи Яндекса / Иван Хватов, Сергей Ляджин (Яндекс)

libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)

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