SlideShare une entreprise Scribd logo
1  sur  26
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
Ontico
 
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
Ontico
 
Цена абстракции, Андрей Аксёнов (Sphinx)
Цена абстракции, Андрей Аксёнов (Sphinx)Цена абстракции, Андрей Аксёнов (Sphinx)
Цена абстракции, Андрей Аксёнов (Sphinx)
Ontico
 
Владимир Бородин - PostgreSQL
Владимир Бородин - PostgreSQLВладимир Бородин - PostgreSQL
Владимир Бородин - PostgreSQL
Yandex
 
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Ontico
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Ontico
 
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...
Ontico
 
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Ontico
 

Tendances (20)

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

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

Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
drupalconf
 
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Ontico
 
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Ontico
 
Tarantool/Silverbox (Юрий Востриков)
Tarantool/Silverbox (Юрий Востриков)Tarantool/Silverbox (Юрий Востриков)
Tarantool/Silverbox (Юрий Востриков)
Ontico
 
Isilapp — Extreme Cloud Storage on FreeBSD
Isilapp — Extreme Cloud Storage on FreeBSDIsilapp — Extreme Cloud Storage on FreeBSD
Isilapp — Extreme Cloud Storage on FreeBSD
Andrew Pantyukhin
 
DevConf-2015: Lightning Memory-Mapped Database (LMDB), ReOpen IT
DevConf-2015: Lightning Memory-Mapped Database (LMDB), ReOpen ITDevConf-2015: Lightning Memory-Mapped Database (LMDB), ReOpen IT
DevConf-2015: Lightning Memory-Mapped Database (LMDB), ReOpen IT
Leonid Yuriev
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQL
Alex Chistyakov
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
Nikolay Samokhvalov
 
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
it-people
 

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

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

Plus de Leonid Yuriev

Highload++2013: TopGun - архитектура терабитной платформы DPI
Highload++2013: TopGun - архитектура терабитной платформы DPIHighload++2013: TopGun - архитектура терабитной платформы DPI
Highload++2013: TopGun - архитектура терабитной платформы DPI
Leonid Yuriev
 

Plus de Leonid Yuriev (7)

Сегментация и поиск совпадений в бинарном потоке
Сегментация и поиск совпадений в бинарном потокеСегментация и поиск совпадений в бинарном потоке
Сегментация и поиск совпадений в бинарном потоке
 
Движок LMDB - особенный чемпион
Движок LMDB - особенный чемпионДвижок LMDB - особенный чемпион
Движок LMDB - особенный чемпион
 
OSSDEV-2015: ReOpenLDAP
OSSDEV-2015: ReOpenLDAPOSSDEV-2015: ReOpenLDAP
OSSDEV-2015: ReOpenLDAP
 
Highload++2014: 1Hippeus - zerocopy messaging in the spirit of Sparta!
Highload++2014: 1Hippeus - zerocopy messaging in the spirit of Sparta!Highload++2014: 1Hippeus - zerocopy messaging in the spirit of Sparta!
Highload++2014: 1Hippeus - zerocopy messaging in the spirit of Sparta!
 
Devconf-2014: Ноотропы для BigData
Devconf-2014: Ноотропы для BigDataDevconf-2014: Ноотропы для BigData
Devconf-2014: Ноотропы для BigData
 
РИТ-2014: Ноотропы RDF для BigData
РИТ-2014: Ноотропы RDF для BigDataРИТ-2014: Ноотропы RDF для BigData
РИТ-2014: Ноотропы RDF для BigData
 
Highload++2013: TopGun - архитектура терабитной платформы DPI
Highload++2013: TopGun - архитектура терабитной платформы DPIHighload++2013: TopGun - архитектура терабитной платформы DPI
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) В несколько раз быстрее