2025-06-15 13:34:33 +00:00
2025-07-06 13:39:44 +00:00
2025-07-06 13:39:44 +00:00
2025-07-06 13:49:16 +00:00
2025-07-06 13:39:44 +00:00
2025-06-15 20:52:06 +00:00
2025-06-15 20:44:31 +00:00
2025-07-07 21:28:29 +00:00
2025-07-06 13:40:03 +00:00


Futriix

Проект Futriix это NOSQL субд без блокировок


Краткая документация проекта Futriix


Содержание
  1. О проекте
  2. Лицензия
  3. Основные термины
  4. Подготовка
  5. Компиляция
  6. Примеры основных команд
  7. Репликация
  8. Резервное копирование
  9. Http API
  10. Проблемы
  11. Дорожная карта
  12. Вклад
  13. Контакты

О проекте

Futriix это NOSQL документ-ориентированная субд без блокировок написанная на языке программирования Rust. Futriix является резидентной субд, т.е. хранящей свои данные в оперативной памяти, с их периодическим сохранением на внутренний носитель: HDD (жёсткий диск) или SSD-накопитель.

Лицензия

Проект распространяется под 3-пунктной лицензией BSD. Подробнсти смотрите в файле LICENSE.txt.

Основные термины

  • База Данных(БД) -массив информация, хранящийся, например, на флешке, в файле, на кластере
  • Система Управления Базами Данных(СУБД) - Это программа для внесения изменений в базу данных и поиска по ней
  • Резидентная СУБД - субд, хранящая все свои данные в оперативной памяти, с периодическим сохранением на HDD или SSD
  • Инстанс - запущенный экземляр базы данных
  • Узел (хост,нода) - физический сервер
  • Таппл - аналог документа в любой документно-ориентированной субд
  • Кластер - группа компьютеров, объединённых высокоскоростными каналами связи и представляющая с точки зрения пользователя единый аппаратный ресурс
  • Команды, выполняемые с привилегиями суперпользователя (root), отмечены символом приглашения «#»
  • Команды, выполняемые с правами обычного пользователя(user), отмечены символом приглашения «$»
  • FutBot - интеллектуальный помощник в мессенджере Телеграмм, помогающий осущесвлять быстрый поиск по документации проекта

Подготовка

Для операционных систем семейства Debian выполните следующие шаги:

  • Устанавливаем язык программирования Rust

     # apt update
     # apt upgrade
     # curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    

Для операционных систем семейства Red Hat (Fedora, Aurora) выполните следующие шаги:

  • Устанавливаем язык программирования Rust

     # dnf update
     # curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    

Для операционной системы Alpine выполните следующие шаги:

  • Устанавливаем язык программирования Rust

     # apk update
     # curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    

Компиляция

  1. Копируем репозиторий
     $ git clone https://source.futriix.ru/gvsafronov/futriix
    
  2. Переходим в каталог с исходном кодом src
     $ cd futriixw/
    
  3. Компилируем Futriix с помощью утилиты Make
    $ cargo build
    

Warning

Futriix также может быть скомпилирован для следующих операционных систем: Linux, OSX, Open Indiana, FreeBSD, но сборка для этих операционных систем не проводилась!!!

Примеры основных команд

В данном разделе приведён пример основных команд субд Futriix

Запускаем клиент Futriix, перейдя в каталог с исходным кодом:

 $ cd /target/realease && ./futriix-cli

Проверяем доступность сервера, выполняяя команду insert, если будет получен ответ successful-значит вставка данных работает корректно

futriix:~> insert user1 {"name": "Alice", "age": 25}
 Insert successful

Считываем значение таппла user1 командой ниже get:

  futriix:~> get user1
{
"age": 25,
"name": "Alice"          
}

Изменим значение переменных name, age, командой ниже:

futriix:~> update user5 '{"name": "Alice Smith", "age": 26}' 
Update successful

Удалим весь таппл

futriix:~> delete user1  
Delete successful

Посмотрим как работают транзакции (создание, откат, коммит)

futriix:~> begin
Transaction started

futriix:~> insert user3 {"name": "Charlie", "age": 40}     
Insert successful

