flusql/README.md
2026-01-08 18:30:33 +03:00

544 lines
28 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- 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>