2026-03-01 00:54:28 +00:00
2026-03-01 00:51:44 +00:00
2026-02-27 19:08:21 +00:00
2026-02-27 22:04:04 +03:00
2026-02-27 19:06:03 +00:00
2026-02-27 19:05:48 +00:00
2026-02-27 19:05:48 +00:00
2026-02-27 22:04:04 +03:00
2026-02-28 18:07:44 +00:00


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
  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. Клонируйте репозиторий:
git clone https://github.com/futriis/db.git
cd futriis
  1. Скомпилируйте и запустите:
./build.sh
./futriis

(К началу)

Пример использования демона "futriisd"

    # Запуск узла кластера
./futriisd --config /path/to/config.toml --node-id node-1

# Запуск координатора
./futriisd --config /path/to/config.toml --coordinator

# Запуск в фоновом режиме
./futriisd --daemon

Тестирование

(К началу)

Примеры команд субд

# Создать таппл (базу данных)
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

(К началу)

Просмотр списков

# Показать все тапплы
list tapples

# Показать все слайсы в таппле
list slices users

# Показать все кортежи в слайсе
show tuples users user_profiles

Обновление и удаление

# Обновить поля кортежа
update tuple users user_profiles user1 age=31 city=Boston

# Удалить кортеж
delete tuple users user_profiles user2

# Удалить слайс
delete slice users user_profiles

# Удалить таппл
delete tapple users

(К началу)

Индексы

# Создать первичный индекс для таппла
add.prime.index users

# Удалить первичный индекс
delete.prime.index users

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

# Удалить вторичный индекс
delete.secondary.index users email

(К началу)

Транзакции

# Начать транзакцию
begin

# Выполнить операции внутри транзакции
create tuple users user_profiles user3 name=Bob age=28
update tuple users user_profiles user1 city=Chicago

# Зафиксировать транзакцию
commit

# Или откатить транзакцию
rollback

(К началу)

Кластеризация и шардинг

# Показать статус кластера
cluster.status

# Добавить узел в кластер
add.node 192.168.1.101:8080
add.node 192.168.1.102:8080

# Удалить узел из кластера
evict.node node-123

# Ребалансировка кластера
cluster.rebalance

# Показать статус шардинга
sharding.status

(К началу)

Сжатие данных

# Показать статистику сжатия по колонкам
compression.stats

(К началу)

AOF

# Показать информацию о AOF файле
aof.info

# Восстановить данные из AOF файла
aof.recover
aof.recover /path/to/custom/file.aof

(К началу)

Lua-плагины

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

(К началу)

ACL

Настройка пользователей и прав

# Запускаем клиент СУБД
./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

Пример тестирование разных уровней доступа

# Входим как 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

Управление ролями и правами

# Создаём новую роль с ограниченными правами
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

# Проверка здоровья сервера
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"}

(К началу)

Работа с кортежами

# Создание кортежа с данными студента
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

# 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 с различными типами данных

# Создаём базу данных для библиотеки
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\"}"

Обработка ошибок

# Попытка создать кортеж с невалидным 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

(К началу)

Пример рабочей сессии со всем реализованным функционалом

# Создаём структуру данных
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. Прототипирование перед выбором специализированного решения

(К началу)

Дорожная карта

  • Реализовать
  • Реализовать

(К началу)

Контакты

Григорий Сафронов - E-mail

(К началу)

Description
Futriix release for Solaris based operating systems
Readme 265 KiB
Languages
Go 96.3%
Shell 3.7%