futriix:~> rollback
Transaction aborted

futriix:~> insert user3 {"name": "Peter", "age": 32} 

futriix:~> commit
Transaction committed

Создадим индекс для поля age в таппле user3, а потом удалим его

futriix:~> createindex age                        
Index created on field 'age'

futriix:~> dropindex age
Index dropped

(К началу)

Репликация

  1. Включите репликацию в конфигурационном файле futriix.config.toml, установив enabled = true в секции [replication] в файле конфигурации futriix.config.toml
     [replication]
     enabled = false     # Включена ли репликация
     peer_nodes = []     # Список узлов для репликации (например ["192.168.1.2:8080"])
     sync_interval = 1000 # Интервал синхронизации в мс  
    
  2. Откройте файл конфигурации futriix.config.toml в любом текстовом редакторе, например nano, если вы всё сделали правильно, он должен выглядеть так:
     $ nano futriix/futriix.conf.toml
    
    [server]
    ip = "127.0.0.1"    # IP-адрес сервера (0.0.0.0 для доступа из сети)
    port = 8080         # Порт для TCP-сервера
    log_path = "futriix.log"  # Путь к лог-файлу
    
    [client]
    ip = "127.0.0.1"    # IP для клиента (обычно localhost)
    port = 8080         # Порт клиента (должен совпадать с серверным)
    
    [replication]
    enabled = false     # Включена ли репликация
    peer_nodes = []     # Список узлов для репликации (например ["192.168.1.2:8080"])
    sync_interval = 1000 # Интервал синхронизации в мс
    
    [http_api]
    enabled = true      # Включить HTTP API
    port = 8081         # Порт для HTTP API (обычно на 1 больше основного)
    
    
  3. Сохраните внесённые вами изменения, после чего репликация будет доступна в субд, выйдите из редактора, воспользовавшись командами ниже:
     $ ctrl+O
     $ ctrl+x
    
  4. Также для включения репликации вы можете использовать команду в futriix-cli:
    
    futriix:~> replication on
    
    Сервер автоматически начнёт синхронизацию с указанными пирами (peer_nodes) с заданным интервалом (sync_interval).

После включения сервер будет периодически отправлять команды из истории (command_history) на все пиры для поддержания согласованности данных.

Команды для управления репликацией

В проекте добавлены следующие команды для управления репликацией:

    replication on — включить репликацию
    replication off — выключить репликацию
    replication status — получить статус репликации (включена/выключена, список пиров, время последней синхронизации)
    replication add-peer <addr> — добавить пир для репликации (например, replication add-peer 127.0.0.1:8081)
    replication remove-peer <addr> — удалить пир из списка репликации

Резервное копирование

Для создания и восстановления из бекапа используются команды futload (восстановление из бэкапа) и futunload (создание бэкапа). Вот примеры использования команд futload (восстановление из бэкапа) и futunload (создание бэкапа) в Futriix CLI:

futunload - Создание бэкапа


futunload <путь_к_файлу_бэкапа>

Пример 1: Создать бэкап в текущей директории

futunload ./backups/snapshot_2024.fut

Вывод при успехе:
text

Backup created successfully at ./backups/snapshot_2024.fut

Пример 2: Создать бэкап с абсолютным путём

futunload /var/backups/futriix/db_export.fut
  1. futload - Восстановление из бэкапа

Формат команды: bash

futload <путь_к_файлу_бэкапа>

Пример 1: Восстановить из локального файла bash

futload ./backups/snapshot_2024.fut

Вывод при успехе:
text

Backup restored successfully from ./backups/snapshot_2024.fut

Пример 2: Восстановить из системного пути

futload /mnt/backups/prod_db.fut
 

(К началу)

Http API

Добавление данных:


curl -X POST http://localhost:8081/api/insert \
-d '{"user_42": {"name":"John", "age":30}}'

Получение данных:

curl -X GET http://localhost:8081/api/get/user_42

{"name":"John","age":30}
Пакетное обновление:

curl -X POST http://localhost:8081/api/update \
  -d '{"user_42": {"age":31}, "product_5": {"price":99}}'
   

