Logo.png

Futriis-это легковесная, распределённая wait-free и lock-free дружественная in-memory СУБД, реализованная на Go с поддержкой плагинов на языке lua для операционных систем на базе Solaris (ядра Illumos)



## Краткая документация проекта FutriiS
Содержание
  1. О проекте
  2. Лицензия
  3. Глоссарий
  4. Типы данных субд
  5. Системные требования
  6. Подготовка и компиляция
  7. Тестирование
  8. Примеры команд субд
  9. Индексы
  10. Транзакции
  11. Кластеризация и шардинг
  12. Сжатие данных
  13. AOF (Append-Only File)
  14. Lua-плагины
  15. ACL списки доступа
  16. HTTP API
  17. Сферы применения
  18. Дорожная карта
  19. Контакты
## О проекте futriis - это легковесная, распределённая wait-free и lock-free дружественная in-memory СУБД, реализованная на Go с поддержкой плагинов на языке lua и особенным демоном кластеризации, реализующий паттерн "центральный диспетчер"-futriisd. **Демон futriisd** futriisd - это демон (сервис) представляющий из себя бинарный файл "futriisd" СУБД Futriis, расположенный в /futriis/build/futriisd, Этот файл является: - Основным исполняемым файлом сервера - запускает ядро СУБД в фоновом режиме как демон (daemon) - Точкой входа для кластерного узла - каждый узел кластера запускается через этот бинарный файл - Фоновым процессом - работает независимо от терминала, обрабатывая сетевые запросы - Управляющим процессом - отвечает за инициализацию всех компонентов: хранилища, кластера, репликации, AOF - Сетевым сервером - слушает порты для координации кластера и обработки клиентских подключений

(К началу)

## Лицензия

(К началу)

## Глоссарий

(К началу)

## Типы данных субд СУБД реализует три основных типа данных: - **Таппл (Tapple)** - аналог базы данных в РСУБД - **Слайс (Slice)** - аналог таблицы - **Кортеж (Tuple)** - аналог записи в таблице

(К началу)

## Системные требования > [!WARNING] > - Процессор: Intel или AMD > - Оперативная память: 4ГБ (Для Linux) 8ГБ (Для Illumos sytems) > - Только Unix-подобная ОС (Solaris, OpenIndiana, Linux) > - Go 1.25.6 или выше > [!CAUTION] > **Важно: Windows и MacOS X не поддерживаются!**

(К началу)

## Подготовка и компиляция 1. Клонируйте репозиторий: ```bash git clone https://github.com/futriis/db.git cd futriis ``` 2. Скомпилируйте и запустите: ```bash ./build.sh ./futriis ```

(К началу)

**Пример использования демона "futriisd"** ```bash # Запуск узла кластера ./futriisd --config /path/to/config.toml --node-id node-1 # Запуск координатора ./futriisd --config /path/to/config.toml --coordinator # Запуск в фоновом режиме ./futriisd --daemon ``` ### Тестирование

(К началу)

### Примеры команд субд ```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 ```

(К началу)

#### Просмотр списков ```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 ```

(К началу)

## Индексы ```bash # Создать первичный индекс для таппла add.prime.index users # Удалить первичный индекс delete.prime.index users # Создать вторичный индекс по полю add.secondary.index users email add.secondary.index users age # Удалить вторичный индекс delete.secondary.index users email ```

(К началу)

## Транзакции ```bash # Начать транзакцию begin # Выполнить операции внутри транзакции create tuple users user_profiles user3 name=Bob age=28 update tuple users user_profiles user1 city=Chicago # Зафиксировать транзакцию commit # Или откатить транзакцию rollback ```

(К началу)

## Кластеризация и шардинг ```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 ```

(К началу)

## Сжатие данных ```bash # Показать статистику сжатия по колонкам compression.stats ```

(К началу)

## AOF (Append-Only File) ```bash # Показать информацию о AOF файле aof.info # Восстановить данные из AOF файла aof.recover aof.recover /path/to/custom/file.aof ```

(К началу)

## Lua-плагины ```bash # Выполнить Lua плагин lua my_plugin lua analytics_script ```

(К началу)

## 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' ```

(К началу)

## 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"} ```

(К началу)

**Работа с кортежами** ```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 показывает все продукты ```

(К началу)

## Комплексные примеры 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 ```

(К началу)

## Пример рабочей сессии со всем реализованным функционалом ```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 ```

(К началу)

## Сферы применения Идеальными сферами применения проекта Futriix, являются следующие: 1. **Микросервисы с потребностью в оперативной аналитике** 2. **Работающая в режиме реального времени панель мониторинга - для администрирования бекенда** 3. **Приложения, тербующие среднего масштабирования со смешанными рабочими нагузками (англ. workload)** 4. **Прототипирование перед выбором специализированного решения**

(К началу)

## Дорожная карта - [x] Реализовать - [ ] Реализовать

(К началу)

## Контакты Григорий Сафронов - [E-mail](gvsafronov@yandex.ru)

(К началу)