flusql/README.md

544 lines
28 KiB
Markdown
Raw Permalink Normal View History

2026-01-08 18:30:33 +03:00
<!-- Improved compatibility of К началу link: See: https://github.com/othneildrew/Best-README-Template/pull/73 -->
<a id="readme-top"></a>
<!--
*** Thanks for checking out the Best-README-Template. If you have a suggestion
*** that would make this better, please fork the repo and create a pull request
*** or simply open an issue with the tag "enhancement".
*** Don't forget to give the project a star!
*** Thanks again! Now go create something AMAZING! :D
-->
<!-- PROJECT LOGO -->
<br />
<div align="center">
<!-- <a href="https://github.com/othneildrew/Best-README-Template"> -->
<img src="Logo.png" height=100 alt="Logo.png"></img>
</a>
<h3 align="center">fluSQL</h3>
<p align="center">
<b>fluSQL-Автономный модуль для распределённой субд "futriix" добавляющий в неё функционал языка SQL, написанный на языке Rust</b> <br>
<br />
<br />
<!-- <a href="">Сообщить об ошибке</a>
&middot;
<!-- <a href="">Предложение новой функциональности</a> -->
</p>
</div>
## Краткая документация проекта fluSQL
<!-- TABLE OF CONTENTS -->
<br>
<!-- <details> -->
<summary><b>Содержание</b></summary></br>
<ol>
<li>
<a href="#о-проекте">О проекте</a>
<li><a href="#глоссарий">Глоссарий</a></li>
<li><a href="#лицензия">Лицензия</a></li>
<li><a href="#системные-требования">Системные требования</a></li>
<li><a href="#структура-модулей">Структура модулей</a></li>
<li><a href="#подготовка">Подготовка</a></li>
<li><a href="#компиляция">Компиляция</a></li>
<li><a href="#документация-api">Документация API</a></li>
<li><a href="#дорожная-карта">Дорожная карта</a></li>
<li><a href="#контакты">Контакты</a></li>
</ol>
<!-- </details> -->
## О проекте
flusql — это высокопроизводительная встраиваемая SQL СУБД, разработанная на языке Rust с архитектурой wait-free. Система предназначена для приложений, требующих максимальной параллельности и минимальных задержек при работе с данными.
* Wait-free архитектура: полное отсутствие блокировок при операциях чтения
* Много-версионное управление параллелизмом (MVCC): изолированные транзакции без блокировок
* Колоночное хранение данных: оптимизировано для аналитических запросов
* Встроенный Lua интерпретатор: расширяемость через пользовательские скрипты
* Полноценный WAL (Write-Ahead Log): гарантии сохранности данных
* Поддержка ACID транзакций: надежность и согласованность
**Архитектура-Wait-Free подход, что предоставляет следующие преимущества:**
* Отсутствие блокировок: использование атомарных операций вместо Mutex/RwLock
* Сегментированные очереди: асинхронная обработка операций записи
* MVCC (Multi-Version Concurrency Control): параллельное чтение без блокировок
* Кэширование с контрольными точками: периодическая синхронизация данных
* Колоночное хранение
* Семейство столбцов: каждый столбец хранится отдельно
* Оптимизация для аналитики: быстрые агрегатные операции
* Эффективное сжатие: повторяющиеся значения хранятся один раз
* Векторизованная обработка: пакетная обработка данных
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Глоссарий
* **База Данных(БД)** - это структурированное, организованное хранилище данных, которое позволяет удобно собирать, хранить, управлять и извлекать информацию.
* **Система Управления Базами Данных(СУБД)** - это программное обеспечение, которое позволяет создавать, управлять и взаимодействовать с базами данных
* **Мультимодельная СУБД** - это СУБД, которая объединяет в себе поддержку нескольких моделей данных (реляционной, документной, графовой, ключ-значение и др.) в рамках единого интегрированного ядра.
* **Резидентная СУБД** - это СУБД, которая работает непрерывно в оперативной памяти (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), отмечены символом приглашения **«$»**
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Лицензия
Проект распространяется под 2-пунктной лицензией BSD. Подробнсти в файле LICENSE.txt. Эта лицензия является одной из самых демократичных лицензий свободного программного обеспечения. Она позволяет использовать, изменять и распространять код в коммерческих целях без каких-либо ограничений, за исключением сохранения уведомления об авторских правах.
В том числе, Вы можете использовать fluSQL в своих коммерческих продуктах, приложениях или сервисах, не беспокоясь о каких-либо юридических ограничениях, связанных с лицензией.
Все дополнительное программное обеспечение (включая модули на языке lua, тесты) предоставляются "как есть", без гарантий и обязательств со стороны разработчиков. Разработчики не несут ответственности за прямой или косвенный ущерб, вызванный использованием открытого кода Futriix и futriix или технических решений, использующих этот код.
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Системные требования
Данный раздел описывает системные требования, предъявляемые как к аппаратному, так и к программному обеспечению, на котором планируется запускать `futriix`
* Тип процессора: Intel 86x
* Разрядность процессора: 64-бит
* ОЗУ: от 4 Гб и выше
* Операционная система: **Linux Fedora** (**рекомендуемая**), Linux семейства Debian (Ubintu, Linux Mint, Linux MX)
> [!WARNING]
> **Futriix может быть скомпилирован для следующих операционных систем: `OSX`, `Open Indiana`, `FreeBSD`, но сборка для этих операционных систем не проводилась!!!**
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Структура модулей
```txt
src/
├── core/ # Ядро СУБД
│ ├── database.rs # Управление базами данных
│ ├── table.rs # Управление таблицами
│ ├── index.rs # Индексы
│ └── column_family.rs # Колоночное хранение
├── parser/ # Парсер SQL
├── wal/ # Write-Ahead Log
├── mvcc/ # MVCC движок
├── lua/ # Lua интерпретатор
├── cli/ # Командный интерфейс
└── utils/ # Вспомогательные модули
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Подготовка
**Для операционных систем семейства Debian** выполните следующие шаги:
* Обновляем индексы репозиториев (Без этой команды, установщик может не найти пакеты или использовать старые версии):
```sh
# apt update
```
* Устанавливаем необходимые пакеты:
```sh
# apt install curl build-essential git wget
```
* **Устанавливаем язык программирования Rust**
```sh
# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
> [!WARNING]
> **Если используя команду выше установить язык Rust не удалось, тогда устанавливаем язык Rust альтернативным способом, указанном ниже:**
```sh
$ 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)** выполните следующие шаги:
* Обновляем индексы репозиториев (Без этой команды, установщик может не найти пакеты или использовать старые версии):
```sh
# dnf update
```
* Устанавливаем необходимые пакеты:
```sh
# dnf install curl build-essential git wget
```
* **Устанавливаем язык программирования Rust**
```sh
# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
## Компиляция
```sh
# Клонирование репозитория
git clone https://github.com/yourusername/flusql.git
cd flusql
# Сборка в режиме релиза (оптимизированная)
cargo build --release
# Запуск тестов
cargo test
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Использование
**Запуск интерактивного интефейса**
```sh
$ ./flusql
```
**Пример сессии**
```sql
Добро пожаловать в 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!
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Основные команды
**Управление базами данных**
```sql
CREATE DATABASE mydb;
USE mydb;
SHOW DATABASES;
DROP DATABASE mydb;
```
**Управление таблицами**
```sql
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;
```
**Операции с данными**
```sql
-- Вставка
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;
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Поддерживаемые расширенные возможности SQL
* JOIN операции: LEFT JOIN, INNER JOIN
* Агрегатные функции: GROUP BY, ORDER BY
* Ограничения: FOREIGN KEY, CHECK, UNIQUE
* Индексы: создание и удаление индексов
* Триггеры: BEFORE/AFTER INSERT/UPDATE/DELETE
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Lua-интеграция
```sql
lua-mode -- Вход в режим Lua
```
```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
```
## Импорт и экспорт данных из/в субд
```sql
EXPORT users TO '/path/to/users.csv';
IMPORT INTO users FROM '/path/to/data.csv';
```
## Программное использование
```rust
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)?;
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Тестирование
<p align="right">(<a href="#readme-top">К началу</a>)</p>
### Оптимизации
* Memory-mapped файлы: для WAL и больших таблиц
* Пакетная обработка: группировка операций записи
* Кэширование запросов: повторное использование планов выполнения
* Векторизованные операции: SIMD для агрегатных функций
## Конфигурация
**Файл конфигурации `config.toml`**
```sh
# Путь к директории с базами данных
data_dir = "./data"
# Максимальный размер лог-файла в MB
max_log_size_mb = 100
# Включить журналирование
enable_logging = true
# Автоматическое создание индексов
auto_index = true
# Размер страницы памяти в KB
page_size_kb = 4
```
## Переменные окружения
```sh
export FLUSQL_DATA_DIR="/var/lib/flusql"
export FLUSQL_LOG_LEVEL="info"
export FLUSQL_MAX_MEMORY="2GB"
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Сферы применения
**Бизнес-приложения**
* Финансовые системы: обработка транзакций в реальном времени
* Логистика и трекинг: отслеживание перемещений объектов
* CRM системы: управление клиентской базой
**IoT и телеметрия**
* Сбор данных с датчиков: хранение временных рядов
* Аналитика в реальном времени: обработка потоковых данных
* Мониторинг систем: сбор и анализ метрик
**Игровая индустрия**
* Игровые профили: хранение данных игроков
* Аналитика игрового процесса: сбор статистики
* Социальные функции: чаты, друзья, достижения
**Научные исследования**
* Обработка экспериментальных данных: хранение и анализ
* Машинное обучение: подготовка обучающих выборок
* Статистический анализ: агрегация и обработка данных
**Мобильные приложения**
* Локальное хранение: автономная работа приложения
* Синхронизация данных: фоновая обработка
* Кэширование: ускорение работы приложения
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Документация API
**Основные типы**
```rust
// База данных
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;
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
**Обработка ошибок**
```rust
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);
}
}
```
```sh
-- OLTP-операция: быстрая транзакция
Futriix_db.update("users", "user123", '{"balance": 100}')
-- OLAP-операция: аналитический запрос
local analytics = Futriix_db.query("transactions", '{"date": {"$gt": "2024-01-01"}}')
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
<!-- ROADMAP -->
## Дорожная карта
- [x] Реализовать базовые операторы CRUD SQL на одном узле
- [x] Реализовать поддержку триггеров (обратных вызовов)
- [x] Реализовать поддержку многопоточности
- [x] Реализовать неблокирующие чтение/запись
- [x] Реализовать мульти-мастер асинхронную репликацию через файл конфигурации
- [x] Реализовать логирование
- [x] Реализовать поддержку синхронной мастер-мастер репликации
- [x] Реализовать поддержку кластеризации согласно паттерну "Centralized Coordinator"
- [x] Реализовать поддержку первичных индексов
- [x] Реализовать базовую поддержку транзакций
- [x] Реализовать поддержку первичных и вторичных индексов
- [ ] Добавить механизм сторонних модулей на языке lua, расширяющих базовый функционал сервера
- [x] Добавить в каждую таблицу временную метку-"timestamp" (текущую дату)
- [x] Заменить диалект SQL на диалект SQL-PostgreSQL
- [x] Переписать асинхронную мастер-мастер репликацию на синхронную мастер-мастер репликацию
- [ ] Реализовать поддержку базового (на нескольких узлах) языка SQL
- [ ] Реализовать графический веб-интерфейс для управления кластером
- [ ] Реализовать аппаратную поддержку платформы "RasberryPi"
См. [Открытые проблемы](https://source.futriix.ru/gvsafronov/futriixw/issues) полный список предлагаемых функций (и известных проблем).
<p align="right">(<a href="#readme-top">К началу</a>)</p>
<!-- CONTRIBUTING -->
<!-- CONTACT -->
## Контакты
Григорий Сафронов - [E-mail](gvsafronov@yandex.ru)
<p align="right">(<a href="#readme-top">К началу</a>)</p>