Falcot - это http сервер-приложений со встроенной мультимодельной NOSQL СУБД **futriix**с минимальным количеством блокировок, которая написана на языке программирования Rust. <br>
Поддерживает следующие модели хранения данных:
- модель временных рядов (time series)
- документную
- ключ-значение
Для расширения базового функционала имеет встроенный lua-интепретатор.<br>
СУБД futriix - это резидентная система, которая работает с данными в оперативной памяти (in-memory) и относится к классу **HTAP (Hybrid Transactional/Analytical Processing)**. При этом данные периодически сохраняются на диск (HDD или SSD) для защиты от потерь.
Одной из главных ключевых особенностей проекта, является тот факт, что приложение использует concurrent архитектуру с элементами lock-free подходов (атомарные счётчики, атомарные флаги в репликации, асинхронные задачи для фоновых операций), при этом не соответствуя строгому определению "wait-free (неблокирующая синхронизация)", где каждая операция должна завершаться за конечное число шагов независимо от активности других потоков.
С инженерной точки зрения оно представляет из себя "highly concurrent (систему высокой доступности)" систему с хорошей производительностью, но не с чистой "wait-free" архитектурой.
## Глоссарий
* **База Данных(БД)** - это структурированное, организованное хранилище данных, которое позволяет удобно собирать, хранить, управлять и извлекать информацию.
* **Система Управления Базами Данных(СУБД)** - это программное обеспечение, которое позволяет создавать, управлять и взаимодействовать с базами данных
* **Мультимодельная СУБД** - это СУБД, которая объединяет в себе поддержку нескольких моделей данных (реляционной, документной, графовой, ключ-значение и др.) в рамках единого интегрированного ядра.
* **Резидентная СУБД** - это СУБД, которая работает непрерывно в оперативной памяти (RAM).
* **Инстанс** - это запущенный экземляр базы данных.
* **Узел (хост,нода)** - это отдельный сервер (физический или виртуальный), который является частью кластера или распределенной системы и выполняет часть общей работы.
* **Слайс (от англ. "slice"-слой)** - это логический и физически изолированный фрагмент коллекции документов, полученный в результате горизонтального партиционирования (шардирования) и размещенный на определенном узле кластера с целью масштабирования производительности и объема данных.
* **Репликасет** - это группа серверов СУБД, объединенных в отказоустойчивую конфигурацию, где один узел выполняет роль первичного (принимающего операции записи), а один или несколько других - роль вторичных (синхронизирующих свои данные с первичным и обслуживающих чтение), с автоматическим переизбранием первичного узла в случае его сбоя.
* **Временные ряды (time series)** - это это упорядоченная во времени последовательность данных, собранная в регулярные промежутки времени из какого-либо источниика (цены на акции, данные температуры, объёмы продаж и.т.д.).
* **OLTP (Online Transactional Processing-Онлайн обработка транзакций)**- это технология обработки транзакций в режиме реального времени. Её основная задача заключается в обеспечении быстрого и надёжного выполнения операций, которые происходят ежесекундно в бизнесе. Они обеспечивают быстрое выполнение операций вставки, обновления и удаления данных, поддерживая целостность и надежность транзакций.
* **OLAP (Online Analytical Processing - Оперативная аналитическая обработка)** — это технология, которая работает с историческими массивами информации, извлекая из них закономерности и производя анализ больших объемов данных, поддерживает многоразмерные запросы и сложные аналитические операции. Данная технология оптимизирована для выполнения сложных запросов и предоставления сводной информации для принятия управленческих решений.
* **HTAP (Hybrid Transactional and Analytical Processing - Гибридная транзакционно-аналитическая обработка)**- это технология, которая заключаются в эффективном совмещении операционных и аналитических запросов, т.е. классов OLTP и OLAP.
* **Кластер** - это группа компьютеров, объединённых высокоскоростными каналами связи для решения сложных вычислительных задач и представляющая с точки зрения пользователя группу серверов, объединенных для работы как единая система.
* **FutBot** - это интеллектуальный помощник в мессенджере Телеграмм, помогающий осущесвлять быстрый поиск по документации проекта.
* **Сервер-приложений (англ. application-server)** - это программное обеспечение, которое обеспечивает выполнение бизнес-логики и обработку запросов от клиентов (например, веб-браузеров или мобильных приложений). Он служит платформой для развертывания и управления приложениями, имея встроенные интепретаторы и/или компиляторы популярных языков программирования (php,go,python), что обеспечивает взаимодействие между пользователями, базами данных и другими системами.
* **futriix** - это сервер проекта futriix.
* **Интерактивная оболочка (неофициальное название "clif")** - это клиент для работы со встроенной СУБД.
* **workflow (англ. workflow — «поток работы»)** — это принцип организации рабочих процессов, в соответствии с которым повторяющиеся задачи представлены как последовательность стандартных шагов.
* **wait-free" (дословно с англ. wait-free — «свободный от ожидания»)**-класс неблокирующих алгоритмов, в которых каждая операция должна завершаться за конечное число шагов независимо от активности других потоков.
* **CA (англ. Certificate Authority - Центры Сертификации)** - это организации, которые выдают доверенные криптографические сертификаты.
* Команды, выполняемые с привилегиями суперпользователя (root), отмечены символом приглашения **«#»**
* Команды, выполняемые с правами обычного пользователя(user), отмечены символом приглашения **«$»**
1.**Единая платформа - обрабатывает и транзакции, и аналитику**
2.**Wait-free архитектура - подходит для mixed workload**
3.**Lua-скрипты - мост между операционными и аналитическими задачами**
4.**Реализация индексов - поддерживает оба типа нагрузок**
<br>
<br>
Если посмотреть на архитектурные особенности falcot, то можно заметить следующее:
1.**Wait-free доступ подходит для concurrent transactional workload**
2.**Document-oriented модель удобна для analytical queries**
3.**Master-master репликация позволяет разделять нагрузки**
4.**Функциональные возможности обоих классов OLTP и OLAP (См. пример ниже)**
<br>
> [!CAUTION]
> **falcot НЕ поддерживает:**
> * Полноценные распределённые транзакции
> * Сложные ограничения (constraints)
> * Хранилища типа "Семейство столбцов" (Columnar Storage) для аналитики
> * Сложные агрегации
> * Язык запросов SQL
> * ACID-транзакции
<br>
<br>
> [!NOTE]
>**Falcot** - это lightweight HTAP система, занимающая нишу прагматичного HTAP - достаточно мощная для большинства реальных задач, но без > избыточной сложности enterprise-решений, **с акцентом на:**
> * Простоту использования через Lua-интерфейс
> * Гибридную модель для mixed workloads
> * Wait-free performance для concurrent access
> * Умеренную масштабируемость (достаточную для большинства задач)
Проект распространяется под 3-пунктной лицензией BSD. Подробнсти в файле `LICENSE.txt`.
Эта лицензия является одной из самых демократичных лицензий свободного программного обеспечения. Она позволяет использовать, изменять и распространять код в коммерческих целях без каких-либо ограничений, за исключением сохранения уведомления об авторских правах.
В том числе, Вы можете использовать falcot и futriix в своих коммерческих продуктах, приложениях или сервисах, не беспокоясь о каких-либо юридических ограничениях, связанных с лицензией.
Все дополнительное программное обеспечение (включая модули на языке lua, утилиту тестирования) предоставляются "как есть", без гарантий и обязательств со стороны разработчиков. Разработчики не несут ответственности за прямой или косвенный ущерб, вызванный использованием открытого кода falcot и futriix или технических решений, использующих этот код.
3. Компилируем Futriix с помощью пакетного менеджера `Cargo`
```sh
$ cargo build
```
> [!WARNING]
> **Futriix может быть скомпилирован для следующих операционных систем: `Linux`, `OSX`, `Open Indiana`, `FreeBSD`, но сборка для этих операционных систем не проводилась!!!**
<br>
4. Запускаем сервера futriix'ас помощью команды `./falcot`
```sh
$ ./falcot
````
Если проект был успешно скомпилирован, то при его запуске в терминале вы увидите, следующие сообщение:
<br>
```sh
Loading configuration from: config.toml
Database initialized with system collections
Falcot Database Server
Version: 1.0.0
Features: Wait-Free Architecture, Master-Master Replication, Lua Scripting, HTTP/HTTPS Support
HTTP server started on 127.0.0.1:8082
Starting Lua interpreter...
Lua interpreter ready. Type 'inbox.start' to enter database mode.
Type 'exit' to quit.
lua>
```
<br>
<br>
5.**Компиляция и запуск тестов. Для запуска тестов запускаем команды:**
```sh
$ cargo test --test integration # запуск только интеграционных тестов
$ cargo test --bench benches # запуск только бенчмарков
```
**Компиляция и запуск тестов c помощью утилиты тестирования с выводом логов**
```sh
cargo test --test integration_tests -- --nocapture
```
**Только компиляция утилиты тестирования без запуска**
Приведённая команда ниже только скомпилирует тесты, но не запускает их.
```sh
$ cargo test --test integration_tests --no-run
```
**Компиляция утилиты тестирования с конкретным тестом**
```sh
#### Компиляция и запуск конкретного теста
$ cargo test --test integration_tests regression_test
#### С выводом логов
$ cargo test --test integration_tests regression_test -- --nocapture
```
**Компиляция утилиты тестирования для debug-режима**
```sh
#### Обычная компиляция (debug по умолчанию)
$ cargo test --test integration_tests
#### Компиляция в release-режиме (оптимизированная)
$ cargo test --test integration_tests --release
```
**Проверка компиляции без запуска тестов с помощью утилиты тестирования**
```sh
#### Проверить, что код компилируется без ошибок
$ cargo check --test integration_tests
```
**Компиляция утилиты тестирования с дополнительными флагами**
```sh
# С подробным выводом компиляции
$ cargo test --test integration_tests -v
# С цветным выводом
$ cargo test --test integration_tests --color=always
```
<br>
<br>
> [!TIP]
> После компиляции тестовый бинарный файл создается в следующей директории:
> `target/debug/deps/integration_tests-<hash>`
> Например, так: `target/debug/deps/integration_tests-abc123def456`
**Пример полного workflow по компиляции**
```sh
# 1. Проверка компиляции
$ cargo check --test integration_tests
# 2. Компиляция и запуск всех тестов
$ cargo test --test integration_tests -- --nocapture
# 3. Компиляция и запуск только нагрузочного теста
$ cargo test --test integration_tests load_test -- --nocapture
# 4. Компиляция в release-режиме
$ cargo test --test integration_tests --release -- --nocapture
В состав проекта, входит утилита `integration_tests.rs`**integration_tests.rs** - это интеграционный тестовый набор, который при запуске создает и выполняет сразу несколько различных типов тестов. С её помощью можно запустить как сразу все тесты, так и определённый тест.
Вышеописанная утилита - является мощным инструментом для комплексного тестирования всей системы Falcot, позволяющий быстро выявлять проблемы на разных уровнях приложения и обеспечивать высокое качество кода.
**Falcot поддерживает пять типов тестов:**
***Регрессионный тест - проверяет базовую функциональность**
Document created with ID: b2c3d4e5-f6g7-8901-bcde-f23456789012
falcot:~> list users
Documents in collection: [{"_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","name":"Иван","age":25,"city":"Москва"},{"_id":"b2c3d4e5-f6g7-8901-bcde-f23456789012","name":"Мария","age":30,"city":"Санкт-Петербург"}]
Допустимые значения параметра `require_authentication`:
* false - анонимный доступ разрешен (по умолчанию)
* true - требуется аутентификация для всех операций
При установки значения параметра `require_authentication = true` клиенты должны предоставлять JWT токен. Он содержит информацию о пользователе и правах доступа. Токен проверяется с использованием параметра `jwt_secret` и подписываются секретным ключом для предотвращения подделки.
Без валидного токена операции блокируются. Все токены имеют ограниченное время жизни (обычно несколько часов).
Назначение: Защищает API от несанкционированного доступа
<br>
2.**jwt_secret = "your-secret-key-here"**
Назначение: Секретный ключ для JWT (JSON Web Tokens)
Формат: Произвольная строка, рекомендуется длинная криптостойкая
<br>
3.**password_hashing_rounds = 12**
Назначение: Количество раундов хеширования паролей. Пароли хешируются с указанным количеством раундов, и исходные пароли никогда не хранятся в чистом виде,что обеспечивает защиту от атак перебором даже при утечке базы данных.
Значения: Обычно от 10 до 15 (чем больше - тем безопаснее, но медленнее)
Алгоритм: Вероятно bcrypt (стандарт для безопасного хеширования)
Использование: Защита паролей пользователей в базе данных
Использование:
* Подписание JWT токенов аутентификации
* Верификация подлинности токенов
<br>
<br>
> [!CAUTION]
> **Важно!!!** В продакшене нужно заменить значение параметра `jwt_secret ` на длинный (не менее 32 символов) уникальный сложный ключ.
Таким образом, первичный индекс в falcot - это автоматически создаваемый уникальный индекс для поля `id`, в то время как вторичные индексы создаются вручную для оптимизации произвольных запросов и могут быть как уникальными, так и неуникальными.
**Ограничения (Constraints)** — это правила, применяемые к данным в таблице в реляционных СУБД (или её аналоге в не реляцционных СУБД) для поддержания их корректности и надёжности. Они играют важную роль в обеспечении целостности данных и соответствия бизнес-правилам.
При создании таблицы или измененинии её структуры, можно определить различные ограничения,предотвращающие добавление, изменение или удаление данных, нарушающих установленные правила. Это помогает избежать нежелательных ситуаций, например таких как:
* **Наличие нескольких пользователей с одинаковыми идентификаторами**
* **Ссылки на несуществующие записи в других таблицах**
* **Отсутствие данных обязательных для заполнения**
* **Ввод некорректных значений (например, отрицательного возраста или будущей даты рождения)**
Ограничения реализованы на уровне встроенной СУБД **futriix**, ниже приведы примеры использования ограничений:
<br>
**Пример уникального ограничения поля**
```sh
#### Гарантируем уникальность email в коллекции users
**Хранимая процедура в falcot** – это откомпилированная во внутреннее представление сервера СУБД подпрограмма, хранящаяся в базе данных. Хранимые процедуры пишутся на специальном языке хранимых процедур и триггеров, в котором имеются операторы присваивания, ветвлений и циклов, а также можно использовать операторы SQL, такие как INSERT, DELETE, UPDATE и SELECT.
**Создание хранимой процедуры**
```sh
-- Создание хранимой процедуры для расчета статистики
local procedure_code = [[ function calculate_stats(collection_name)
local documents = falcot_db.query(collection_name, "{}")
- [x] Реализовать поддержку триггеров (обратных вызовов)
- [x] Реализовать поддержку многопоточности
- [x] Реализовать неблокирующие чтение/запись
- [x] Реализовать мульти-мастер асинхронную репликацию через файл конфигурации
- [x] Реализовать логирование
- [x] Реализовать поддержку синхронной мастер-мастер репликации
- [x] Реализовать поддержку протоколов HTTPS и HTTP2
- [x] Реализовать поддержку первичных индексов
- [x] Реализовать поддержку протокола MessagePack
- [x] Реализовать поддержку транзакций
- [x] Реализовать поддержку первичных и вторичных индексов
- [x] Добавить механизм сторонних модулей на языке lua, расширяющих базовый функционал сервера
- [x] Реализовать проверку запуска сервера при запуске клиента (если сервер НЕ запущен клиент не запускается)
- [x] Реализовать поддержку HTTP-restfull API
- [x] Исправить ошибки записи журнала логов (в журнал лога кроме текущего времени добавить текущий год)
- [x] Реализовать утилиту тестирования сервера на количество запросов на чтение/запись
- [x] Переписать асинхронную мастер-мастер репликацию на синхронную мастер-мастер репликацию
- [ ] Реализовать журнал WAL
- [ ] Реализовать графический веб-интерфейс для упраления кластером
- [x] Реализовать автоматический шардинг с консистентным хэшированием
- [ ] Реализовать поддержку алгоритма Raft
- [ ] Реализовать поддержку SQL
- [ ] Реализовать поддержку ACID-транзакций
- [ ] Интегрировать интеллектуального помощник FutBot на официальный сайт
- [ ] Реализовать полноценного интеллектуального помощника FutBot, задачами которого будут быстрый поиск ответов на вопросы, возникающие при эксплуатации субд Futrix.
См. [Открытые проблемы](https://source.futriix.ru/gvsafronov/futriixw/issues) полный список предлагаемых функций (и известных проблем).