futriis/README.md

700 lines
26 KiB
Markdown
Raw 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>
<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>
<li><a href="#индексы">Индексы</a></li>
<li><a href="#транзакции">Транзакции</a></li>
<li><a href="#кластеризация-и-шардинг">Кластеризация и шардинг</a></li>
<li><a href="#сжатие-данных">Сжатие данных</a></li>
<li><a href="#aof">AOF</a></li>
<li><a href="#lua-плагины">Lua-плагины</a></li>
<li><a href="acl">ACL</a></li>
<li><a href="#http-api">HTTP API</a></li>
<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
```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>
## ACL
**Настройка пользователей и прав**
```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>