diff --git a/Logo-Futriix.png b/Logo-Futriix.png new file mode 100644 index 0000000..6d7d741 Binary files /dev/null and b/Logo-Futriix.png differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..601e7f9 --- /dev/null +++ b/README.md @@ -0,0 +1,319 @@ + + + + + + +
+
+ + + + +

Futriix

+ +

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

+
+ + ## Краткая документация проекта Futriix + + +
+ + Содержание
+
    +
  1. + О проекте +
  2. Лицензия
  3. +
  4. Основные термины
  5. +
  6. Подготовка
  7. +
  8. Компиляция
  9. +
  10. Примеры основных команд
  11. +
  12. Репликация
  13. +
  14. Резервное копирование
  15. +
  16. Проблемы
  17. +
  18. Дорожная карта
  19. +
  20. Вклад
  21. +
  22. Контакты
  23. +
+ + + +## О проекте + +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) + +

(К началу)