2025-06-15 20:43:34 +00:00
<!-- 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-Futriix.png" height = 100 > < / img >
< / a >
< h3 align = "center" > Futriix< / h3 >
< p align = "center" >
2025-07-01 20:01:48 +00:00
< b > Проект Futriix это NOSQL субд без блокировок< / b > < br >
2025-06-15 20:43:34 +00:00
< br / >
< br / >
<!-- <a href="">Сообщить о б ошибке</a>
·
<!-- <a href="">Предложение новой функциональности</a> -->
< / p >
< / div >
## Краткая документация проекта Futriix
<!-- 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 >
2025-07-03 18:37:33 +00:00
< li >< a href = " #примеры -основных-команд" > Примеры основных команд</ a ></ li >
2025-07-06 19:04:05 +00:00
< li >< a href = " #репликация " > Репликация</ a ></ li >
< li >< a href = " #резервное -копирование" > Резервное копирование</ a ></ li >
2025-07-07 21:15:28 +00:00
< li >< a href = " #http -api" > Http API</ a ></ li >
2025-07-01 19:59:43 +00:00
< li >< a href = " #проблемы " > Проблемы</ a ></ li >
2025-07-01 20:01:06 +00:00
< li >< a href = " #дорожная -карта" > Дорожная карта</ a ></ li >
2025-06-15 20:43:34 +00:00
< li >< a href = " #вклад " > Вклад</ a ></ li >
< li >< a href = " #контакты " > Контакты</ a ></ li >
< / ol >
<!-- </details> -->
<!-- ABOUT THE PROJECT -->
## О проекте
2025-07-01 19:49:43 +00:00
Futriix это NOSQL документ-ориентированная субд без блокировок написанная на языке программирования Rust.
2025-06-15 20:43:34 +00:00
Futriix является резидентной субд, т.е . хранящей свои данные в оперативной памяти, с их периодическим сохранением на внутренний носитель: HDD (жёсткий диск) или SSD-накопитель.
<!-- LICENSE -->
## Лицензия
2025-07-01 19:49:43 +00:00
Проект распространяется под 3-пунктной лицензией BSD. Подробнсти смотрите в файле `LICENSE.txt` .
2025-06-15 20:43:34 +00:00
## Основные термины
* **База Данных(БД)** -массив информация, хранящийся, например, на флешке, в файле, на кластере
* **Система Управления Базами Данных(СУБД)** - Это программа для внесения изменений в базу данных и поиска по ней
* **Резидентная СУБД** - субд, хранящая все свои данные в оперативной памяти, с периодическим сохранением на HDD или SSD
* **Инстанс** - запущенный экземляр базы данных
* **Узел (хост,нода)** - физический сервер
2025-07-06 19:26:42 +00:00
* **Таппл** - аналог документа в любой документно-ориентированной субд
2025-06-15 20:43:34 +00:00
* **Кластер** - группа компьютеров, объединённых высокоскоростными каналами связи и представляющая с точки зрения пользователя единый аппаратный р е с у р с
* Команды, выполняемые с привилегиями суперпользователя (root), отмечены символом приглашения ** «#»**
* Команды, выполняемые с правами обычного пользователя(user), отмечены символом приглашения ** «$»**
* **FutBot** - интеллектуальный помощник в мессенджере Телеграмм, помогающий осущесвлять быстрый поиск по документации проекта
## Подготовка
**Для операционных систем семейства Debian** выполните следующие шаги:
2025-07-06 19:26:42 +00:00
* Устанавливаем язык программирования Rust
2025-06-15 20:43:34 +00:00
```sh
# apt update
# apt upgrade
2025-07-06 19:26:42 +00:00
# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
2025-06-15 20:43:34 +00:00
```
**Для операционных систем семейства Red Hat (Fedora, Aurora)** выполните следующие шаги:
2025-07-06 19:26:42 +00:00
* Устанавливаем язык программирования Rust
2025-06-15 20:43:34 +00:00
```sh
# dnf update
2025-07-06 19:26:42 +00:00
# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
2025-06-15 20:43:34 +00:00
```
**Для операционной системы Alpine** выполните следующие шаги:
2025-07-06 19:26:42 +00:00
* Устанавливаем язык программирования Rust
2025-06-15 20:43:34 +00:00
```sh
# apk update
2025-07-06 19:26:42 +00:00
# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
2025-06-15 20:43:34 +00:00
```
2025-07-03 18:39:07 +00:00
2025-06-15 20:43:34 +00:00
## Компиляция
1. Копируем репозиторий
```sh
2025-07-06 21:12:44 +00:00
$ git clone https://source.futriix.ru/gvsafronov/futriix
2025-06-15 20:43:34 +00:00
```
2. Переходим в каталог с исходном кодом src
```sh
2025-07-01 19:49:43 +00:00
$ cd futriixw/
2025-06-15 20:43:34 +00:00
```
3. Компилируем Futriix с помощью утилиты Make
```sh
$ cargo build
```
> [!WARNING]
2025-07-01 19:59:43 +00:00
> **Futriix также может быть скомпилирован для следующих операционных систем: `Linux`, `OSX`, `Open Indiana`, `FreeBSD`, но сборка для этих операционных систем не проводилась!!!**
<!-- USAGE EXAMPLES -->
2025-07-03 18:37:03 +00:00
## Примеры основных команд
2025-07-01 19:59:43 +00:00
В данном разделе приведён пример основных команд субд Futriix
Запускаем клиент Futriix, перейдя в каталог с исходным кодом:
```sh
2025-07-06 19:14:55 +00:00
$ cd /target/realease & & ./futriix-cli
2025-07-01 19:59:43 +00:00
```
2025-07-06 19:14:55 +00:00
Проверяем доступность сервера, выполняяя команду `insert` , если будет получен ответ `successful` -значит вставка данных работает корректно
```sh
futriix:~> insert user1 {"name": "Alice", "age": 25}
Insert successful
```
Считываем значение таппла `user1` командой ниже `get` :
2025-07-01 19:59:43 +00:00
```sh
2025-07-06 19:14:55 +00:00
futriix:~> get user1
{
"age": 25,
"name": "Alice"
}
2025-07-01 19:59:43 +00:00
```
2025-07-06 19:14:55 +00:00
Изменим значение переменных `name` , `age` , командой ниже:
2025-07-01 19:59:43 +00:00
```sh
2025-07-06 19:14:55 +00:00
futriix:~> update user5 '{"name": "Alice Smith", "age": 26}'
Update successful
2025-07-01 19:59:43 +00:00
2025-07-06 19:14:55 +00:00
```
2025-07-06 19:26:42 +00:00
Удалим весь таппл
2025-07-01 19:59:43 +00:00
```sh
2025-07-06 19:14:55 +00:00
futriix:~> delete user1
Delete successful
2025-07-01 19:59:43 +00:00
```
2025-07-06 19:32:38 +00:00
Посмотрим как работают транзакции (создание, откат, коммит)
```sh
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, а потом удалим е г о
```sh
futriix:~> createindex age
Index created on field 'age'
futriix:~> dropindex age
Index dropped
```
2025-07-01 19:59:43 +00:00
< p align = "right" > (< a href = " #readme -top" > К началу</ a > )</ p >
2025-07-06 19:04:05 +00:00
## Репликация
2025-07-01 19:59:43 +00:00
2025-07-06 20:13:16 +00:00
1. Включите репликацию в конфигурационном файле `futriix.config.toml` , установив enabled = true в секции [replication] в файле конфигурации
`futriix.config.toml`
2025-07-01 19:59:43 +00:00
```sh
2025-07-06 20:13:16 +00:00
[replication]
enabled = false # Включена ли репликация
peer_nodes = [] # Список узлов для репликации (например ["192.168.1.2:8080"])
sync_interval = 1000 # Интервал синхронизации в мс
2025-07-01 19:59:43 +00:00
```
2025-07-06 20:13:16 +00:00
2. Откройте файл конфигурации `futriix.config.toml` в любом текстовом редакторе, например nano, если вы всё сделали правильно, он должен выглядеть так:
2025-07-01 19:59:43 +00:00
```sh
2025-07-06 20:13:16 +00:00
$ nano futriix/futriix.conf.toml
2025-07-01 19:59:43 +00:00
```
```sh
2025-07-06 20:13:16 +00:00
[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 больше основного)
2025-07-01 19:59:43 +00:00
```
2025-07-06 20:13:16 +00:00
4. Сохраните внесённые вами изменения, после чего репликация будет доступна в субд, выйдите из редактора, воспользовавшись командами ниже:
2025-07-01 19:59:43 +00:00
```sh
$ ctrl+O
$ ctrl+x
```
2025-07-06 20:13:16 +00:00
5. Также для включения репликации вы можете использовать команду в `futriix-cli` :
```sh
futriix:~> replication on
```
Сервер автоматически начнёт синхронизацию с указанными пирами (peer_nodes) с заданным интервалом (sync_interval).
После включения сервер будет периодически отправлять команды из истории (command_history) на все пиры для поддержания согласованности данных.
### Команды для управления репликацией
В проекте добавлены следующие команды для управления репликацией:
2025-07-07 17:22:31 +00:00
```sh
replication on — включить репликацию
replication off — выключить репликацию
replication status — получить статус репликации (включена/выключена, список пиров, время последней синхронизации)
replication add-peer < addr > — добавить пир для репликации (например, replication add-peer 127.0.0.1:8081)
replication remove-peer < addr > — удалить пир из списка репликации
2025-07-01 19:59:43 +00:00
```
2025-07-06 20:16:33 +00:00
2025-07-06 19:04:05 +00:00
## Резервное копирование
2025-07-06 20:16:33 +00:00
```sh
```
2025-07-06 19:04:05 +00:00
< p align = "right" > (< a href = " #readme -top" > К началу</ a > )</ p >
2025-07-06 20:16:33 +00:00
2025-07-07 21:15:28 +00:00
## Http API
```sh
```
< p align = "right" > (< a href = " #readme -top" > К началу</ a > )</ p >
2025-07-01 19:59:43 +00:00
## Проблемы
В данном разделе описаны типовые проблемы, возникающие при эксплуатации субд Futrix.
1. **Описание проблемы:** При запуске инстанса futriix, появляется следующее сообщение:
```sh
Warning: no config file specified, using the default config. In order to specify a config file use ./futriix-server /path/to/futriix.conf
2025-07-06 20:16:33 +00:00
2025-07-01 19:59:43 +00:00
**Решение:**
При запуске инстанса сервера futriix, указать корректный путь до файла конфигурации, командой ниже:
```sh
$ ./futriix-server /path/to/futriix.conf
```
2. **Описание проблемы:** При запуске инстанса Futriix, появляется следующее сообщение:
```sh
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 будет крутиться в ожидании меньшего времени, прежде чем приостановить поток. Это приводит к лучшей пропускной способности, когда время ЦП ограничено. Однако «правильным» решением является обеспечение того, чтобы время ЦП не было так ограничено.
< p align = "right" > (< a href = " #readme -top" > К началу</ a > )</ p >
<!-- ROADMAP -->
## Дорожная карта
2025-07-01 21:01:04 +00:00
- [x] Реализовать поддержку хранимых процедур
- [x] Реализовать поддержку многопоточности
- [x] Реализовать неблокирующие чтение/запись
2025-07-01 21:05:46 +00:00
- [x] Реализовать мульти-мастер репликацию через файл конфигурации
- [x] Реализовать логирование
- [x] Реализовать команды сервера для управления репликацией
2025-07-01 21:01:04 +00:00
- [x] Реализовать поддержку первичных индексов
- [x] Реализовать поддержку протокола MessagePack
- [x] Реализовать поддержку транзакций
2025-07-01 21:05:46 +00:00
- [x] Добавить механизм сторонних модулей на языке lua, расширяющих базовый функционал сервера
2025-07-01 19:59:43 +00:00
- [x] Добавить макет интеллектуального помощника FutBot
2025-07-03 18:50:41 +00:00
- [x] Реализовать проверку запуска сервера при запуске клиента (если сервер Н Е запущен клиент не запускается)
2025-07-06 13:21:55 +00:00
- [ ] Реализовать поддержку HTTP-restfull API
2025-07-01 21:01:04 +00:00
- [ ] Реализовать утилиту тестирования сервера на количество запросов на чтение/запись
2025-07-01 19:59:43 +00:00
- [ ] Реализовать поддержку алгоритма Raft
2025-07-01 21:01:04 +00:00
- [ ] Реализовать поддержку SQL
2025-07-01 21:05:46 +00:00
- [ ] Реализовать поддержку вторичных индексов
2025-07-01 19:59:43 +00:00
- [ ] Реализовать поддержку ACID-транзакций
- [ ] Реализовать полноценного интеллектуального помощника FutBot, задачами которого будут быстрый поиск ответов на вопросы, возникающие при эксплуатации субд Futrix.
2025-07-01 21:01:04 +00:00
См. [Открытые проблемы ](https://source.futriix.ru/gvsafronov/futriixw/issues ) полный список предлагаемых функций (и известных проблем).
2025-07-01 19:59:43 +00:00
< p align = "right" > (< a href = " #readme -top" > К началу</ a > )</ p >
<!-- CONTRIBUTING -->
2025-06-15 20:43:34 +00:00
<!-- CONTRIBUTING -->
## Вклад
Вклады — это то, что делает сообщество открытого исходного кода таким замечательным местом для обучения, вдохновения и творчества. Любой ваш вклад **очень ценится** .
Если у вас есть предложение, которое могло бы улучшить ситуацию, создайте форк репозитория и создайте запрос на включение. Также можно просто открыть задачу с тегом «улучшение».
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 )
< p align = "right" > (< a href = " #readme -top" > К началу</ a > )</ p >