fluSQL
fluSQL-Автономный модуль для распределённой субд "futriix" добавляющий в неё функционал языка SQL, написанный на языке Rust
Краткая документация проекта fluSQL
- О проекте
- Глоссарий
- Лицензия
- Системные требования
- Структура модулей
- Подготовка
- Компиляция
- Документация API
- Дорожная карта
- Контакты
О проекте
flusql — это высокопроизводительная встраиваемая SQL СУБД, разработанная на языке Rust с архитектурой wait-free. Система предназначена для приложений, требующих максимальной параллельности и минимальных задержек при работе с данными.
- Wait-free архитектура: полное отсутствие блокировок при операциях чтения
- Много-версионное управление параллелизмом (MVCC): изолированные транзакции без блокировок
- Колоночное хранение данных: оптимизировано для аналитических запросов
- Встроенный Lua интерпретатор: расширяемость через пользовательские скрипты
- Полноценный WAL (Write-Ahead Log): гарантии сохранности данных
- Поддержка ACID транзакций: надежность и согласованность
Архитектура-Wait-Free подход, что предоставляет следующие преимущества:
- Отсутствие блокировок: использование атомарных операций вместо Mutex/RwLock
- Сегментированные очереди: асинхронная обработка операций записи
- MVCC (Multi-Version Concurrency Control): параллельное чтение без блокировок
- Кэширование с контрольными точками: периодическая синхронизация данных
- Колоночное хранение
- Семейство столбцов: каждый столбец хранится отдельно
- Оптимизация для аналитики: быстрые агрегатные операции
- Эффективное сжатие: повторяющиеся значения хранятся один раз
- Векторизованная обработка: пакетная обработка данных
(К началу)
Глоссарий
- База Данных(БД) - это структурированное, организованное хранилище данных, которое позволяет удобно собирать, хранить, управлять и извлекать информацию.
- Система Управления Базами Данных(СУБД) - это программное обеспечение, которое позволяет создавать, управлять и взаимодействовать с базами данных
- Мультимодельная СУБД - это СУБД, которая объединяет в себе поддержку нескольких моделей данных (реляционной, документной, графовой, ключ-значение и др.) в рамках единого интегрированного ядра.
- Резидентная СУБД - это СУБД, которая работает непрерывно в оперативной памяти (RAM).
- Инстанс - это запущенный экземляр базы данных.
- Узел (хост,нода,шард) - это отдельный сервер (физический или виртуальный), который является частью кластера или распределенной системы и выполняет часть общей работы.
- Слайс (от англ. "slice"-слой) - это логический и физически изолированный фрагмент коллекции документов, полученный в результате горизонтального партиционирования (шардирования) и размещенный на определенном узле кластера с целью масштабирования производительности и объема данных.
- Репликасет - это группа серверов СУБД, объединенных в отказоустойчивую конфигурацию, где один узел выполняет роль первичного (принимающего операции записи), а один или несколько других - роль вторичных (синхронизирующих свои данные с первичным и обслуживающих чтение), с автоматическим переизбранием первичного узла в случае его сбоя.
- Временные ряды (time series) - это это упорядоченная во времени последовательность данных, собранная в регулярные промежутки времени из какого-либо источниика (цены на акции, данные температуры, объёмы продаж и.т.д.).
- OLTP (Online Transactional Processing-Онлайн обработка транзакций)- это технология обработки транзакций в режиме реального времени. Её основная задача заключается в обеспечении быстрого и надёжного выполнения операций, которые происходят ежесекундно в бизнесе. Они обеспечивают быстрое выполнение операций вставки, обновления и удаления данных, поддерживая целостность и надежность транзакций.
- OLAP (Online Analytical Processing - Оперативная аналитическая обработка) — это технология, которая работает с историческими массивами информации, извлекая из них закономерности и производя анализ больших объемов данных, поддерживает многоразмерные запросы и сложные аналитические операции. Данная технология оптимизирована для выполнения сложных запросов и предоставления сводной информации для принятия управленческих решений.
- HTAP (Hybrid Transactional and Analytical Processing - Гибридная транзакционно-аналитическая обработка)- это технология, которая заключаются в эффективном совмещении операционных и аналитических запросов, т.е. классов OLTP и OLAP.
- Кластер - это группа компьютеров, объединённых высокоскоростными каналами связи для решения сложных вычислительных задач и представляющая с точки зрения пользователя группу серверов, объединенных для работы как единая система.
- WUI (от англ. Web-User-Interface "веб интерфейс пользователя") - это термин проекта futriix, означающий веб-интерфейс (интерфейс работающий в веб-браузере)
- Сервер-приложений (англ. application-server) - это программное обеспечение, которое обеспечивает выполнение бизнес-логики и обработку запросов от клиентов (например, веб-браузеров или мобильных приложений). Он служит платформой для развертывания и управления приложениями, имея встроенные интепретаторы и/или компиляторы популярных языков программирования (php,go,python), что обеспечивает взаимодействие между пользователями, базами данных и другими системами.
- REPL (от англ. read-eval-print loop — цикл "чтение — вычисление — вывод") - это объединённые в одном приложении сервер и клиент для работы со встроенным приложением, применимо к данному проекту- к встроенной субд "futriix"
- workflow (англ. workflow — «поток работы») — это принцип организации рабочих процессов, в соответствии с которым повторяющиеся задачи представлены как последовательность стандартных шагов.
- wait-free (дословно с англ. wait-free — «свободный от ожидания»)-класс неблокирующих алгоритмов, в которых каждая операция должна завершаться за конечное число шагов независимо от активности других потоков.
- CA (англ. Certificate Authority - Центры Сертификации) - это организации, которые выдают доверенные криптографические сертификаты.
- Команды, выполняемые с привилегиями суперпользователя (root), отмечены символом приглашения «#»
- Команды, выполняемые с правами обычного пользователя(user), отмечены символом приглашения «$»
(К началу)
Лицензия
Проект распространяется под 2-пунктной лицензией BSD. Подробнсти в файле LICENSE.txt. Эта лицензия является одной из самых демократичных лицензий свободного программного обеспечения. Она позволяет использовать, изменять и распространять код в коммерческих целях без каких-либо ограничений, за исключением сохранения уведомления об авторских правах.
В том числе, Вы можете использовать fluSQL в своих коммерческих продуктах, приложениях или сервисах, не беспокоясь о каких-либо юридических ограничениях, связанных с лицензией.
Все дополнительное программное обеспечение (включая модули на языке lua, тесты) предоставляются "как есть", без гарантий и обязательств со стороны разработчиков. Разработчики не несут ответственности за прямой или косвенный ущерб, вызванный использованием открытого кода Futriix и futriix или технических решений, использующих этот код.
(К началу)
Системные требования
Данный раздел описывает системные требования, предъявляемые как к аппаратному, так и к программному обеспечению, на котором планируется запускать futriix
- Тип процессора: Intel 86x
- Разрядность процессора: 64-бит
- ОЗУ: от 4 Гб и выше
- Операционная система: Linux Fedora (рекомендуемая), Linux семейства Debian (Ubintu, Linux Mint, Linux MX)
Warning
Futriix может быть скомпилирован для следующих операционных систем:
OSX,Open Indiana,FreeBSD, но сборка для этих операционных систем не проводилась!!!
(К началу)
Структура модулей
src/
├── core/ # Ядро СУБД
│ ├── database.rs # Управление базами данных
│ ├── table.rs # Управление таблицами
│ ├── index.rs # Индексы
│ └── column_family.rs # Колоночное хранение
├── parser/ # Парсер SQL
├── wal/ # Write-Ahead Log
├── mvcc/ # MVCC движок
├── lua/ # Lua интерпретатор
├── cli/ # Командный интерфейс
└── utils/ # Вспомогательные модули
(К началу)
Подготовка
Для операционных систем семейства Debian выполните следующие шаги:
-
Обновляем индексы репозиториев (Без этой команды, установщик может не найти пакеты или использовать старые версии):
# apt update -
Устанавливаем необходимые пакеты:
# apt install curl build-essential git wget -
Устанавливаем язык программирования Rust
# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Warning
Если используя команду выше установить язык Rust не удалось, тогда устанавливаем язык Rust альтернативным способом, указанном ниже:
$ sudo -s
# apt update
# apt install rustup && rustup default stable
# rustup update
# rustc --version
**Если всё сделано правильно то в терминале должен появиться ответ: rustc 1.92.0 (ded5c06cf 2025-12-08)**
-
Для операционных систем семейства Red Hat (Fedora, Aurora) выполните следующие шаги:
-
Обновляем индексы репозиториев (Без этой команды, установщик может не найти пакеты или использовать старые версии):
# dnf update -
Устанавливаем необходимые пакеты:
# dnf install curl build-essential git wget -
Устанавливаем язык программирования Rust
# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Компиляция
# Клонирование репозитория
git clone https://github.com/yourusername/flusql.git
cd flusql
# Сборка в режиме релиза (оптимизированная)
cargo build --release
# Запуск тестов
cargo test
(К началу)
Использование
Запуск интерактивного интефейса
$ ./flusql
Пример сессии
Добро пожаловать в flusql! Введите HELP для справки.
flusql> CREATE DATABASE testdb;
База данных 'testdb' создана
flusql> USE testdb;
Используется база данных 'testdb'
flusql> CREATE TABLE users (id INT, name TEXT, age INT);
Таблица 'users' создана
flusql> INSERT INTO users (id, name, age) VALUES (1, 'Alice', 30);
Запись вставлена с ID: 1
flusql> SELECT * FROM users;
Найдено 1 записей
id | name | age
---------------
1 | Alice | 30
flusql> lua-mode
Вход в Lua режим. Введите 'exit' для выхода
lua> print("Hello from Lua!")
Hello from Lua!
(К началу)
Основные команды
Управление базами данных
CREATE DATABASE mydb;
USE mydb;
SHOW DATABASES;
DROP DATABASE mydb;
Управление таблицами
CREATE TABLE users (
id INT PRIMARY KEY,
name TEXT NOT NULL,
age INT,
email TEXT UNIQUE
);
ALTER TABLE users ADD COLUMN phone TEXT;
DROP TABLE users;
Операции с данными
-- Вставка
INSERT INTO users (id, name, age) VALUES (1, 'Алиса', 30);
-- Выборка
SELECT * FROM users WHERE age > 25 ORDER BY name LIMIT 10;
-- Обновление
UPDATE users SET age = 31 WHERE id = 1;
-- Удаление
DELETE FROM users WHERE age < 18;
(К началу)
Поддерживаемые расширенные возможности SQL
- JOIN операции: LEFT JOIN, INNER JOIN
- Агрегатные функции: GROUP BY, ORDER BY
- Ограничения: FOREIGN KEY, CHECK, UNIQUE
- Индексы: создание и удаление индексов
- Триггеры: BEFORE/AFTER INSERT/UPDATE/DELETE
(К началу)
Lua-интеграция
lua-mode -- Вход в режим Lua
-- Выполнение SQL из Lua
local result = execute_sql("SELECT * FROM users")
print("Результат:", result)
-- Работа с данными
local data = query_data("SELECT name, age FROM users")
for i, row in ipairs(data) do
print("Строка", i, ":", table.concat(row, ", "))
end
Импорт и экспорт данных из/в субд
EXPORT users TO '/path/to/users.csv';
IMPORT INTO users FROM '/path/to/data.csv';
Программное использование
use flusql::{Database, Config};
// Создание конфигурации
let config = Config::default();
// Создание базы данных
let mut db = Database::create("mydb", &config)?;
// Создание таблицы
use flusql::core::{TableSchema, ColumnSchema, DataType};
let schema = TableSchema {
columns: vec![
ColumnSchema {
name: "id".to_string(),
data_type: DataType::Integer,
nullable: false,
unique: true,
},
ColumnSchema {
name: "name".to_string(),
data_type: DataType::Text,
nullable: false,
unique: false,
},
],
primary_key: Some("id".to_string()),
indexes: vec![],
foreign_keys: vec![],
checks: vec![],
};
db.create_table("users", schema)?;
(К началу)
Тестирование
(К началу)
Оптимизации
- Memory-mapped файлы: для WAL и больших таблиц
- Пакетная обработка: группировка операций записи
- Кэширование запросов: повторное использование планов выполнения
- Векторизованные операции: SIMD для агрегатных функций
Конфигурация
Файл конфигурации config.toml
# Путь к директории с базами данных
data_dir = "./data"
# Максимальный размер лог-файла в MB
max_log_size_mb = 100
# Включить журналирование
enable_logging = true
# Автоматическое создание индексов
auto_index = true
# Размер страницы памяти в KB
page_size_kb = 4
Переменные окружения
export FLUSQL_DATA_DIR="/var/lib/flusql"
export FLUSQL_LOG_LEVEL="info"
export FLUSQL_MAX_MEMORY="2GB"
(К началу)
Сферы применения
Бизнес-приложения
- Финансовые системы: обработка транзакций в реальном времени
- Логистика и трекинг: отслеживание перемещений объектов
- CRM системы: управление клиентской базой
IoT и телеметрия
- Сбор данных с датчиков: хранение временных рядов
- Аналитика в реальном времени: обработка потоковых данных
- Мониторинг систем: сбор и анализ метрик
Игровая индустрия
- Игровые профили: хранение данных игроков
- Аналитика игрового процесса: сбор статистики
- Социальные функции: чаты, друзья, достижения
Научные исследования
- Обработка экспериментальных данных: хранение и анализ
- Машинное обучение: подготовка обучающих выборок
- Статистический анализ: агрегация и обработка данных
Мобильные приложения
- Локальное хранение: автономная работа приложения
- Синхронизация данных: фоновая обработка
- Кэширование: ускорение работы приложения
(К началу)
Документация API
Основные типы
// База данных
pub struct Database;
// Таблица
pub struct Table;
// Схема таблицы
pub struct TableSchema;
// Значение данных
pub enum Value {
Integer(i64),
Text(String),
Boolean(bool),
Float(f64),
Null,
}
// Парсер SQL
pub struct SqlParser;
(К началу)
Обработка ошибок
use flusql::{DatabaseError, TableError};
match result {
Ok(data) => process_data(data),
Err(DatabaseError::NotFound(name)) => {
eprintln!("База данных '{}' не найдена", name);
}
Err(DatabaseError::IoError(e)) => {
eprintln!("Ошибка ввода-вывода: {}", e);
}
Err(e) => {
eprintln!("Неизвестная ошибка: {}", e);
}
}
-- OLTP-операция: быстрая транзакция
Futriix_db.update("users", "user123", '{"balance": 100}')
-- OLAP-операция: аналитический запрос
local analytics = Futriix_db.query("transactions", '{"date": {"$gt": "2024-01-01"}}')
(К началу)
Дорожная карта
- Реализовать базовые операторы CRUD SQL на одном узле
- Реализовать поддержку триггеров (обратных вызовов)
- Реализовать поддержку многопоточности
- Реализовать неблокирующие чтение/запись
- Реализовать мульти-мастер асинхронную репликацию через файл конфигурации
- Реализовать логирование
- Реализовать поддержку синхронной мастер-мастер репликации
- Реализовать поддержку кластеризации согласно паттерну "Centralized Coordinator"
- Реализовать поддержку первичных индексов
- Реализовать базовую поддержку транзакций
- Реализовать поддержку первичных и вторичных индексов
- Добавить механизм сторонних модулей на языке lua, расширяющих базовый функционал сервера
- Добавить в каждую таблицу временную метку-"timestamp" (текущую дату)
- Заменить диалект SQL на диалект SQL-PostgreSQL
- Переписать асинхронную мастер-мастер репликацию на синхронную мастер-мастер репликацию
- Реализовать поддержку базового (на нескольких узлах) языка SQL
- Реализовать графический веб-интерфейс для управления кластером
- Реализовать аппаратную поддержку платформы "RasberryPi"
См. Открытые проблемы полный список предлагаемых функций (и известных проблем).
(К началу)
Контакты
Григорий Сафронов - E-mail
(К началу)