544 lines
28 KiB
Markdown
544 lines
28 KiB
Markdown
<!-- 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>
|
||
·
|
||
<!-- <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> |