Futriix

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


## Краткая документация проекта Futriix
Содержание
  1. О проекте
  2. Лицензия
  3. Основные термины
  4. Подготовка
  5. Компиляция
  6. Примеры основных команд
  7. Репликация
  8. Резервное копирование
  9. Проблемы
  10. Дорожная карта
  11. Вклад
  12. Контакты
## О проекте Futriix это NOSQL документ-ориентированная субд без блокировок написанная на языке программирования Rust. Futriix является резидентной субд, т.е. хранящей свои данные в оперативной памяти, с их периодическим сохранением на внутренний носитель: HDD (жёсткий диск) или SSD-накопитель. ## Лицензия Проект распространяется под 3-пунктной лицензией BSD. Подробнсти смотрите в файле `LICENSE.txt`. ## Основные термины * **База Данных(БД)** -массив информация, хранящийся, например, на флешке, в файле, на кластере * **Система Управления Базами Данных(СУБД)** - Это программа для внесения изменений в базу данных и поиска по ней * **Резидентная СУБД** - субд, хранящая все свои данные в оперативной памяти, с периодическим сохранением на HDD или SSD * **Инстанс** - запущенный экземляр базы данных * **Узел (хост,нода)** - физический сервер * **Таппл** - аналог документа в любой документно-ориентированной субд * **Кластер** - группа компьютеров, объединённых высокоскоростными каналами связи и представляющая с точки зрения пользователя единый аппаратный ресурс * Команды, выполняемые с привилегиями суперпользователя (root), отмечены символом приглашения **«#»** * Команды, выполняемые с правами обычного пользователя(user), отмечены символом приглашения **«$»** * **FutBot** - интеллектуальный помощник в мессенджере Телеграмм, помогающий осущесвлять быстрый поиск по документации проекта ## Подготовка **Для операционных систем семейства Debian** выполните следующие шаги: * Устанавливаем язык программирования Rust ```sh # apt update # apt upgrade # curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ``` **Для операционных систем семейства Red Hat (Fedora, Aurora)** выполните следующие шаги: * Устанавливаем язык программирования Rust ```sh # dnf update # curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ``` **Для операционной системы Alpine** выполните следующие шаги: * Устанавливаем язык программирования Rust ```sh # apk update # curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ``` ## Компиляция 1. Копируем репозиторий ```sh $ git clone https://source.futriix.ru/gvsafronov/futriixw ``` 2. Переходим в каталог с исходном кодом src ```sh $ cd futriixw/ ``` 3. Компилируем Futriix с помощью утилиты Make ```sh $ cargo build ``` > [!WARNING] > **Futriix также может быть скомпилирован для следующих операционных систем: `Linux`, `OSX`, `Open Indiana`, `FreeBSD`, но сборка для этих операционных систем не проводилась!!!** ## Примеры основных команд В данном разделе приведён пример основных команд субд Futriix Запускаем клиент Futriix, перейдя в каталог с исходным кодом: ```sh $ cd /target/realease && ./futriix-cli ``` Проверяем доступность сервера, выполняяя команду `insert`, если будет получен ответ `successful`-значит вставка данных работает корректно ```sh futriix:~> insert user1 {"name": "Alice", "age": 25} Insert successful ``` Считываем значение таппла `user1` командой ниже `get`: ```sh futriix:~> get user1 { "age": 25, "name": "Alice" } ``` Изменим значение переменных `name`, `age`, командой ниже: ```sh futriix:~> update user5 '{"name": "Alice Smith", "age": 26}' Update successful ``` Удалим весь таппл ```sh futriix:~> delete user1 Delete successful ``` Посмотрим как работают транзакции (создание, откат, коммит) ```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 ```

(К началу)

## Репликация 1. Откройте директорию с Futriix: ```sh $ cd futriix ``` 2. Откройте файл конфигурации futriix.conf в любом текстовом редакторе, например nano, как в примере приведённом ниже: ```sh $ nano futriix/futriix.conf ``` 3. Проверьте, установлены ли значения "yes" для параметров "active-replica" и "multi-master" в файле конфигурации `futriix.conf` После чего добавьте в файл конфигурации ip-адреса, узлов вашего кластера. Если вы всё сделали правильно у вас должны отобразится строки в файле конфигурации `futriix.conf` как показано ниже: ```sh port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes ``` 4. Сохраните внесённые вами изменения, выйдите из редактора, воспользовавшись командами ниже: ```sh $ ctrl+O $ ctrl+x ``` 5. Перейдите в директорию Futriix и запустите скрипт `cluster.sh` с параметрами `pick` (скрипт запущенный с данным параметром "соберёт кластер"), и `run`,(скрипт запущенный с данным параметром "запустит кластер") как указано ниже: ```sh $ ./cluster pick $ ./cluster run ``` 6. Для остановки кластера запустите скрипт `cluster.sh` с параметром `stop` ```sh $ ./cluster stop ```

(К началу)

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

(К началу)

## Проблемы В данном разделе описаны типовые проблемы, возникающие при эксплуатации субд 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 ``` **Решение:** При запуске инстанса сервера 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 будет крутиться в ожидании меньшего времени, прежде чем приостановить поток. Это приводит к лучшей пропускной способности, когда время ЦП ограничено. Однако «правильным» решением является обеспечение того, чтобы время ЦП не было так ограничено.

(К началу)

## Дорожная карта - [x] Реализовать поддержку хранимых процедур - [x] Реализовать поддержку многопоточности - [x] Реализовать неблокирующие чтение/запись - [x] Реализовать мульти-мастер репликацию через файл конфигурации - [x] Реализовать логирование - [x] Реализовать команды сервера для управления репликацией - [x] Реализовать поддержку первичных индексов - [x] Реализовать поддержку протокола MessagePack - [x] Реализовать поддержку транзакций - [x] Добавить механизм сторонних модулей на языке lua, расширяющих базовый функционал сервера - [x] Добавить макет интеллектуального помощника FutBot - [x] Реализовать проверку запуска сервера при запуске клиента (если сервер НЕ запущен клиент не запускается) - [ ] Реализовать поддержку HTTP-restfull API - [ ] Реализовать утилиту тестирования сервера на количество запросов на чтение/запись - [ ] Реализовать поддержку алгоритма 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. Откройте запрос на включение ## Контакты Григорий Сафронов - [E-mail](gvsafronov@yandex.ru) Ссылка на Интеллектуальный помощник - [FutBot](https://t.me/Futriix_bot)

(К началу)