Пример Python-программы с использованием Http-API:

import requests
BASE_URL = "http://localhost:8081/api"
def set_value(key, value):
    requests.post(f"{BASE_URL}/insert", json={key: value})
def get_value(key):
    return requests.get(f"{BASE_URL}/get/{key}").json()

(К началу)

Проблемы

В данном разделе описаны типовые проблемы, возникающие при эксплуатации субд Futrix.

  1. Описание проблемы: При запуске инстанса futriix, появляется следующее сообщение:
     Warning: no config file specified, using the default config. In order to specify a config file use ./futriix-server /path/to/futriix.conf
    
    
    

Решение:

При запуске инстанса сервера futriix, указать корректный путь до файла конфигурации, командой ниже:

 $ ./futriix-server /path/to/futriix.conf
  1. Описание проблемы: При запуске инстанса Futriix, появляется следующее сообщение:
     1:12:S 18 Apr 2025 04:47:25.643 # NOTICE: Detuning locks due to high load per core: 97.49%
     1:12:S 18 Apr 2025 04:47:55.491 # NOTICE: CPU pressure reduced
    

Решение:

Это штатная ситуация, и она не является ошибкой и не вызывает проблем. Суть этого сообщения в том, что futriix пытается корректно обработать ситуацию с превышением нагрузки на ЦП.

Futriix использует спинлоки для быстрой синхронизации. Когда нагрузка на ЦП превышает 100% на ядро, ядро может неосознанно предоставить время ЦП заблокированному потоку, который находится в состоянии ожидания, вместо активного потока. Это приводит к значительно большей задержке.

Когда такая ситуация обнаруживается, Futriix будет крутиться в ожидании меньшего времени, прежде чем приостановить поток. Это приводит к лучшей пропускной способности, когда время ЦП ограничено. Однако «правильным» решением является обеспечение того, чтобы время ЦП не было так ограничено.

(К началу)

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

  • Реализовать поддержку хранимых процедур
  • Реализовать поддержку многопоточности
  • Реализовать неблокирующие чтение/запись
  • Реализовать мульти-мастер репликацию через файл конфигурации
  • Реализовать логирование
  • Реализовать команды сервера для управления репликацией
  • Реализовать поддержку первичных индексов
  • Реализовать поддержку протокола MessagePack
  • Реализовать поддержку транзакций
  • Добавить механизм сторонних модулей на языке lua, расширяющих базовый функционал сервера
  • Добавить макет интеллектуального помощника FutBot
  • Реализовать проверку запуска сервера при запуске клиента (если сервер НЕ запущен клиент не запускается)
  • Реализовать поддержку HTTP-restfull API
  • Реализовать утилиту тестирования сервера на количество запросов на чтение/запись
  • Реализовать поддержку алгоритма Raft
  • Реализовать поддержку SQL
  • Реализовать поддержку вторичных индексов
  • Реализовать поддержку ACID-транзакций
  • Реализовать полноценного интеллектуального помощника FutBot, задачами которого будут быстрый поиск ответов на вопросы, возникающие при эксплуатации субд Futrix.

См. Открытые проблемы полный список предлагаемых функций (и известных проблем).

(К началу)

Вклад

Вклады — это то, что делает сообщество открытого исходного кода таким замечательным местом для обучения, вдохновения и творчества. Любой ваш вклад очень ценится.

Если у вас есть предложение, которое могло бы улучшить ситуацию, создайте форк репозитория и создайте запрос на включение. Также можно просто открыть задачу с тегом «улучшение».

  1. Форкните проект
  2. Создайте свою ветку функций (git checkout -b Feature/AmazingFeature)
  3. Зафиксируйте свои изменения (git commit -m 'Add some AmazingFeature'`)
  4. Отправьте в ветку (git push main Feature/AmazingFeature)
  5. Откройте запрос на включение

Контакты

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

Ссылка на Интеллектуальный помощник - FutBot

(К началу)

Description
Futriix это NOSQL субд написанная на языке программироания Rust без блокировок.
https://futriix.ru Readme BSD-3-Clause 350 KiB
Languages
Rust 100%