futriix-timeseries/README.md

275 lines
15 KiB
Markdown
Raw Normal View History

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 19:49:43 +00:00
Проект Futriix это NOSQL субд без блокировок <br>
2025-06-15 20:43:34 +00:00
<br />
<br />
<!-- <a href="">Сообщить об ошибке</a>
&middot;
<!-- <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-01 19:59:43 +00:00
<li><a href="#примеры">Примеры</a></li>
<li><a href="#кластер">Кластер</a></li>
<li><a href="#проблемы">Проблемы</a></li>
<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
* **Инстанс** - запущенный экземляр базы данных
* **Узел (хост,нода)** - физический сервер
* **Кластер** - группа компьютеров, объединённых высокоскоростными каналами связи и представляющая с точки зрения пользователя единый аппаратный ресурс
* Команды, выполняемые с привилегиями суперпользователя (root), отмечены символом приглашения **«#»**
* Команды, выполняемые с правами обычного пользователя(user), отмечены символом приглашения **«$»**
* **FutBot** - интеллектуальный помощник в мессенджере Телеграмм, помогающий осущесвлять быстрый поиск по документации проекта
## Подготовка
**Для операционных систем семейства Debian** выполните следующие шаги:
* Устанавливаем язык программирования C/C++, соопутствующие утилиты (autoconf и другие)
```sh
# apt update
# apt upgrade
# apt install build-essential nasm autotools-dev autoconf libjemalloc-dev tcl tcl-dev uuid-dev libcurl4-openssl-dev cmake git hugepages
```
**Для операционных систем семейства Red Hat (Fedora, Aurora)** выполните следующие шаги:
* Устанавливаем язык программирования C/C++, соопутствующие утилиты (autoconf и другие)
```sh
# dnf update
# dnf install -y jemalloc-devel g++ libuuid-devel libatomic openssl-devel curl-devel cmake git hugepages
```
* Устанавливаем язык программирования Golang по инструкции с [официального сайта](https://go.dev/doc/install)
**Для операционной системы Alpine** выполните следующие шаги:
* Устанавливаем язык программирования C/C++, соопутствующие утилиты (autoconf и другие)
```sh
# apk update
# apk add --no-cache coreutils gcc linux-headers make musl-dev util-linux-dev openssl-dev curl-dev g++ bash git perl libunwind-dev
```
* Устанавливаем язык программирования Golang по инструкции с [официального сайта](https://go.dev/doc/install)
## Компиляция
1. Копируем репозиторий
```sh
2025-07-01 19:49:43 +00:00
$ git clone https://source.futriix.ru/gvsafronov/futriixw
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 -->
## Примеры
В данном разделе приведён пример основных команд субд Futriix
Запускаем клиент Futriix, перейдя в каталог с исходным кодом:
```sh
$ cd src && ./futriix-cli
```
Проверяем доступность сервера, выполняяя команду `ping`, если будет получен ответ `pong`-значит сервер доступен и работает корректно
```sh
127.0.0.1:futriix:~> ping
PONG
```
Присваеваем значение переменной `foo` равное `bar`, командой ниже:
```sh
127.0.0.1:futriix:~> set foo bar
OK
```
Получаем значение переменной `foo`, командой ниже:
```sh
$ get foo
"bar"
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Кластер
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
```
<p align="right">(<a href="#readme-top">К началу</a>)</p>
## Проблемы
В данном разделе описаны типовые проблемы, возникающие при эксплуатации субд 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 будет крутиться в ожидании меньшего времени, прежде чем приостановить поток. Это приводит к лучшей пропускной способности, когда время ЦП ограничено. Однако «правильным» решением является обеспечение того, чтобы время ЦП не было так ограничено.
<p align="right">(<a href="#readme-top">К началу</a>)</p>
<!-- ROADMAP -->
## Дорожная карта
- [x] Добавить поддержку хранимых процедур
- [x] Добавить поддержку многопоточности
- [x] Изменить приглашение командной строки клиента futriix-cli
- [x] Добавить в скрипт cluster.sh, формирующий кластер Futriix, цветовые текстовые индикаторы состояния процесса с левой стороны
- [x] Добавить поддержку модуля для работы с JSON
- [x] Удалить поддержку Sentinel
- [x] Добавить поддержку хранимых процедур
- [x] Добавить поддержку языка запросов SQL
- [x] Добавить поддержку запуска внешних команд ОС из субд
- [x] Добавить макет интеллектуального помощника FutBot
- [ ] Реализовать поддержку алгоритма Raft
- [ ] Реализовать поддержку роли Podman для автоматического развёртывания кластера в виртуальной среде
- [ ] Реализовать планировщик задач,основанный на вытесняющей многозадачности
- [ ] Реализовать поддержку ACID-транзакций
- [ ] Реализовать полноценного интеллектуального помощника FutBot, задачами которого будут быстрый поиск ответов на вопросы, возникающие при эксплуатации субд Futrix.
См. [Открытые проблемы](https://source.futriix.ru/gvsafronov/futriix/issues) полный список предлагаемых функций (и известных проблем).
<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>