futriis/README.md

700 lines
26 KiB
Markdown
Raw Normal View History

2026-02-28 18:02:10 +00: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>
<p align="center">
<h3> <b>Futriis-это легковесная, распределённая wait-free и lock-free дружественная in-memory СУБД,
реализованная на Go с поддержкой плагинов на языке lua для операционных систем на базе Solaris (ядра Illumos)</b> <br></h3>
<br />
<br />
<!-- <a href="">Сообщить об ошибке</a>
&middot;
<!-- <a href="">Предложение новой функциональности</a> -->
</p>
</div>
## Краткая документация проекта FutriiS
<!-- 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="#примеры-команд-субд">Примеры команд субд</a></li>
2026-02-28 18:03:51 +00:00
<li><a href="#индексы">Индексы</a></li>
2026-02-28 18:02:10 +00:00
<li><a href="#транзакции">Транзакции</a></li>
<li><a href="#кластеризация-и-шардинг">Кластеризация и шардинг</a></li>
2026-02-28 18:03:51 +00:00
<li><a href="#сжатие-данных">Сжатие данных</a></li>
2026-02-28 18:02:10 +00:00
<li><a href="#aof-(Append-Only File)">AOF (Append-Only File)</a></li>
<li><a href="#lua-плагины">Lua-плагины</a></li>
2026-02-28 18:03:51 +00:00
<li><a href="acl"></a>ACL</li>
<li><a href="#http-api">HTTP API</a></li>
2026-02-28 18:02:10 +00:00
<li><a href="#сферы-применения">Сферы применения</a></li>
<li><a href="#дорожная-карта">Дорожная карта</a></li>
<li><a href="#контакты">Контакты</a></li>
</ol>
<!-- </details> -->
## О проекте
futriis - это легковесная, распределённая wait-free и lock-free дружественная in-memory СУБД, реализованная на Go с поддержкой плагинов на языке lua и особенным демоном кластеризации, реализующий паттерн "центральный диспетчер"-futriisd.
**Демон futriisd**
futriisd - это демон (сервис) представляющий из себя бинарный файл "futriisd" СУБД Futriis, расположенный в /futriis/build/futriisd, Этот файл является:
- Основным исполняемым файлом сервера - запускает ядро СУБД в фоновом режиме как демон (daemon)
- Точкой входа для кластерного узла - каждый узел кластера запускается через этот бинарный файл
- Фоновым процессом - работает независимо от терминала, обрабатывая сетевые запросы
- Управляющим процессом - отвечает за инициализацию всех компонентов: хранилища, кластера, репликации, AOF
- Сетевым сервером - слушает порты для координации кластера и обработки клиентских подключений
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Лицензия
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Глоссарий
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Типы данных субд
СУБД реализует три основных типа данных:
- **Таппл (Tapple)** - аналог базы данных в РСУБД
- **Слайс (Slice)** - аналог таблицы
- **Кортеж (Tuple)** - аналог записи в таблице
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Системные требования
> [!WARNING]
> - Процессор: Intel или AMD
> - Оперативная память: 4ГБ (Для Linux) 8ГБ (Для Illumos sytems)
> - Только Unix-подобная ОС (Solaris, OpenIndiana, Linux)
> - Go 1.25.6 или выше
> [!CAUTION]
> **Важно: Windows и MacOS X не поддерживаются!**
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Подготовка и компиляция
1. Клонируйте репозиторий:
```bash
git clone https://github.com/futriis/db.git
cd futriis
```
2. Скомпилируйте и запустите:
```bash
./build.sh
./futriis
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
**Пример использования демона "futriisd"**
```bash
# Запуск узла кластера
./futriisd --config /path/to/config.toml --node-id node-1
# Запуск координатора
./futriisd --config /path/to/config.toml --coordinator
# Запуск в фоновом режиме
./futriisd --daemon
```
### Тестирование
<p align="right">(<a href="#readme-top">К началу</a>)</p>
### Примеры команд субд
```bash
# Создать таппл (базу данных)
create tapple users
# Создать слайс (таблицу) в таппле
create slice users user_profiles
# Создать кортеж (запись) с полями
create tuple users user_profiles user1 name=John age=30 email=john@example.com
create tuple users user_profiles user2 name=Jane age=25 city=NYC
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
#### Просмотр списков
```bash
# Показать все тапплы
list tapples
# Показать все слайсы в таппле
list slices users
# Показать все кортежи в слайсе
show tuples users user_profiles
```
#### Обновление и удаление
```bash
# Обновить поля кортежа
update tuple users user_profiles user1 age=31 city=Boston
# Удалить кортеж
delete tuple users user_profiles user2
# Удалить слайс
delete slice users user_profiles
# Удалить таппл
delete tapple users
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Индексы
```bash
# Создать первичный индекс для таппла
add.prime.index users
# Удалить первичный индекс
delete.prime.index users
# Создать вторичный индекс по полю
add.secondary.index users email
add.secondary.index users age
# Удалить вторичный индекс
delete.secondary.index users email
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Транзакции
```bash
# Начать транзакцию
begin
# Выполнить операции внутри транзакции
create tuple users user_profiles user3 name=Bob age=28
update tuple users user_profiles user1 city=Chicago
# Зафиксировать транзакцию
commit
# Или откатить транзакцию
rollback
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Кластеризация и шардинг
```bash
# Показать статус кластера
cluster.status
# Добавить узел в кластер
add.node 192.168.1.101:8080
add.node 192.168.1.102:8080
# Удалить узел из кластера
evict.node node-123
# Ребалансировка кластера
cluster.rebalance
# Показать статус шардинга
sharding.status
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Сжатие данных
```bash
# Показать статистику сжатия по колонкам
compression.stats
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## AOF (Append-Only File)
```bash
# Показать информацию о AOF файле
aof.info
# Восстановить данные из AOF файла
aof.recover
aof.recover /path/to/custom/file.aof
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Lua-плагины
```bash
# Выполнить Lua плагин
lua my_plugin
lua analytics_script
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
2026-02-28 18:03:51 +00:00
## ACL
2026-02-28 18:02:10 +00:00
**Настройка пользователей и прав**
```bash
# Запускаем клиент СУБД
./futriis
# Входим как администратор (по умолчанию admin/admin)
futriis:~> login admin admin
# Output: Logged in as: Administrator (admin)
# Создаём новую базу данных (таппл)
futriis:~> create tapple company
# Output: Tapple 'company' created successfully
# Создаём таблицу (слайс)
futriis:~> create slice company employees
# Output: Slice 'employees' in tapple 'company' created successfully
# Создаём пользователей с разными ролями
futriis:~> acl.createuser john "John Doe" johnpass user
# Output: User created: John Doe (john)
futriis:~> acl.createuser jane "Jane Smith" janepass readonly
# Output: User created: Jane Smith (jane)
futriis:~> acl.createuser bob "Bob Wilson" bobpass user
# Output: User created: Bob Wilson (bob)
# Проверяем права пользователей
futriis:~> acl.check john read company
# Output: Permission DENIED
# Предоставляем права на чтение таппла john'у
futriis:~> acl.grant john read tapple company
# Output: Permission granted
# Проверяем снова
futriis:~> acl.check john read company
# Output: Permission GRANTED
# Даём bob'у права на запись в конкретный слайс
futriis:~> acl.grant bob write slice company.employees
# Output: Permission granted
# Проверяем права bob'а
futriis:~> acl.check bob write company.employees
# Output: Permission GRANTED
```
**Пример тестирование разных уровней доступа**
```bash
# Входим как john (только чтение таппла company)
futriis:~> login john johnpass
# Output: Logged in as: John Doe (john)
# Пробуем создать данные (должно быть отказано)
futriis:~> create tuple company employees emp1 name=John age=30
# Output: permission denied: you don't have write permission on slice 'company.employees'
# Просмотр данных (разрешено)
futriis:~> list tapples
# Output: List of tapples:
# company
futriis:~> list slices company
# Output: List of slices in tapple 'company':
# employees
# Входим как bob (имеет права на запись в employees)
futriis:~> login bob bobpass
# Output: Logged in as: Bob Wilson (bob)
# Создаём данные (разрешено)
futriis:~> create tuple company employees emp1 name=Bob age=25 department=IT
# Output: Tuple 'emp1' in slice 'employees' created successfully
# Пробуем удалить (должно быть отказано, т.к. у bob'а нет прав на удаление)
futriis:~> delete tuple company employees emp1
# Output: permission denied: you don't have delete permission on tuple 'company.employees.emp1'
# Входим как jane (только чтение)
futriis:~> login jane janepass
# Output: Logged in as: Jane Smith (jane)
# Просмотр данных (разрешено)
futriis:~> show tuples company employees
# Output: List of tuples in slice 'employees':
# ID: emp1
# name: Bob
# age: 25
# department: IT
# Пытаемся изменить (должно быть отказано)
futriis:~> update tuple company employees emp1 age=26
# Output: permission denied: you don't have write permission on tuple 'company.employees.emp1'
# Возвращаемся к администратору и назначаем роли
futriis:~> login admin admin
# Output: Logged in as: Administrator (admin)
# Назначаем jane роль user (даёт права на запись)
futriis:~> acl.assignrole jane user
# Output: Role assigned
# Теперь jane может создавать данные
futriis:~> login jane janepass
# Output: Logged in as: Jane Smith (jane)
futriis:~> create tuple company employees emp2 name=Jane age=28 department=HR
# Output: Tuple 'emp2' in slice 'employees' created successfully
# Просматриваем оба кортежа
futriis:~> show tuples company employees
# Output: List of tuples in slice 'employees':
# ID: emp1
# name: Bob
# age: 25
# department: IT
#
# ID: emp2
# name: Jane
# age: 28
# department: HR
```
**Управление ролями и правами**
```bash
# Создаём новую роль с ограниченными правами
futriis:~> login admin admin
# В текущей реализации создание роли через API пока не добавлено,
# но можно использовать существующие роли
# Просмотр прав пользователей
futriis:~> acl.check admin admin tapple
# Output: Permission GRANTED
# Отзываем роль у пользователя
futriis:~> acl.revokerole jane user
# Output: Role revoked
# Теперь jane вернулась к роли readonly
futriis:~> login jane janepass
futriis:~> create tuple company employees emp3 name=Test age=99
# Output: permission denied: you don't have write permission on slice 'company.employees'
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## HTTP API
```bash
# Проверка здоровья сервера
curl http://localhost:9080/health
# Response: {"status":"ok","time":"2024-01-15T10:30:00Z"}
# Создание таппла через API
curl -X POST http://localhost:9080/api/v1/tapple/university
# Response: {"success":true,"message":"Tapple 'university' created successfully","tapple":"university"}
# Создание слайса
curl -X POST http://localhost:9080/api/v1/slice/university/students
# Response: {"success":true,"message":"Slice 'students' in tapple 'university' created successfully","slice":"students","tapple":"university"}
# Получение списка тапплов
curl http://localhost:9080/api/v1/tapple/
# Response: {"success":true,"tapples":" university\n"}
# Получение информации о таппле
curl http://localhost:9080/api/v1/tapple/university
# Response: {"slices":" students\n","success":true,"tapple":"university"}
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
**Работа с кортежами**
```bash
# Создание кортежа с данными студента
curl -X POST http://localhost:9080/api/v1/tuple/university/students/1001 \
-H "Content-Type: application/json" \
-d '{"name":"Alice Johnson","age":20,"major":"Computer Science","gpa":3.8}'
# Response:
# {
# "success": true,
# "message": "Tuple '1001' in slice 'students' created successfully",
# "tapple": "university",
# "slice": "students",
# "tuple": "1001",
# "fields": {
# "name": "Alice Johnson",
# "age": 20,
# "major": "Computer Science",
# "gpa": 3.8
# }
# }
# Создание второго студента
curl -X POST http://localhost:9080/api/v1/tuple/university/students/1002 \
-H "Content-Type: application/json" \
-d '{"name":"Bob Smith","age":22,"major":"Mathematics","gpa":3.5}'
# Получение списка всех кортежей в слайсе
curl http://localhost:9080/api/v1/slice/university/students
# Response:
# {
# "success": true,
# "tapple": "university",
# "slice": "students",
# "tuples": "List of tuples in slice 'students':\n ID: 1001\n name: Alice Johnson\n age: 20\n major: Computer Science\n gpa: 3.8\n\n ID: 1002\n name: Bob Smith\n age: 22\n major: Mathematics\n gpa: 3.5\n"
# }
# Получение конкретного кортежа
curl http://localhost:9080/api/v1/tuple/university/students/1001
# Response:
# {
# "success": true,
# "tapple": "university",
# "slice": "students",
# "tuple": "1001",
# "data": "List of tuples in slice 'students':\n ID: 1001\n name: Alice Johnson\n age: 20\n major: Computer Science\n gpa: 3.8"
# }
# Обновление кортежа
curl -X PUT http://localhost:9080/api/v1/tuple/university/students/1001 \
-H "Content-Type: application/json" \
-d '{"gpa":3.9,"graduation_year":2025}'
# Response:
# {
# "success": true,
# "message": "Tuple '1001' in slice 'students' updated successfully",
# "tapple": "university",
# "slice": "students",
# "tuple": "1001",
# "fields": {
# "gpa": 3.9,
# "graduation_year": 2025
# }
# }
# Удаление кортежа
curl -X DELETE http://localhost:9080/api/v1/tuple/university/students/1002
# Response: {"success":true,"message":"Tuple '1002' in slice 'students' deleted successfully"}
```
**Быстрое создание через Quick API**
```bash
# Quick API - самый простой способ создания данных
# Формат: /quick/create/{tapple}/{slice}/{tuple}/{JSON}
# Создаём данные о продуктах
curl -X POST "http://localhost:9080/quick/create/shop/products/101/{\"name\":\"Laptop\",\"price\":999.99,\"in_stock\":true}"
# Response:
# {
# "success": true,
# "message": "Tuple '101' in slice 'products' created successfully",
# "tapple": "shop",
# "slice": "products",
# "tuple": "101",
# "fields": {
# "name": "Laptop",
# "price": 999.99,
# "in_stock": true
# }
# }
# Создаём ещё один продукт (таппл и слайс создаются автоматически)
curl -X POST "http://localhost:9080/quick/create/shop/products/102/{\"name\":\"Mouse\",\"price\":29.99,\"in_stock\":true}"
# Создаём пользователя
curl -X POST "http://localhost:9080/quick/create/shop/customers/201/{\"name\":\"John Doe\",\"email\":\"john@example.com\",\"loyalty_points\":150}"
# Проверяем созданные данные
curl http://localhost:9080/api/v1/slice/shop/products
# Response показывает все продукты
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Комплексные примеры HTTP-API с различными типами данных
```bash
# Создаём базу данных для библиотеки
curl -X POST http://localhost:9080/api/v1/tapple/library
# Создаём слайс для книг
curl -X POST http://localhost:9080/api/v1/slice/library/books
# Добавляем несколько книг
curl -X POST "http://localhost:9080/quick/create/library/books/978-1/{\"title\":\"1984\",\"author\":\"George Orwell\",\"year\":1949,\"available\":true}"
curl -X POST "http://localhost:9080/quick/create/library/books/978-2/{\"title\":\"Brave New World\",\"author\":\"Aldous Huxley\",\"year\":1932,\"available\":true}"
curl -X POST "http://localhost:9080/quick/create/library/books/978-3/{\"title\":\"Fahrenheit 451\",\"author\":\"Ray Bradbury\",\"year\":1953,\"available\":false}"
# Поиск книг (через show tuples)
curl "http://localhost:9080/api/v1/slice/library/books"
# Response показывает все книги
# Обновляем статус доступности
curl -X PUT "http://localhost:9080/api/v1/tuple/library/books/978-1" \
-H "Content-Type: application/json" \
-d '{"available":false,"borrowed_by":"user123"}'
# Создаём слайс для читателей
curl -X POST http://localhost:9080/api/v1/slice/library/readers
# Добавляем читателей
curl -X POST "http://localhost:9080/quick/create/library/readers/1001/{\"name\":\"Alice\",\"books_borrowed\":[\"978-1\"],\"membership\":\"premium\"}"
```
**Обработка ошибок**
```bash
# Попытка создать кортеж с невалидным JSON
curl -X POST "http://localhost:9080/quick/create/test/items/1/{invalid-json"
# Response: {"error":"Invalid JSON: invalid character 'i' looking for beginning of object key string","success":false}
# Попытка получить несуществующий ресурс
curl http://localhost:9080/api/v1/tuple/nonexistent/table/id
# Response: {"error":"Tapple not found","success":false}
# Неправильный метод HTTP
curl -X DELETE http://localhost:9080/api/v1/tapple/
# Response: Method not allowed
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Пример рабочей сессии со всем реализованным функционалом
```bash
# Создаём структуру данных
create tapple ecommerce
create slice ecommerce products
create slice ecommerce customers
create slice ecommerce orders
# Создаём индексы
add.secondary.index ecommerce price
add.secondary.index ecommerce email
# Добавляем данные (в транзакции)
begin
create tuple ecommerce products prod1 name=Laptop price=999.99 stock=10
create tuple ecommerce products prod2 name=Mouse price=29.99 stock=50
create tuple ecommerce customers cust1 name=Alice email=alice@mail.com
create tuple ecommerce orders order1 customer=cust1 product=prod1 quantity=1
commit
# Просматриваем данные
show tuples ecommerce products
show tuples ecommerce customers
# Обновляем данные
update tuple ecommerce products prod1 stock=9
# Проверяем статус кластера
cluster.status
# Смотрим статистику сжатия
compression.stats
# Сценарий: Создание системы управления проектами
# 1. Создаём структуру данных через HTTP API
curl -X POST http://localhost:9080/api/v1/tapple/project_management
curl -X POST http://localhost:9080/api/v1/slice/project_management/projects
curl -X POST http://localhost:9080/api/v1/slice/project_management/tasks
curl -X POST http://localhost:9080/api/v1/slice/project_management/users
# 2. Добавляем проекты
curl -X POST "http://localhost:9080/quick/create/project_management/projects/proj1/{\"name\":\"Website Redesign\",\"status\":\"active\",\"budget\":50000}"
curl -X POST "http://localhost:9080/quick/create/project_management/projects/proj2/{\"name\":\"Mobile App\",\"status\":\"planning\",\"budget\":75000}"
# 3. Добавляем пользователей
curl -X POST "http://localhost:9080/quick/create/project_management/users/user1/{\"name\":\"Alice\",\"role\":\"developer\"}"
curl -X POST "http://localhost:9080/quick/create/project_management/users/user2/{\"name\":\"Bob\",\"role\":\"manager\"}"
# 4. Добавляем задачи
curl -X POST "http://localhost:9080/quick/create/project_management/tasks/task1/{\"title\":\"Design mockups\",\"project\":\"proj1\",\"assigned_to\":\"user1\",\"status\":\"in_progress\"}"
curl -X POST "http://localhost:9080/quick/create/project_management/tasks/task2/{\"title\":\"Setup repository\",\"project\":\"proj1\",\"assigned_to\":\"user1\",\"status\":\"done\"}"
curl -X POST "http://localhost:9080/quick/create/project_management/tasks/task3/{\"title\":\"Create timeline\",\"project\":\"proj2\",\"assigned_to\":\"user2\",\"status\":\"pending\"}"
# 5. Просмотр всех задач проекта
curl "http://localhost:9080/api/v1/slice/project_management/tasks"
# 6. В клиенте СУБД проверяем ACL для разных пользователей
futriis:~> login admin admin
futriis:~> acl.createuser alice "Alice Developer" alicepass user
futriis:~> acl.grant alice read tapple project_management
futriis:~> acl.grant alice write slice project_management.tasks
futriis:~> login alice alicepass
futriis:~> show tuples project_management tasks
# Видит все задачи
futriis:~> update tuple project_management tasks task1 status=completed
# Успешно обновляет
# Выходим
exit
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Сферы применения
Идеальными сферами применения проекта Futriix, являются следующие:
1. **Микросервисы с потребностью в оперативной аналитике**
2. **Работающая в режиме реального времени панель мониторинга - для администрирования бекенда**
3. **Приложения, тербующие среднего масштабирования со смешанными рабочими нагузками (англ. workload)**
4. **Прототипирование перед выбором специализированного решения**
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Дорожная карта
- [x] Реализовать
- [ ] Реализовать
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Контакты
Григорий Сафронов - [E-mail](gvsafronov@yandex.ru)
<p align="right">(<a href="#readme-top">К началу</a>)</p>