Futriix это мультимодельная NOSQL субд без блокировок написанная на языке программирования Rust.
Поддерживает следующие модели хранения данных: модель временных рядов (time series), документную, ключ-значение.
Для расщирения базового функционала имеет встроенный lua-интепретатор.
Futriix является резидентной субд, т.е. хранящей свои данные в оперативной памяти, с их периодическим сохранением на внутренний носитель: HDD (жёсткий диск) или SSD-накопитель.
<!-- LICENSE -->
## Лицензия
Проект распространяется под 3-пунктной лицензией BSD. Подробнсти смотрите в файле `LICENSE.txt`.
## Основные термины
* **База Данных(БД)** -массив информация, хранящийся, например, на флешке, в файле, на кластере
* **Система Управления Базами Данных(СУБД)** - Это программа для внесения изменений в базу данных и поиска по ней
* **Мультимодельная СУБД** - Это субд, поддерживающая одновременно несколько моделей хранения данных
* **Резидентная СУБД** - субд, хранящая все свои данные в оперативной памяти, с периодическим сохранением на HDD или SSD
* **Инстанс** - запущенный экземляр базы данных
* **Узел (хост,нода)** - физический сервер
* **Таппл** - аналог документа в любой документно-ориентированной субд
* **Репликасет** - группа актуальных данных,хранящиеся на нескольких узлах
* **Временные ряды (time series) ** - это данные, последовательно собранные в регулярные промежутки времени, полученные из какого-либо устройства (цены на акции, данные температуры, объёмы продаж и.т.д.)
* **Кластер** - группа компьютеров, объединённых высокоскоростными каналами связи и представляющая с точки зрения пользователя единый аппаратный ресурс
* Команды, выполняемые с привилегиями суперпользователя (root), отмечены символом приглашения **«#»**
* Команды, выполняемые с правами обычного пользователя(user), отмечены символом приглашения **«$»**
* **FutBot** - интеллектуальный помощник в мессенджере Телеграмм, помогающий осущесвлять быстрый поиск по документации проекта
$ cargo test --test integration # запуск только интеграционных тестов
$ cargo test --bench benches # запуск только бенчмарков
```
> [!WARNING]
> **Futriix также может быть скомпилирован для следующих операционных систем: `Linux`, `OSX`, `Open Indiana`, `FreeBSD`, но сборка для этих операционных систем не проводилась!!!**
<!-- USAGE EXAMPLES -->
## Примеры основных команд
В данном разделе приведён пример основных команд субд Futriix
Запускаем клиент Futriix, перейдя в каталог с исходным кодом:
1. Включите репликацию в конфигурационном файле `futriix.config.toml`, установив enabled = true в секции [replication] в файле конфигурации
`futriix.config.toml`
```sh
[replication]
enabled = false # Включена ли репликация
peer_nodes = [] # Список узлов для репликации (например ["192.168.1.2:8080"])
sync_interval = 1000 # Интервал синхронизации в мс
```
2. Откройте файл конфигурации `futriix.config.toml` в любом текстовом редакторе, например nano, если вы всё сделали правильно, он должен выглядеть так:
```sh
$ nano futriix/futriix.conf.toml
```
```sh
[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 больше основного)
```
4. Сохраните внесённые вами изменения, после чего репликация будет доступна в субд, выйдите из редактора, воспользовавшись командами ниже:
```sh
$ ctrl+O
$ ctrl+x
```
5. Также для включения репликации вы можете использовать команду в `futriix-cli`:
```sh
futriix:~> replication on
```
Сервер автоматически начнёт синхронизацию с указанными пирами (peer_nodes) с заданным интервалом (sync_interval).
После включения сервер будет периодически отправлять команды из истории (command_history) на все пиры для поддержания согласованности данных.
### Команды для управления репликацией
В проекте добавлены следующие команды для управления репликацией:
```sh
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 - Создание бэкапа
```sh
futunload <путь_к_файлу_бэкапа>
```
Пример 1: Создать бэкап в текущей директории
```sh
futunload ./backups/snapshot_2024.fut
Вывод при успехе:
text
Backup created successfully at ./backups/snapshot_2024.fut
```
Пример 2: Создать бэкап с абсолютным путём
```sh
futunload /var/backups/futriix/db_export.fut
```
2. futload - Восстановление из бэкапа
Формат команды:
bash
```sh
futload <путь_к_файлу_бэкапа>
```
Пример 1: Восстановить из локального файла
bash
```sh
futload ./backups/snapshot_2024.fut
Вывод при успехе:
text
Backup restored successfully from ./backups/snapshot_2024.fut
- [x] Реализовать проверку запуска сервера при запуске клиента (если сервер НЕ запущен клиент не запускается)
- [x] Реализовать поддержку HTTP-restfull API
- [x] Исправить ошибки записи журнала логов (в журнал лога кроме текущего времени добавить текущий год)
- [ ] Реализовать утилиту тестирования сервера на количество запросов на чтение/запись
- [ ] Реализовать поддержку алгоритма Raft
- [ ] Реализовать поддержку SQL
- [ ] Реализовать поддержку вторичных индексов
- [ ] Реализовать поддержку ACID-транзакций
- [ ] Реализовать полноценного интеллектуального помощника FutBot, задачами которого будут быстрый поиск ответов на вопросы, возникающие при эксплуатации субд Futrix.
См. [Открытые проблемы](https://source.futriix.ru/gvsafronov/futriixw/issues) полный список предлагаемых функций (и известных проблем).
Вклады — это то, что делает сообщество открытого исходного кода таким замечательным местом для обучения, вдохновения и творчества. Любой ваш вклад **очень ценится**.
Если у вас есть предложение, которое могло бы улучшить ситуацию, создайте форк репозитория и создайте запрос на включение. Также можно просто открыть задачу с тегом «улучшение».
1. Форкните проект
2. Создайте свою ветку функций (`git checkout -b Feature/AmazingFeature`)
3. Зафиксируйте свои изменения (git commit -m 'Add some AmazingFeature'`)
4. Отправьте в ветку (`git push main Feature/AmazingFeature`)
5. Откройте запрос на включение
<!-- CONTACT -->
## Контакты
Григорий Сафронов - [E-mail](gvsafronov@yandex.ru)
Ссылка на Интеллектуальный помощник - [FutBot](https://t.me/Futriix_bot)