Update README.md
This commit is contained in:
parent
7881ccb00f
commit
a777132814
366
README.md
366
README.md
@ -19,7 +19,7 @@
|
|||||||
<h3 align="center">futriix</h3>
|
<h3 align="center">futriix</h3>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<b>Futriix-встроенная распределённая субд в сервер-приложений (falcot) с поддержкой модулей на языке lua, написанная на языке Rust</b> <br>
|
<b>Futriix-встроенная в сервер-приложений распределённая субд с поддержкой модулей на языке lua, написанная на языке Rust</b> <br>
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
<!-- <a href="">Сообщить об ошибке</a>
|
<!-- <a href="">Сообщить об ошибке</a>
|
||||||
@ -66,7 +66,7 @@
|
|||||||
<!-- ABOUT THE PROJECT -->
|
<!-- ABOUT THE PROJECT -->
|
||||||
## О проекте
|
## О проекте
|
||||||
|
|
||||||
Falcot - это http сервер-приложений со встроенной мультимодельной NOSQL СУБД **futriix** с минимальным количеством блокировок, которая написана на языке программирования Rust. <br>
|
Futriix - это http сервер-приложений со встроенной одноимённой мультимодельной NOSQL СУБД с минимальным количеством блокировок, которая написана на языке программирования Rust. <br>
|
||||||
Поддерживает следующие модели хранения данных:
|
Поддерживает следующие модели хранения данных:
|
||||||
|
|
||||||
- модель временных рядов (time series)
|
- модель временных рядов (time series)
|
||||||
@ -97,7 +97,6 @@ Falcot - это http сервер-приложений со встроенной
|
|||||||
* **Кластер** - это группа компьютеров, объединённых высокоскоростными каналами связи для решения сложных вычислительных задач и представляющая с точки зрения пользователя группу серверов, объединенных для работы как единая система.
|
* **Кластер** - это группа компьютеров, объединённых высокоскоростными каналами связи для решения сложных вычислительных задач и представляющая с точки зрения пользователя группу серверов, объединенных для работы как единая система.
|
||||||
* **FutBot** - это интеллектуальный помощник в мессенджере Телеграмм, помогающий осущесвлять быстрый поиск по документации проекта.
|
* **FutBot** - это интеллектуальный помощник в мессенджере Телеграмм, помогающий осущесвлять быстрый поиск по документации проекта.
|
||||||
* **Сервер-приложений (англ. application-server)** - это программное обеспечение, которое обеспечивает выполнение бизнес-логики и обработку запросов от клиентов (например, веб-браузеров или мобильных приложений). Он служит платформой для развертывания и управления приложениями, имея встроенные интепретаторы и/или компиляторы популярных языков программирования (php,go,python), что обеспечивает взаимодействие между пользователями, базами данных и другими системами.
|
* **Сервер-приложений (англ. application-server)** - это программное обеспечение, которое обеспечивает выполнение бизнес-логики и обработку запросов от клиентов (например, веб-браузеров или мобильных приложений). Он служит платформой для развертывания и управления приложениями, имея встроенные интепретаторы и/или компиляторы популярных языков программирования (php,go,python), что обеспечивает взаимодействие между пользователями, базами данных и другими системами.
|
||||||
* **futriix** - это сервер проекта futriix.
|
|
||||||
* **Интерактивная оболочка (неофициальное название "clif")** - это клиент для работы со встроенной СУБД.
|
* **Интерактивная оболочка (неофициальное название "clif")** - это клиент для работы со встроенной СУБД.
|
||||||
* **workflow (англ. workflow — «поток работы»)** — это принцип организации рабочих процессов, в соответствии с которым повторяющиеся задачи представлены как последовательность стандартных шагов.
|
* **workflow (англ. workflow — «поток работы»)** — это принцип организации рабочих процессов, в соответствии с которым повторяющиеся задачи представлены как последовательность стандартных шагов.
|
||||||
* **wait-free" (дословно с англ. wait-free — «свободный от ожидания»)**-класс неблокирующих алгоритмов, в которых каждая операция должна завершаться за конечное число шагов независимо от активности других потоков.
|
* **wait-free" (дословно с англ. wait-free — «свободный от ожидания»)**-класс неблокирующих алгоритмов, в которых каждая операция должна завершаться за конечное число шагов независимо от активности других потоков.
|
||||||
@ -108,9 +107,9 @@ Falcot - это http сервер-приложений со встроенной
|
|||||||
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
##
|
##
|
||||||
**Почему именно HTAP? Анализ характеристик falcot:**
|
**Почему именно HTAP? Анализ характеристик Futriix:**
|
||||||
|
|
||||||
OLTP (Online Transactional Processing- Онлайн оработка транзакций) черты, присущие falcot:
|
OLTP (Online Transactional Processing- Онлайн оработка транзакций) черты, присущие Futriix:
|
||||||
|
|
||||||
1. **Поддержка транзакций - есть BEGIN/COMMIT/ROLLBACK**
|
1. **Поддержка транзакций - есть BEGIN/COMMIT/ROLLBACK**
|
||||||
2. **CRUD операции - полноценные Create, Read, Update, Delete**
|
2. **CRUD операции - полноценные Create, Read, Update, Delete**
|
||||||
@ -120,7 +119,7 @@ OLTP (Online Transactional Processing- Онлайн оработка транз
|
|||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
OLAP (Online Analytical Processing- Оперативная аналитическая обработка) черты, присущие falcot:
|
OLAP (Online Analytical Processing- Оперативная аналитическая обработка) черты, присущие Futriix:
|
||||||
|
|
||||||
|
|
||||||
1. **Документо-ориентированная модель - удобна для аналитических запросов**
|
1. **Документо-ориентированная модель - удобна для аналитических запросов**
|
||||||
@ -130,7 +129,7 @@ OLAP (Online Analytical Processing- Оперативная аналитичес
|
|||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
HTAP (Hybrid Transactional Analytical Processing- Гибридная обработка транзакций) черты, присущие falcot:
|
HTAP (Hybrid Transactional Analytical Processing- Гибридная обработка транзакций) черты, присущие Futriix:
|
||||||
|
|
||||||
|
|
||||||
1. **Единая платформа - обрабатывает и транзакции, и аналитику**
|
1. **Единая платформа - обрабатывает и транзакции, и аналитику**
|
||||||
@ -141,7 +140,7 @@ HTAP (Hybrid Transactional Analytical Processing- Гибридная обраб
|
|||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
Если посмотреть на архитектурные особенности falcot, то можно заметить следующее:
|
Если посмотреть на архитектурные особенности Futriix, то можно заметить следующее:
|
||||||
|
|
||||||
1. **Wait-free доступ подходит для concurrent transactional workload**
|
1. **Wait-free доступ подходит для concurrent transactional workload**
|
||||||
2. **Document-oriented модель удобна для analytical queries**
|
2. **Document-oriented модель удобна для analytical queries**
|
||||||
@ -151,7 +150,7 @@ HTAP (Hybrid Transactional Analytical Processing- Гибридная обраб
|
|||||||
<br>
|
<br>
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> **falcot НЕ поддерживает:**
|
> **Futriix НЕ поддерживает:**
|
||||||
> * Полноценные распределённые транзакции
|
> * Полноценные распределённые транзакции
|
||||||
> * Сложные ограничения (constraints)
|
> * Сложные ограничения (constraints)
|
||||||
> * Хранилища типа "Семейство столбцов" (Columnar Storage) для аналитики
|
> * Хранилища типа "Семейство столбцов" (Columnar Storage) для аналитики
|
||||||
@ -163,7 +162,7 @@ HTAP (Hybrid Transactional Analytical Processing- Гибридная обраб
|
|||||||
<br>
|
<br>
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
>**Falcot** - это lightweight HTAP система, занимающая нишу прагматичного HTAP - достаточно мощная для большинства реальных задач, но без > избыточной сложности enterprise-решений, **с акцентом на:**
|
>**Futriix** - это lightweight HTAP система, занимающая нишу прагматичного HTAP - достаточно мощная для большинства реальных задач, но без > избыточной сложности enterprise-решений, **с акцентом на:**
|
||||||
> * Простоту использования через Lua-интерфейс
|
> * Простоту использования через Lua-интерфейс
|
||||||
> * Гибридную модель для mixed workloads
|
> * Гибридную модель для mixed workloads
|
||||||
> * Wait-free performance для concurrent access
|
> * Wait-free performance для concurrent access
|
||||||
@ -177,9 +176,9 @@ HTAP (Hybrid Transactional Analytical Processing- Гибридная обраб
|
|||||||
Проект распространяется под 3-пунктной лицензией BSD. Подробнсти в файле `LICENSE.txt`.
|
Проект распространяется под 3-пунктной лицензией BSD. Подробнсти в файле `LICENSE.txt`.
|
||||||
Эта лицензия является одной из самых демократичных лицензий свободного программного обеспечения. Она позволяет использовать, изменять и распространять код в коммерческих целях без каких-либо ограничений, за исключением сохранения уведомления об авторских правах.
|
Эта лицензия является одной из самых демократичных лицензий свободного программного обеспечения. Она позволяет использовать, изменять и распространять код в коммерческих целях без каких-либо ограничений, за исключением сохранения уведомления об авторских правах.
|
||||||
|
|
||||||
В том числе, Вы можете использовать falcot и futriix в своих коммерческих продуктах, приложениях или сервисах, не беспокоясь о каких-либо юридических ограничениях, связанных с лицензией.
|
В том числе, Вы можете использовать Futriix и futriix в своих коммерческих продуктах, приложениях или сервисах, не беспокоясь о каких-либо юридических ограничениях, связанных с лицензией.
|
||||||
|
|
||||||
Все дополнительное программное обеспечение (включая модули на языке lua, утилиту тестирования) предоставляются "как есть", без гарантий и обязательств со стороны разработчиков. Разработчики не несут ответственности за прямой или косвенный ущерб, вызванный использованием открытого кода falcot и futriix или технических решений, использующих этот код.
|
Все дополнительное программное обеспечение (включая модули на языке lua, утилиту тестирования) предоставляются "как есть", без гарантий и обязательств со стороны разработчиков. Разработчики не несут ответственности за прямой или косвенный ущерб, вызванный использованием открытого кода Futriix и futriix или технических решений, использующих этот код.
|
||||||
|
|
||||||
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
@ -219,11 +218,11 @@ HTAP (Hybrid Transactional Analytical Processing- Гибридная обраб
|
|||||||
|
|
||||||
1. Копируем репозиторий
|
1. Копируем репозиторий
|
||||||
```sh
|
```sh
|
||||||
$ git clone https://source.futriix.ru/gvsafronov/falcot
|
$ git clone https://source.futriix.ru/gvsafronov/Futriix
|
||||||
```
|
```
|
||||||
2. Переходим в каталог с исходном кодом src
|
2. Переходим в каталог с исходном кодом src
|
||||||
```sh
|
```sh
|
||||||
$ cd falcot/
|
$ cd Futriix/
|
||||||
```
|
```
|
||||||
3. Компилируем Futriix с помощью пакетного менеджера `Cargo`
|
3. Компилируем Futriix с помощью пакетного менеджера `Cargo`
|
||||||
```sh
|
```sh
|
||||||
@ -232,23 +231,20 @@ HTAP (Hybrid Transactional Analytical Processing- Гибридная обраб
|
|||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> **Futriix может быть скомпилирован для следующих операционных систем: `Linux`, `OSX`, `Open Indiana`, `FreeBSD`, но сборка для этих операционных систем не проводилась!!!**
|
> **Futriix может быть скомпилирован для следующих операционных систем: `Linux`, `OSX`, `Open Indiana`, `FreeBSD`, но сборка для этих операционных систем не проводилась!!!**
|
||||||
<br>
|
<br>
|
||||||
4. Запускаем сервера futriix'а с помощью команды `./falcot`
|
4. Запускаем сервера futriix'а с помощью команды `./Futriix`
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ ./falcot
|
$ ./Futriix
|
||||||
````
|
````
|
||||||
Если проект был успешно скомпилирован, то при его запуске в терминале вы увидите, следующие сообщение:
|
Если проект был успешно скомпилирован, то при его запуске в терминале вы увидите, похожее сообщение:
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
Loading configuration from: config.toml
|
Loading configuration from: config.toml
|
||||||
Database initialized with system collections
|
Database initialized with system collections
|
||||||
|
Futriix Database Server
|
||||||
Falcot Database Server
|
|
||||||
Version: 1.0.0
|
|
||||||
Features: Wait-Free Architecture, Master-Master Replication, Lua Scripting, HTTP/HTTPS Support
|
Features: Wait-Free Architecture, Master-Master Replication, Lua Scripting, HTTP/HTTPS Support
|
||||||
HTTP server started on 127.0.0.1:8082
|
HTTP server started on 127.0.0.1:8082
|
||||||
Starting Lua interpreter...
|
|
||||||
Lua interpreter ready. Type 'inbox.start' to enter database mode.
|
Lua interpreter ready. Type 'inbox.start' to enter database mode.
|
||||||
Type 'exit' to quit.
|
Type 'exit' to quit.
|
||||||
lua>
|
lua>
|
||||||
@ -340,9 +336,9 @@ $ cargo test --test integration_tests --release -- --nocapture
|
|||||||
## Тестирование
|
## Тестирование
|
||||||
|
|
||||||
В состав проекта, входит утилита `integration_tests.rs` **integration_tests.rs** - это интеграционный тестовый набор, который при запуске создает и выполняет сразу несколько различных типов тестов. С её помощью можно запустить как сразу все тесты, так и определённый тест.
|
В состав проекта, входит утилита `integration_tests.rs` **integration_tests.rs** - это интеграционный тестовый набор, который при запуске создает и выполняет сразу несколько различных типов тестов. С её помощью можно запустить как сразу все тесты, так и определённый тест.
|
||||||
Вышеописанная утилита - является мощным инструментом для комплексного тестирования всей системы Falcot, позволяющий быстро выявлять проблемы на разных уровнях приложения и обеспечивать высокое качество кода.
|
Вышеописанная утилита - является мощным инструментом для комплексного тестирования всей системы Futriix, позволяющий быстро выявлять проблемы на разных уровнях приложения и обеспечивать высокое качество кода.
|
||||||
|
|
||||||
**Falcot поддерживает пять типов тестов:**
|
**Futriix поддерживает пять типов тестов:**
|
||||||
|
|
||||||
* **Регрессионный тест - проверяет базовую функциональность**
|
* **Регрессионный тест - проверяет базовую функциональность**
|
||||||
* **Unit-тест - тестирует конкретный модуль (индексы)**
|
* **Unit-тест - тестирует конкретный модуль (индексы)**
|
||||||
@ -428,53 +424,47 @@ $ cargo test --test integration_tests test -- --nocapture
|
|||||||
<!-- USAGE EXAMPLES -->
|
<!-- USAGE EXAMPLES -->
|
||||||
## Примеры команд субд
|
## Примеры команд субд
|
||||||
```sh
|
```sh
|
||||||
./falcot config.toml
|
./Futriix config.toml
|
||||||
|
|
||||||
В интерактивном режиме:
|
В интерактивном режиме:
|
||||||
|
|
||||||
Loading configuration from: config.toml
|
Loading configuration from: config.toml
|
||||||
Database initialized with system collections
|
Database initialized with system collections
|
||||||
|
|
||||||
Falcot Database Server
|
Futriix Database Server
|
||||||
Version: 1.0.0
|
|
||||||
Features: Wait-Free Architecture, Master-Master Replication, Lua Scripting, HTTP/HTTPS Support
|
Features: Wait-Free Architecture, Master-Master Replication, Lua Scripting, HTTP/HTTPS Support
|
||||||
HTTP server started on 127.0.0.1:8082
|
HTTP server started on 127.0.0.1:8082
|
||||||
Starting Lua interpreter...
|
Type 'inbox.start' to enter database mode.
|
||||||
Lua interpreter ready. Type 'inbox.start' to enter database mode.
|
|
||||||
Type 'exit' to quit.
|
|
||||||
lua> falcot_log("Добро пожаловать в Falcot!")
|
|
||||||
LUA: Добро пожаловать в Falcot!
|
|
||||||
|
|
||||||
lua> inbox.start
|
lua> inbox.start
|
||||||
Entering database mode. Type CRUD commands or 'inbox.stop' to exit.
|
Entering database mode. Type CRUD commands or 'inbox.stop' to exit.
|
||||||
|
|
||||||
falcot:~> create users '{"name": "Иван", "age": 25, "city": "Москва"}'
|
futriix:~> create users '{"name": "Иван", "age": 25, "city": "Москва"}'
|
||||||
Document created with ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890
|
Document created with ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890
|
||||||
|
|
||||||
falcot:~> create users '{"name": "Мария", "age": 30, "city": "Санкт-Петербург"}'
|
futriix:~> create users '{"name": "Мария", "age": 30, "city": "Санкт-Петербург"}'
|
||||||
Document created with ID: b2c3d4e5-f6g7-8901-bcde-f23456789012
|
Document created with ID: b2c3d4e5-f6g7-8901-bcde-f23456789012
|
||||||
|
|
||||||
falcot:~> list users
|
futriix:~> 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":"Санкт-Петербург"}]
|
Documents in collection: [{"_id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","name":"Иван","age":25,"city":"Москва"},{"_id":"b2c3d4e5-f6g7-8901-bcde-f23456789012","name":"Мария","age":30,"city":"Санкт-Петербург"}]
|
||||||
|
|
||||||
falcot:~> begin trans1
|
futriix:~> begin trans1
|
||||||
Transaction started successfully
|
Transaction started successfully
|
||||||
|
|
||||||
falcot:~> create products '{"name": "Ноутбук", "price": 50000, "category": "электроника"}'
|
futriix:~> create products '{"name": "Ноутбук", "price": 50000, "category": "электроника"}'
|
||||||
Document created with ID: c3d4e5f6-g7h8-9012-cdef-345678901234
|
Document created with ID: c3d4e5f6-g7h8-9012-cdef-345678901234
|
||||||
|
|
||||||
falcot:~> create products '{"name": "Телефон", "price": 25000, "category": "электроника"}'
|
futriix:~> create products '{"name": "Телефон", "price": 25000, "category": "электроника"}'
|
||||||
Document created with ID: d4e5f6g7-h8i9-0123-defg-456789012345
|
Document created with ID: d4e5f6g7-h8i9-0123-defg-456789012345
|
||||||
|
|
||||||
falcot:~> commit trans1
|
futriix:~> commit trans1
|
||||||
Transaction committed successfully
|
Transaction committed successfully
|
||||||
|
|
||||||
falcot:~> inbox.stop
|
futriix:~> inbox.stop
|
||||||
Exiting database mode. Back to Lua interpreter.
|
Exiting database mode. Back to Lua interpreter.
|
||||||
|
|
||||||
lua> procedure create count_users '
|
lua> procedure create count_users '
|
||||||
function count_users()
|
function count_users()
|
||||||
local result = falcot_db.query("users", "{}")
|
local result = Futriix_db.query("users", "{}")
|
||||||
local count = 0
|
local count = 0
|
||||||
for _ in string.gmatch(result, "\\\"name\\\":") do
|
for _ in string.gmatch(result, "\\\"name\\\":") do
|
||||||
count = count + 1
|
count = count + 1
|
||||||
@ -489,7 +479,7 @@ lua> procedure call count_users
|
|||||||
Procedure result: Всего пользователей: 2
|
Procedure result: Всего пользователей: 2
|
||||||
|
|
||||||
lua> exit
|
lua> exit
|
||||||
Shutting down Falcot server...
|
Shutting down Futriix server...
|
||||||
```
|
```
|
||||||
|
|
||||||
**Параллельно запускаем в другом терминале:**
|
**Параллельно запускаем в другом терминале:**
|
||||||
@ -497,7 +487,7 @@ Shutting down Falcot server...
|
|||||||
```sh
|
```sh
|
||||||
#### Проверка HTTP API
|
#### Проверка HTTP API
|
||||||
curl http://127.0.0.1:8082/api/
|
curl http://127.0.0.1:8082/api/
|
||||||
#### {"status": "ok", "message": "Falcot Server is running"}
|
#### {"status": "ok", "message": "Futriix Server is running"}
|
||||||
|
|
||||||
#### Получение списка пользователей
|
#### Получение списка пользователей
|
||||||
curl http://127.0.0.1:8082/api/query?collection=users
|
curl http://127.0.0.1:8082/api/query?collection=users
|
||||||
@ -508,9 +498,9 @@ curl http://127.0.0.1:8082/api/query?collection=users
|
|||||||
|
|
||||||
## Обработка статических страниц
|
## Обработка статических страниц
|
||||||
|
|
||||||
Запуск статических веб-страниц, из сервера приложений falcot
|
Запуск статических веб-страниц, из сервера приложений Futriix
|
||||||
|
|
||||||
Falcot имеет встроенную поддержку статических файлов:
|
Futriix имеет встроенную поддержку статических файлов:
|
||||||
Настройка статических файлов:
|
Настройка статических файлов:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@ -520,7 +510,7 @@ Falcot имеет встроенную поддержку статических
|
|||||||
```
|
```
|
||||||
Разместите файлы в каталоге static:
|
Разместите файлы в каталоге static:
|
||||||
```sh
|
```sh
|
||||||
falcot/
|
Futriix/
|
||||||
├── static/
|
├── static/
|
||||||
│ ├── index.html
|
│ ├── index.html
|
||||||
│ ├── style.css
|
│ ├── style.css
|
||||||
@ -547,7 +537,7 @@ http://127.0.0.1:8082/images/logo.png
|
|||||||
http://127.0.0.1:8082/api-docs.html
|
http://127.0.0.1:8082/api-docs.html
|
||||||
```
|
```
|
||||||
|
|
||||||
**Falcot поддерживает следующие типы файлов:**
|
**Futriix поддерживает следующие типы файлов:**
|
||||||
|
|
||||||
* HTML (.html)
|
* HTML (.html)
|
||||||
* CSS (.css)
|
* CSS (.css)
|
||||||
@ -567,7 +557,7 @@ http://127.0.0.1:8082/api-docs.html
|
|||||||
|
|
||||||
## Репликация
|
## Репликация
|
||||||
|
|
||||||
Сервер-приложенй falcot поддерживает синхронную мастер-мастер репликацию.
|
Сервер-приложенй Futriix поддерживает синхронную мастер-мастер репликацию.
|
||||||
За управление репликацией отвечает секция `[replication]` в конфигурационном файле `config.toml`
|
За управление репликацией отвечает секция `[replication]` в конфигурационном файле `config.toml`
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@ -604,22 +594,22 @@ $ cargo run -- config3.toml
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
-- replication_test.lua
|
-- replication_test.lua
|
||||||
falcot_log("Testing replication...")
|
Futriix_log("Testing replication...")
|
||||||
|
|
||||||
-- Добавляем данные на основном сервере
|
-- Добавляем данные на основном сервере
|
||||||
local doc1 = falcot_db.create("test_data", '{"type": "main", "value": "from_server_1"}')
|
local doc1 = Futriix_db.create("test_data", '{"type": "main", "value": "from_server_1"}')
|
||||||
local doc2 = falcot_db.create("test_data", '{"type": "main", "value": "from_server_1_again"}')
|
local doc2 = Futriix_db.create("test_data", '{"type": "main", "value": "from_server_1_again"}')
|
||||||
|
|
||||||
falcot_log("Documents created on main server: " .. doc1 .. ", " .. doc2)
|
Futriix_log("Documents created on main server: " .. doc1 .. ", " .. doc2)
|
||||||
|
|
||||||
-- Ждем синхронизации
|
-- Ждем синхронизации
|
||||||
falcot_log("Waiting for replication...")
|
Futriix_log("Waiting for replication...")
|
||||||
os.execute("sleep 3") -- Ждем дольше интервала синхронизации
|
os.execute("sleep 3") -- Ждем дольше интервала синхронизации
|
||||||
|
|
||||||
-- Проверяем на репликах (это нужно делать с разных клиентов)
|
-- Проверяем на репликах (это нужно делать с разных клиентов)
|
||||||
falcot_log("Checking replicated data...")
|
Futriix_log("Checking replicated data...")
|
||||||
local all_data = falcot_db.query("test_data", "{}")
|
local all_data = Futriix_db.query("test_data", "{}")
|
||||||
falcot_log("All data: " .. all_data)
|
Futriix_log("All data: " .. all_data)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Мониторинг репликации**
|
**Мониторинг репликации**
|
||||||
@ -629,13 +619,13 @@ falcot_log("All data: " .. all_data)
|
|||||||
lua> inbox.start
|
lua> inbox.start
|
||||||
|
|
||||||
# Проверяем статус репликации
|
# Проверяем статус репликации
|
||||||
falcot:~> print(falcot.engine.replication.status())
|
futriix:~> print(Futriix.engine.replication.status())
|
||||||
|
|
||||||
# Смотрим список узлов
|
# Смотрим список узлов
|
||||||
falcot:~> print("Nodes: " .. table.concat(falcot.engine.replication.get_nodes(), ", "))
|
futriix:~> print("Nodes: " .. table.concat(Futriix.engine.replication.get_nodes(), ", "))
|
||||||
|
|
||||||
# Запускаем принудительную синхронизацию
|
# Запускаем принудительную синхронизацию
|
||||||
falcot:~> falcot.engine.replication.sync()
|
futriix:~> Futriix.engine.replication.sync()
|
||||||
```
|
```
|
||||||
|
|
||||||
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
@ -718,70 +708,70 @@ curl http://127.0.0.1:8082/api/stats
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
-- error_handling.lua
|
-- error_handling.lua
|
||||||
falcot_log("Testing replication error handling")
|
Futriix_log("Testing replication error handling")
|
||||||
|
|
||||||
-- Пытаемся добавить данные при недоступности реплик
|
-- Пытаемся добавить данные при недоступности реплик
|
||||||
local success, result = pcall(function()
|
local success, result = pcall(function()
|
||||||
return falcot_db.create("test_collection", '{"data": "test"}')
|
return Futriix_db.create("test_collection", '{"data": "test"}')
|
||||||
end)
|
end)
|
||||||
|
|
||||||
if success then
|
if success then
|
||||||
falcot_log("Data created successfully: " .. result)
|
Futriix_log("Data created successfully: " .. result)
|
||||||
|
|
||||||
-- Проверяем статус репликации
|
-- Проверяем статус репликации
|
||||||
local rep_status = falcot.engine.replication.status()
|
local rep_status = Futriix.engine.replication.status()
|
||||||
if rep_status ~= "active" then
|
if rep_status ~= "active" then
|
||||||
falcot_log("Warning: Replication is not active. Status: " .. rep_status)
|
Futriix_log("Warning: Replication is not active. Status: " .. rep_status)
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
falcot_error("Failed to create data: " .. result)
|
Futriix_error("Failed to create data: " .. result)
|
||||||
|
|
||||||
-- Пытаемся работать в offline режиме
|
-- Пытаемся работать в offline режиме
|
||||||
falcot_log("Trying offline operation...")
|
Futriix_log("Trying offline operation...")
|
||||||
local offline_data = falcot_db.query("test_collection", "{}")
|
local offline_data = Futriix_db.query("test_collection", "{}")
|
||||||
falcot_log("Offline data available: " .. #offline_data)
|
Futriix_log("Offline data available: " .. #offline_data)
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
## Резервное копирование
|
## Резервное копирование
|
||||||
|
|
||||||
Для встроенной в сервер-приложений falcot, субд **futriix** предусмотрен механизм восстановления из резервных копий (бекапов)
|
Для встроенной в сервер-приложений Futriix, субд **futriix** предусмотрен механизм восстановления из резервных копий (бекапов)
|
||||||
Бекапы можно создавать c помощью языка lua.
|
Бекапы можно создавать c помощью языка lua.
|
||||||
|
|
||||||
**Создание бекапа через lua**
|
**Создание бекапа через lua**
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
-- Создаем бэкап
|
-- Создаем бэкап
|
||||||
local result = falcot.engine.backup.start()
|
local result = Futriix.engine.backup.start()
|
||||||
print(result) -- "Backup created successfully: /falcot/backups/backup_20231201_143022.json"
|
print(result) -- "Backup created successfully: /Futriix/backups/backup_20231201_143022.json"
|
||||||
|
|
||||||
-- Или через прямое обращение к функции
|
-- Или через прямое обращение к функции
|
||||||
local result = falcot_db.backup_start()
|
local result = Futriix_db.backup_start()
|
||||||
print(result)
|
print(result)
|
||||||
|
|
||||||
-- Создаем несколько тестовых документов перед бэкапом
|
-- Создаем несколько тестовых документов перед бэкапом
|
||||||
falcot_db.create('products', '{"name": "Laptop", "price": 999.99, "category": "electronics"}')
|
Futriix_db.create('products', '{"name": "Laptop", "price": 999.99, "category": "electronics"}')
|
||||||
falcot_db.create('products', '{"name": "Phone", "price": 499.99, "category": "electronics"}')
|
Futriix_db.create('products', '{"name": "Phone", "price": 499.99, "category": "electronics"}')
|
||||||
falcot_db.create('users', '{"name": "Alice", "email": "alice@example.com", "role": "admin"}')
|
Futriix_db.create('users', '{"name": "Alice", "email": "alice@example.com", "role": "admin"}')
|
||||||
|
|
||||||
-- Создаем бэкап с данными
|
-- Создаем бэкап с данными
|
||||||
local backup_result = falcot.engine.backup.start()
|
local backup_result = Futriix.engine.backup.start()
|
||||||
```
|
```
|
||||||
|
|
||||||
**Восстановление из бекапа**
|
**Восстановление из бекапа**
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
-- Восстанавливаем из конкретного бэкапа
|
-- Восстанавливаем из конкретного бэкапа
|
||||||
local restore_result = falcot.engine.backup.restore('/falcot/backups/backup_20231201_143022.json')
|
local restore_result = Futriix.engine.backup.restore('/Futriix/backups/backup_20231201_143022.json')
|
||||||
print(restore_result) -- "Backup restored successfully"
|
print(restore_result) -- "Backup restored successfully"
|
||||||
|
|
||||||
-- Или через прямое обращение
|
-- Или через прямое обращение
|
||||||
local restore_result = falcot_db.backup_restore('/falcot/backups/backup_20231201_143022.json')
|
local restore_result = Futriix_db.backup_restore('/Futriix/backups/backup_20231201_143022.json')
|
||||||
|
|
||||||
-- Проверяем, что данные восстановились
|
-- Проверяем, что данные восстановились
|
||||||
local users = falcot_db.read('users', 'user123')
|
local users = Futriix_db.read('users', 'user123')
|
||||||
local products = falcot_db.query('products', '{}')
|
local products = Futriix_db.query('products', '{}')
|
||||||
print('Users:', users)
|
print('Users:', users)
|
||||||
print('Products count:', #products)
|
print('Products count:', #products)
|
||||||
|
|
||||||
@ -791,14 +781,14 @@ print('Products count:', #products)
|
|||||||
```sh
|
```sh
|
||||||
#### Создаем бэкап
|
#### Создаем бэкап
|
||||||
backup start
|
backup start
|
||||||
# Output: Backup created successfully: /falcot/backups/backup_20231201_143022.json
|
# Output: Backup created successfully: /Futriix/backups/backup_20231201_143022.json
|
||||||
|
|
||||||
#### Восстанавливаем из бэкапа
|
#### Восстанавливаем из бэкапа
|
||||||
backup restore /falcot/backups/backup_20231201_143022.json
|
backup restore /Futriix/backups/backup_20231201_143022.json
|
||||||
#### Output: Backup restored successfully
|
#### Output: Backup restored successfully
|
||||||
|
|
||||||
#### Смотрим список доступных бэкапов
|
#### Смотрим список доступных бэкапов
|
||||||
!ls /falcot/backups/
|
!ls /Futriix/backups/
|
||||||
#### Output: backup_20231201_143022.json backup_20231202_020001.json
|
#### Output: backup_20231201_143022.json backup_20231202_020001.json
|
||||||
|
|
||||||
#### Создаем тестовые данные
|
#### Создаем тестовые данные
|
||||||
@ -809,7 +799,7 @@ create users '{"name": "Test User", "email": "test@example.com"}'
|
|||||||
backup start
|
backup start
|
||||||
delete products test_product_id
|
delete products test_product_id
|
||||||
delete users test_user_id
|
delete users test_user_id
|
||||||
backup restore /falcot/backups/backup_20231201_143022.json
|
backup restore /Futriix/backups/backup_20231201_143022.json
|
||||||
read products test_product_id
|
read products test_product_id
|
||||||
#### Данные восстановяться
|
#### Данные восстановяться
|
||||||
```
|
```
|
||||||
@ -818,21 +808,21 @@ read products test_product_id
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
-- Триггер для создания бэкапа при критических изменениях
|
-- Триггер для создания бэкапа при критических изменениях
|
||||||
falcot_db.add_trigger('auto_backup_on_change', 'after_update', 'config', [[
|
Futriix_db.add_trigger('auto_backup_on_change', 'after_update', 'config', [[
|
||||||
local config = json.decode(document)
|
local config = json.decode(document)
|
||||||
if config.critical_setting then
|
if config.critical_setting then
|
||||||
-- Создаем бэкап при изменении критических настроек
|
-- Создаем бэкап при изменении критических настроек
|
||||||
local backup_result = falcot_db.backup_start()
|
local backup_result = Futriix_db.backup_start()
|
||||||
falcot_log('Auto-backup created due to config change: ' .. backup_result)
|
Futriix_log('Auto-backup created due to config change: ' .. backup_result)
|
||||||
end
|
end
|
||||||
]])
|
]])
|
||||||
|
|
||||||
-- Триггер для бэкапа перед массовыми операциями
|
-- Триггер для бэкапа перед массовыми операциями
|
||||||
falcot_db.add_trigger('backup_before_bulk_operation', 'before_delete', 'users', [[
|
Futriix_db.add_trigger('backup_before_bulk_operation', 'before_delete', 'users', [[
|
||||||
-- Проверяем, это одиночное удаление или массовая операция
|
-- Проверяем, это одиночное удаление или массовая операция
|
||||||
if bulk_operation then
|
if bulk_operation then
|
||||||
local backup_result = falcot_db.backup_start()
|
local backup_result = Futriix_db.backup_start()
|
||||||
falcot_log('Backup created before bulk operation: ' .. backup_result)
|
Futriix_log('Backup created before bulk operation: ' .. backup_result)
|
||||||
end
|
end
|
||||||
]])
|
]])
|
||||||
|
|
||||||
@ -891,8 +881,8 @@ curl -X DELETE http://127.0.0.1:8082/api/delete \
|
|||||||
|
|
||||||
## Аутентификация
|
## Аутентификация
|
||||||
|
|
||||||
Для повышения безопасности в сервере-приложений falcot используется `Аутентификация`.
|
Для повышения безопасности в сервере-приложений Futriix используется `Аутентификация`.
|
||||||
За параметры авторизации отвечает секция `[security]` в конфигурационном файле `./falcot/config.toml`
|
За параметры авторизации отвечает секция `[security]` в конфигурационном файле `./Futriix/config.toml`
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
[security]
|
[security]
|
||||||
@ -947,7 +937,7 @@ password_hashing_rounds = 12
|
|||||||
|
|
||||||
## HTTPS
|
## HTTPS
|
||||||
|
|
||||||
Сервер-приложенй falcot поддерживает протоколы https и http2.
|
Сервер-приложенй Futriix поддерживает протоколы https и http2.
|
||||||
Утилита `generate_certs` - Генерация сертификатов
|
Утилита `generate_certs` - Генерация сертификатов
|
||||||
|
|
||||||
Назначение: Генерация самоподписанных SSL/TLS сертификатов для HTTPS.
|
Назначение: Генерация самоподписанных SSL/TLS сертификатов для HTTPS.
|
||||||
@ -1013,7 +1003,7 @@ curl http://localhost:8082/api/status
|
|||||||
## ACL
|
## ACL
|
||||||
|
|
||||||
**ACL** - это система управления доступом, которая позволяет разрешать или запрещать подключения к серверу на основе IP-адресов.
|
**ACL** - это система управления доступом, которая позволяет разрешать или запрещать подключения к серверу на основе IP-адресов.
|
||||||
Как работает ACL в Falcot:
|
Как работает ACL в Futriix:
|
||||||
|
|
||||||
Принцип работы:
|
Принцип работы:
|
||||||
|
|
||||||
@ -1097,7 +1087,7 @@ denied_ips = [
|
|||||||
|
|
||||||
## Индексы
|
## Индексы
|
||||||
|
|
||||||
Falcot поддерживает два стандартных типа индекса: первичные индексы и вторичные индексы
|
Futriix поддерживает два стандартных типа индекса: первичные индексы и вторичные индексы
|
||||||
|
|
||||||
**Различия между первичным и вторичным индексом**
|
**Различия между первичным и вторичным индексом**
|
||||||
|
|
||||||
@ -1114,7 +1104,7 @@ Falcot поддерживает два стандартных типа инде
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
-- Поиск по ID (использует первичный индекс)
|
-- Поиск по ID (использует первичный индекс)
|
||||||
local document = falcot_db.read("users", "550e8400-e29b-41d4-a716-446655440000")
|
local document = Futriix_db.read("users", "550e8400-e29b-41d4-a716-446655440000")
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Вторичный индекс (Secondary Index)**
|
2. **Вторичный индекс (Secondary Index)**
|
||||||
@ -1131,10 +1121,10 @@ local document = falcot_db.read("users", "550e8400-e29b-41d4-a716-446655440000")
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
-- Неуникальный индекс по полю 'email'
|
-- Неуникальный индекс по полю 'email'
|
||||||
falcot_db.create_index("users", "email_idx", "email", false)
|
Futriix_db.create_index("users", "email_idx", "email", false)
|
||||||
|
|
||||||
-- Уникальный индекс по полю 'username'
|
-- Уникальный индекс по полю 'username'
|
||||||
falcot_db.create_index("users", "username_idx", "username", true)
|
Futriix_db.create_index("users", "username_idx", "username", true)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@ -1148,49 +1138,49 @@ $ cargo run
|
|||||||
$ lua> inbox.start
|
$ lua> inbox.start
|
||||||
|
|
||||||
#### Создаем коллекцию пользователей
|
#### Создаем коллекцию пользователей
|
||||||
falcot:~> create users '{"name": "Alice", "age": 30, "email": "alice@example.com"}'
|
futriix:~> create users '{"name": "Alice", "age": 30, "email": "alice@example.com"}'
|
||||||
falcot:~> create users '{"name": "Bob", "age": 25, "email": "bob@example.com"}'
|
futriix:~> create users '{"name": "Bob", "age": 25, "email": "bob@example.com"}'
|
||||||
falcot:~> create users '{"name": "Charlie", "age": 35, "email": "charlie@example.com"}'
|
futriix:~> create users '{"name": "Charlie", "age": 35, "email": "charlie@example.com"}'
|
||||||
|
|
||||||
#### Создаем вторичный индекс по полю "name"
|
#### Создаем вторичный индекс по полю "name"
|
||||||
falcot:~> index create users name_index name
|
futriix:~> index create users name_index name
|
||||||
|
|
||||||
#### Создаем уникальный индекс по полю "email"
|
#### Создаем уникальный индекс по полю "email"
|
||||||
falcot:~> index create users email_index email unique
|
futriix:~> index create users email_index email unique
|
||||||
|
|
||||||
#### Ищем по индексу name
|
#### Ищем по индексу name
|
||||||
falcot:~> index query users name_index "Alice"
|
futriix:~> index query users name_index "Alice"
|
||||||
|
|
||||||
#### Ищем по индексу email
|
#### Ищем по индексу email
|
||||||
falcot:~> index query users email_index "bob@example.com"
|
futriix:~> index query users email_index "bob@example.com"
|
||||||
|
|
||||||
#### Пытаемся создать дубликат email (должна быть ошибка)
|
#### Пытаемся создать дубликат email (должна быть ошибка)
|
||||||
falcot:~> create users '{"name": "Another Bob", "age": 28, "email": "bob@example.com"}'
|
futriix:~> create users '{"name": "Another Bob", "age": 28, "email": "bob@example.com"}'
|
||||||
```
|
```
|
||||||
**Создание и использование индексов через Lua скрипты:**
|
**Создание и использование индексов через Lua скрипты:**
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
-- create_indexes.lua
|
-- create_indexes.lua
|
||||||
falcot_log("Creating indexes...")
|
Futriix_log("Creating indexes...")
|
||||||
|
|
||||||
-- Создаем индексы
|
-- Создаем индексы
|
||||||
falcot_db.create_index("users", "name_index", "name", false)
|
Futriix_db.create_index("users", "name_index", "name", false)
|
||||||
falcot_db.create_index("users", "email_index", "email", true)
|
Futriix_db.create_index("users", "email_index", "email", true)
|
||||||
|
|
||||||
-- Добавляем данные
|
-- Добавляем данные
|
||||||
falcot_db.create("users", '{"name": "Alice", "age": 30, "email": "alice@example.com"}')
|
Futriix_db.create("users", '{"name": "Alice", "age": 30, "email": "alice@example.com"}')
|
||||||
falcot_db.create("users", '{"name": "Bob", "age": 25, "email": "bob@example.com"}')
|
Futriix_db.create("users", '{"name": "Bob", "age": 25, "email": "bob@example.com"}')
|
||||||
|
|
||||||
-- Поиск по индексу
|
-- Поиск по индексу
|
||||||
local result = falcot_db.query_by_index("users", "name_index", "Alice")
|
local result = Futriix_db.query_by_index("users", "name_index", "Alice")
|
||||||
falcot_log("Search result: " .. result)
|
Futriix_log("Search result: " .. result)
|
||||||
|
|
||||||
-- Проверка уникальности (должна вызвать ошибку)
|
-- Проверка уникальности (должна вызвать ошибку)
|
||||||
local status, err = pcall(function()
|
local status, err = pcall(function()
|
||||||
falcot_db.create("users", '{"name": "Another", "age": 28, "email": "bob@example.com"}')
|
Futriix_db.create("users", '{"name": "Another", "age": 28, "email": "bob@example.com"}')
|
||||||
end)
|
end)
|
||||||
if not status then
|
if not status then
|
||||||
falcot_error("Unique constraint violation: " .. err)
|
Futriix_error("Unique constraint violation: " .. err)
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -1231,7 +1221,7 @@ end
|
|||||||
```sh
|
```sh
|
||||||
-- Попытка создать документ с существующим ID вызовет ошибку
|
-- Попытка создать документ с существующим ID вызовет ошибку
|
||||||
local status, err = pcall(function()
|
local status, err = pcall(function()
|
||||||
falcot_db.create("users", '{"id": "existing_id", "name": "Duplicate"}')
|
Futriix_db.create("users", '{"id": "existing_id", "name": "Duplicate"}')
|
||||||
end)
|
end)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -1240,15 +1230,15 @@ end)
|
|||||||
```sh
|
```sh
|
||||||
-- При unique=true попытка дублирования вызовет ошибку
|
-- При unique=true попытка дублирования вызовет ошибку
|
||||||
local status, err = pcall(function()
|
local status, err = pcall(function()
|
||||||
falcot_db.create("users", '{"email": "existing@example.com", "name": "Duplicate"}')
|
Futriix_db.create("users", '{"email": "existing@example.com", "name": "Duplicate"}')
|
||||||
falcot_db.create("users", '{"email": "existing@example.com", "name": "Duplicate2"}')
|
Futriix_db.create("users", '{"email": "existing@example.com", "name": "Duplicate2"}')
|
||||||
end)
|
end)
|
||||||
if not status then
|
if not status then
|
||||||
falcot_error("Unique constraint violation: " .. err)
|
Futriix_error("Unique constraint violation: " .. err)
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
Таким образом, первичный индекс в falcot - это автоматически создаваемый уникальный индекс для поля `id`, в то время как вторичные индексы создаются вручную для оптимизации произвольных запросов и могут быть как уникальными, так и неуникальными.
|
Таким образом, первичный индекс в Futriix - это автоматически создаваемый уникальный индекс для поля `id`, в то время как вторичные индексы создаются вручную для оптимизации произвольных запросов и могут быть как уникальными, так и неуникальными.
|
||||||
|
|
||||||
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
@ -1270,7 +1260,7 @@ end
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
#### Гарантируем уникальность email в коллекции users
|
#### Гарантируем уникальность email в коллекции users
|
||||||
falcot:~> constraint add users unique_email unique email
|
futriix:~> constraint add users unique_email unique email
|
||||||
|
|
||||||
#### Где:
|
#### Где:
|
||||||
#### - users: коллекция
|
#### - users: коллекция
|
||||||
@ -1283,7 +1273,7 @@ falcot:~> constraint add users unique_email unique email
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
#### Ограничиваем возраст пользователей (18-120 лет)
|
#### Ограничиваем возраст пользователей (18-120 лет)
|
||||||
falcot:~> constraint add users age_range range age "{\"min\":18,\"max\":120}"
|
futriix:~> constraint add users age_range range age "{\"min\":18,\"max\":120}"
|
||||||
|
|
||||||
#### Где range - тип ограничения, можно передавать JSON значение
|
#### Где range - тип ограничения, можно передавать JSON значение
|
||||||
```
|
```
|
||||||
@ -1292,20 +1282,20 @@ falcot:~> constraint add users age_range range age "{\"min\":18,\"max\":120}"
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
#### Проверяем формат email
|
#### Проверяем формат email
|
||||||
falcot:~> constraint add users email_pattern pattern email "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
|
futriix:~> constraint add users email_pattern pattern email "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
|
||||||
```
|
```
|
||||||
|
|
||||||
**Пример Внешний ключ (foreign key)**
|
**Пример Внешний ключ (foreign key)**
|
||||||
```sh
|
```sh
|
||||||
#### Связываем заказы с пользователями
|
#### Связываем заказы с пользователями
|
||||||
falcot:~> constraint add orders user_foreign_key foreign user_id "users/id"
|
futriix:~> constraint add orders user_foreign_key foreign user_id "users/id"
|
||||||
```
|
```
|
||||||
|
|
||||||
**Просмотр ограничений**
|
**Просмотр ограничений**
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
#### Список всех constraints для коллекции
|
#### Список всех constraints для коллекции
|
||||||
falcot:~> constraint list users
|
futriix:~> constraint list users
|
||||||
|
|
||||||
#### Пример вывода:
|
#### Пример вывода:
|
||||||
#### Constraints for collection 'users':
|
#### Constraints for collection 'users':
|
||||||
@ -1318,7 +1308,7 @@ falcot:~> constraint list users
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
#### Удаляем ограничение
|
#### Удаляем ограничение
|
||||||
falcot:~> constraint remove users unique_email
|
futriix:~> constraint remove users unique_email
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@ -1327,14 +1317,14 @@ falcot:~> constraint remove users unique_email
|
|||||||
|
|
||||||
## Хранимые процедуры
|
## Хранимые процедуры
|
||||||
|
|
||||||
**Хранимая процедура в falcot** – это откомпилированная во внутреннее представление сервера СУБД подпрограмма, хранящаяся в базе данных. Хранимые процедуры пишутся на специальном языке хранимых процедур и триггеров, в котором имеются операторы присваивания, ветвлений и циклов, а также можно использовать операторы SQL, такие как INSERT, DELETE, UPDATE и SELECT.
|
**Хранимая процедура в Futriix** – это откомпилированная во внутреннее представление сервера СУБД подпрограмма, хранящаяся в базе данных. Хранимые процедуры пишутся на специальном языке хранимых процедур и триггеров, в котором имеются операторы присваивания, ветвлений и циклов, а также можно использовать операторы SQL, такие как INSERT, DELETE, UPDATE и SELECT.
|
||||||
|
|
||||||
**Создание хранимой процедуры**
|
**Создание хранимой процедуры**
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
-- Создание хранимой процедуры для расчета статистики
|
-- Создание хранимой процедуры для расчета статистики
|
||||||
local procedure_code = [[ function calculate_stats(collection_name)
|
local procedure_code = [[ function calculate_stats(collection_name)
|
||||||
local documents = falcot_db.query(collection_name, "{}")
|
local documents = Futriix_db.query(collection_name, "{}")
|
||||||
local count = 0
|
local count = 0
|
||||||
local total_age = 0
|
local total_age = 0
|
||||||
|
|
||||||
@ -1352,7 +1342,7 @@ falcot:~> constraint remove users unique_email
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
-- Сохраняем процедуру
|
-- Сохраняем процедуру
|
||||||
falcot_db.create_procedure("calculate_stats", procedure_code)
|
Futriix_db.create_procedure("calculate_stats", procedure_code)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Работа с хранимыми процедурами в lua интерпретаторе:**
|
**Работа с хранимыми процедурами в lua интерпретаторе:**
|
||||||
@ -1361,7 +1351,7 @@ falcot_db.create_procedure("calculate_stats", procedure_code)
|
|||||||
-- Создание процедуры
|
-- Создание процедуры
|
||||||
procedure create calculate_stats '
|
procedure create calculate_stats '
|
||||||
function calculate_stats(collection_name)
|
function calculate_stats(collection_name)
|
||||||
local result = falcot_db.query(collection_name, "{}")
|
local result = Futriix_db.query(collection_name, "{}")
|
||||||
local count = 0
|
local count = 0
|
||||||
for _ in string.gmatch(result, "\\\"_id\\\":") do
|
for _ in string.gmatch(result, "\\\"_id\\\":") do
|
||||||
count = count + 1
|
count = count + 1
|
||||||
@ -1381,7 +1371,7 @@ procedure call calculate_stats
|
|||||||
# Создание процедуры
|
# Создание процедуры
|
||||||
procedure create user_stats '
|
procedure create user_stats '
|
||||||
function calculate_user_stats()
|
function calculate_user_stats()
|
||||||
local users = falcot_db.query("users", "{}")
|
local users = Futriix_db.query("users", "{}")
|
||||||
local count = 0
|
local count = 0
|
||||||
for _ in string.gmatch(users, "\\\"name\\\":") do
|
for _ in string.gmatch(users, "\\\"name\\\":") do
|
||||||
count = count + 1
|
count = count + 1
|
||||||
@ -1402,7 +1392,7 @@ procedure call user_stats
|
|||||||
|
|
||||||
## Триггеры
|
## Триггеры
|
||||||
|
|
||||||
Falcot помимо хранимых процедур поддерживает триггеры (обратные вызовы), которые можно создавать тремя способами:
|
Futriix помимо хранимых процедур поддерживает триггеры (обратные вызовы), которые можно создавать тремя способами:
|
||||||
|
|
||||||
- через lua-shell
|
- через lua-shell
|
||||||
- через интерактивную оболочку
|
- через интерактивную оболочку
|
||||||
@ -1413,8 +1403,8 @@ Falcot помимо хранимых процедур поддерживает
|
|||||||
```sh
|
```sh
|
||||||
|
|
||||||
-- Создаем триггер, который логирует создание документов в коллекции 'users'
|
-- Создаем триггер, который логирует создание документов в коллекции 'users'
|
||||||
falcot_db.add_trigger('log_user_creation', 'after_create', 'users', [[
|
Futriix_db.add_trigger('log_user_creation', 'after_create', 'users', [[
|
||||||
falcot_log('New user created with data: ' .. document)
|
Futriix_log('New user created with data: ' .. document)
|
||||||
-- Можно добавить дополнительную логику, например:
|
-- Можно добавить дополнительную логику, например:
|
||||||
-- - Отправка уведомления
|
-- - Отправка уведомления
|
||||||
-- - Валидация данных
|
-- - Валидация данных
|
||||||
@ -1422,7 +1412,7 @@ falcot_db.add_trigger('log_user_creation', 'after_create', 'users', [[
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
-- Триггер для проверки данных перед обновлением
|
-- Триггер для проверки данных перед обновлением
|
||||||
falcot_db.add_trigger('validate_user_update', 'before_update', 'users', [[
|
Futriix_db.add_trigger('validate_user_update', 'before_update', 'users', [[
|
||||||
local user_data = json.decode(document)
|
local user_data = json.decode(document)
|
||||||
if not user_data.email or not user_data.email:match('^[^@]+@[^@]+%.[^@]+$') then
|
if not user_data.email or not user_data.email:match('^[^@]+@[^@]+%.[^@]+$') then
|
||||||
error('Invalid email format')
|
error('Invalid email format')
|
||||||
@ -1433,11 +1423,11 @@ falcot_db.add_trigger('validate_user_update', 'before_update', 'users', [[
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
-- Триггер для очистки связанных данных при удалении
|
-- Триггер для очистки связанных данных при удалении
|
||||||
falcot_db.add_trigger('cleanup_user_data', 'before_delete', 'users', [[
|
Futriix_db.add_trigger('cleanup_user_data', 'before_delete', 'users', [[
|
||||||
-- Удаляем связанные записи из других коллекций
|
-- Удаляем связанные записи из других коллекций
|
||||||
falcot_db.delete('user_sessions', id)
|
Futriix_db.delete('user_sessions', id)
|
||||||
falcot_db.delete('user_preferences', id)
|
Futriix_db.delete('user_preferences', id)
|
||||||
falcot_log('Cleaned up user data for ID: ' .. id)
|
Futriix_log('Cleaned up user data for ID: ' .. id)
|
||||||
]])
|
]])
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -1448,14 +1438,14 @@ falcot_db.add_trigger('cleanup_user_data', 'before_delete', 'users', [[
|
|||||||
inbox.start
|
inbox.start
|
||||||
|
|
||||||
##### Создаем триггер для логирования
|
##### Создаем триггер для логирования
|
||||||
trigger add log_creation after_create orders "falcot_log('New order created: ' .. document)"
|
trigger add log_creation after_create orders "Futriix_log('New order created: ' .. document)"
|
||||||
|
|
||||||
#### Триггер для автоматического обновления статистики
|
#### Триггер для автоматического обновления статистики
|
||||||
trigger add update_stats after_create orders [[
|
trigger add update_stats after_create orders [[
|
||||||
-- Увеличиваем счетчик заказов
|
-- Увеличиваем счетчик заказов
|
||||||
local stats = falcot_db.read('statistics', 'order_count') or '0'
|
local stats = Futriix_db.read('statistics', 'order_count') or '0'
|
||||||
local count = tonumber(stats) + 1
|
local count = tonumber(stats) + 1
|
||||||
falcot_db.update('statistics', 'order_count', tostring(count))
|
Futriix_db.update('statistics', 'order_count', tostring(count))
|
||||||
]]
|
]]
|
||||||
|
|
||||||
#### Триггер для проверки цены перед созданием
|
#### Триггер для проверки цены перед созданием
|
||||||
@ -1473,19 +1463,19 @@ trigger add validate_price before_create products [[
|
|||||||
```sh
|
```sh
|
||||||
|
|
||||||
-- Создаем документ - сработает триггер after_create
|
-- Создаем документ - сработает триггер after_create
|
||||||
falcot_db.create('users', '{"name": "John", "email": "john@example.com", "age": 25}')
|
Futriix_db.create('users', '{"name": "John", "email": "john@example.com", "age": 25}')
|
||||||
-- В логах появится: "LUA: New user created with data: {"name": "John", "email": "john@example.com", "age": 25}"
|
-- В логах появится: "LUA: New user created with data: {"name": "John", "email": "john@example.com", "age": 25}"
|
||||||
|
|
||||||
-- Попытка создать пользователя с невалидным email
|
-- Попытка создать пользователя с невалидным email
|
||||||
falcot_db.create('users', '{"name": "Invalid", "email": "invalid", "age": 30}')
|
Futriix_db.create('users', '{"name": "Invalid", "email": "invalid", "age": 30}')
|
||||||
-- Получим ошибку: "Invalid email format"
|
-- Получим ошибку: "Invalid email format"
|
||||||
|
|
||||||
-- Обновляем пользователя
|
-- Обновляем пользователя
|
||||||
falcot_db.update('users', 'user123', '{"name": "John Updated", "email": "john.new@example.com", "age": 26}')
|
Futriix_db.update('users', 'user123', '{"name": "John Updated", "email": "john.new@example.com", "age": 26}')
|
||||||
-- Сработает триггер before_update для валидации
|
-- Сработает триггер before_update для валидации
|
||||||
|
|
||||||
-- Удаляем пользователя
|
-- Удаляем пользователя
|
||||||
falcot_db.delete('users', 'user123')
|
Futriix_db.delete('users', 'user123')
|
||||||
-- Сработает триггер before_delete для очистки связанных данных
|
-- Сработает триггер before_delete для очистки связанных данных
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -1497,16 +1487,16 @@ falcot_db.delete('users', 'user123')
|
|||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> **Реализация Lua-скриптов имеет экспериментальный статус, что в некоторых случаях может вызвать аварийное завершение работы сервера!**
|
> **Реализация Lua-скриптов имеет экспериментальный статус, что в некоторых случаях может вызвать аварийное завершение работы сервера!**
|
||||||
|
|
||||||
В Falcot реализовано несколько способов запуска Lua-скриптов
|
В Futriix реализовано несколько способов запуска Lua-скриптов
|
||||||
|
|
||||||
|
|
||||||
**Способ 1: Непосредственный ввод кода в lua-интерпретатор**
|
**Способ 1: Непосредственный ввод кода в lua-интерпретатор**
|
||||||
```sh
|
```sh
|
||||||
lua> falcot_log("Привет, мир!")
|
lua> Futriix_log("Привет, мир!")
|
||||||
LUA: Привет, мир!
|
LUA: Привет, мир!
|
||||||
|
|
||||||
lua> local x = 10 + 5
|
lua> local x = 10 + 5
|
||||||
lua> falcot_log("Результат: " .. x)
|
lua> Futriix_log("Результат: " .. x)
|
||||||
LUA: Результат: 15
|
LUA: Результат: 15
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -1514,10 +1504,10 @@ LUA: Результат: 15
|
|||||||
```sh
|
```sh
|
||||||
lua> local script = [[
|
lua> local script = [[
|
||||||
>> for i = 1, 3 do
|
>> for i = 1, 3 do
|
||||||
>> falcot_log("Итерация: " .. i)
|
>> Futriix_log("Итерация: " .. i)
|
||||||
>> end
|
>> end
|
||||||
>> ]]
|
>> ]]
|
||||||
lua> falcot.engine.execute_script(script)
|
lua> Futriix.engine.execute_script(script)
|
||||||
LUA: Итерация: 1
|
LUA: Итерация: 1
|
||||||
LUA: Итерация: 2
|
LUA: Итерация: 2
|
||||||
LUA: Итерация: 3
|
LUA: Итерация: 3
|
||||||
@ -1525,7 +1515,7 @@ LUA: Итерация: 3
|
|||||||
|
|
||||||
**Способ 3: Запуск из файла**
|
**Способ 3: Запуск из файла**
|
||||||
|
|
||||||
1. **`lua_scripts` - это каталог (директория), где хранятся Lua-скрипты для выполнения сервером Falcot**
|
1. **`lua_scripts` - это каталог (директория), где хранятся Lua-скрипты для выполнения сервером Futriix**
|
||||||
2. **При запуске сервера автоматически выполняются скрипты из `auto_execute` списка, находящиеся в этой директории**
|
2. **При запуске сервера автоматически выполняются скрипты из `auto_execute` списка, находящиеся в этой директории**
|
||||||
3. **Сервер автоматически создает этот каталог при первом запуске, если он не существует**
|
3. **Сервер автоматически создает этот каталог при первом запуске, если он не существует**
|
||||||
|
|
||||||
@ -1534,12 +1524,12 @@ LUA: Итерация: 3
|
|||||||
1. **Сервер при запуске создает каталог lua_scripts (если его нет)**
|
1. **Сервер при запуске создает каталог lua_scripts (если его нет)**
|
||||||
2. **В этот каталог можно помещать Lua-скрипты**
|
2. **В этот каталог можно помещать Lua-скрипты**
|
||||||
3. **Скрипты из списка auto_execute выполняются автоматически при старте сервера**
|
3. **Скрипты из списка auto_execute выполняются автоматически при старте сервера**
|
||||||
4. **Другие скрипты можно выполнять вручную через Lua-интерпретатор командой falcot.engine.lua.execute("имя_скрипта.lua")**
|
4. **Другие скрипты можно выполнять вручную через Lua-интерпретатор командой Futriix.engine.lua.execute("имя_скрипта.lua")**
|
||||||
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
|
||||||
Пример структуры каталогов falcot:
|
Пример структуры каталогов Futriix:
|
||||||
|
|
||||||
lua_scripts/
|
lua_scripts/
|
||||||
├── init.lua (автоматически выполняется при старте)
|
├── init.lua (автоматически выполняется при старте)
|
||||||
@ -1554,28 +1544,28 @@ lua_scripts/
|
|||||||
### Примеры lua-скриптов
|
### Примеры lua-скриптов
|
||||||
```sh
|
```sh
|
||||||
-- Простой Lua скрипт для демонстрации
|
-- Простой Lua скрипт для демонстрации
|
||||||
falcot_log("Запуск примера Lua скрипта")
|
Futriix_log("Запуск примера Lua скрипта")
|
||||||
|
|
||||||
-- Создание документа
|
-- Создание документа
|
||||||
falcot_db.create("users", '{"name": "John", "age": 30, "email": "john@example.com"}')
|
Futriix_db.create("users", '{"name": "John", "age": 30, "email": "john@example.com"}')
|
||||||
|
|
||||||
-- Чтение документа
|
-- Чтение документа
|
||||||
local result = falcot_db.read("users", "some-document-id")
|
local result = Futriix_db.read("users", "some-document-id")
|
||||||
falcot_log("Результат чтения: " .. result)
|
Futriix_log("Результат чтения: " .. result)
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
-- Математические операции
|
-- Математические операции
|
||||||
local x = 10
|
local x = 10
|
||||||
local y = 20
|
local y = 20
|
||||||
falcot_log("Сумма: " .. (x + y))
|
Futriix_log("Сумма: " .. (x + y))
|
||||||
|
|
||||||
-- Циклы и условия
|
-- Циклы и условия
|
||||||
for i = 1, 5 do
|
for i = 1, 5 do
|
||||||
if i % 2 == 0 then
|
if i % 2 == 0 then
|
||||||
falcot_log("Четное число: " .. i)
|
Futriix_log("Четное число: " .. i)
|
||||||
else
|
else
|
||||||
falcot_log("Нечетное число: " .. i)
|
Futriix_log("Нечетное число: " .. i)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1608,7 +1598,7 @@ rollback transaction_456
|
|||||||
|
|
||||||
## Шардинг
|
## Шардинг
|
||||||
|
|
||||||
Встроенная в falcot СУБД **futriix** поддерживает горинзонтальный шардинг, т.е. горизонтальное масштабирование.
|
Встроенная в Futriix СУБД **futriix** поддерживает горинзонтальный шардинг, т.е. горизонтальное масштабирование.
|
||||||
По умолчанию шардинг производится `по алгоритму Hash-based с консистентным хэшированием`. Шифрование производится согласно алгоритму `SipHasher13`.
|
По умолчанию шардинг производится `по алгоритму Hash-based с консистентным хэшированием`. Шифрование производится согласно алгоритму `SipHasher13`.
|
||||||
Но также поддерживается возможность управлять шардингом вручную. Ниже приведены команды по управлению шардингом:
|
Но также поддерживается возможность управлять шардингом вручную. Ниже приведены команды по управлению шардингом:
|
||||||
|
|
||||||
@ -1616,7 +1606,7 @@ rollback transaction_456
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
#### Добавляем новый узел шардинга
|
#### Добавляем новый узел шардинга
|
||||||
falcot:~> shard add node1 127.0.0.1:8084 1024
|
futriix:~> shard add node1 127.0.0.1:8084 1024
|
||||||
|
|
||||||
#### Где:
|
#### Где:
|
||||||
#### - node1: идентификатор узла
|
#### - node1: идентификатор узла
|
||||||
@ -1628,14 +1618,14 @@ falcot:~> shard add node1 127.0.0.1:8084 1024
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
#### Удаляем узел из кластера
|
#### Удаляем узел из кластера
|
||||||
falcot:~> shard remove node1
|
futriix:~> shard remove node1
|
||||||
```
|
```
|
||||||
|
|
||||||
**Пример миграции между шардами узла**
|
**Пример миграции между шардами узла**
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
#### Мигрируем данные коллекции между узлами
|
#### Мигрируем данные коллекции между узлами
|
||||||
falcot:~> shard migrate users node1 node2 user_id
|
futriix:~> shard migrate users node1 node2 user_id
|
||||||
|
|
||||||
#### Где:
|
#### Где:
|
||||||
#### - users: коллекция для миграции
|
#### - users: коллекция для миграции
|
||||||
@ -1648,7 +1638,7 @@ falcot:~> shard migrate users node1 node2 user_id
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
#### Показывает статус всего кластера
|
#### Показывает статус всего кластера
|
||||||
falcot:~> shard status
|
futriix:~> shard status
|
||||||
|
|
||||||
#### Пример вывода:
|
#### Пример вывода:
|
||||||
#### === Cluster Status ===
|
#### === Cluster Status ===
|
||||||
@ -1668,20 +1658,20 @@ falcot:~> shard status
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
#### Запускает автоматическую ребалансировку
|
#### Запускает автоматическую ребалансировку
|
||||||
falcot:~> cluster rebalance
|
futriix:~> cluster rebalance
|
||||||
```
|
```
|
||||||
|
|
||||||
**Пример создания шардированной системы пользователей**
|
**Пример создания шардированной системы пользователей**
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
#### Добавляем узлы
|
#### Добавляем узлы
|
||||||
falcot:~> shard add node1 127.0.0.1:8081 1024
|
futriix:~> shard add node1 127.0.0.1:8081 1024
|
||||||
falcot:~> shard add node2 127.0.0.1:8082 1024
|
futriix:~> shard add node2 127.0.0.1:8082 1024
|
||||||
|
|
||||||
#### Создаем constraints для пользователей
|
#### Создаем constraints для пользователей
|
||||||
falcot:~> constraint add users unique_email unique email
|
futriix:~> constraint add users unique_email unique email
|
||||||
falcot:~> constraint add users valid_age range age "{\"min\":13,\"max\":150}"
|
futriix:~> constraint add users valid_age range age "{\"min\":13,\"max\":150}"
|
||||||
falcot:~> constraint add users valid_username pattern username "^[a-zA-Z0-9_]{3,20}$"
|
futriix:~> constraint add users valid_username pattern username "^[a-zA-Z0-9_]{3,20}$"
|
||||||
|
|
||||||
#### Распределяем пользователей по шардам
|
#### Распределяем пользователей по шардам
|
||||||
shard migrate users node1 node2 user_id
|
shard migrate users node1 node2 user_id
|
||||||
@ -1691,13 +1681,13 @@ shard migrate users node1 node2 user_id
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
#### Проверяем статус
|
#### Проверяем статус
|
||||||
falcot:~> shard status
|
futriix:~> shard status
|
||||||
|
|
||||||
#### Если нужно перебалансировать
|
#### Если нужно перебалансировать
|
||||||
falcot:~> cluster rebalance
|
futriix:~> cluster rebalance
|
||||||
|
|
||||||
#### Проверяем constraints
|
#### Проверяем constraints
|
||||||
falcot:~> constraint list users
|
futriix:~> constraint list users
|
||||||
```
|
```
|
||||||
|
|
||||||
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
@ -1705,7 +1695,7 @@ falcot:~> constraint list users
|
|||||||
|
|
||||||
## Сферы применения
|
## Сферы применения
|
||||||
|
|
||||||
Идеальными сферами применения проекта falcot, являются следующие:
|
Идеальными сферами применения проекта Futriix, являются следующие:
|
||||||
|
|
||||||
1. **Микросервисы с потребностью в оперативной аналитике**
|
1. **Микросервисы с потребностью в оперативной аналитике**
|
||||||
2. **Работающая в режиме реального времени панель мониторинга - для администрирования бекенда**
|
2. **Работающая в режиме реального времени панель мониторинга - для администрирования бекенда**
|
||||||
@ -1713,15 +1703,15 @@ falcot:~> constraint list users
|
|||||||
4. **Прототипирование перед выбором специализированного решения**
|
4. **Прототипирование перед выбором специализированного решения**
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
<b>Пример функциональных возможностей falcot классов OLTP и OLAP для микросервисов с потребностью в оперативной аналитике</b>
|
<b>Пример функциональных возможностей Futriix классов OLTP и OLAP для микросервисов с потребностью в оперативной аналитике</b>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
-- OLTP-операция: быстрая транзакция
|
-- OLTP-операция: быстрая транзакция
|
||||||
falcot_db.update("users", "user123", '{"balance": 100}')
|
Futriix_db.update("users", "user123", '{"balance": 100}')
|
||||||
|
|
||||||
-- OLAP-операция: аналитический запрос
|
-- OLAP-операция: аналитический запрос
|
||||||
local analytics = falcot_db.query("transactions", '{"date": {"$gt": "2024-01-01"}}')
|
local analytics = Futriix_db.query("transactions", '{"date": {"$gt": "2024-01-01"}}')
|
||||||
```
|
```
|
||||||
|
|
||||||
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
@ -1747,14 +1737,18 @@ local analytics = falcot_db.query("transactions", '{"date": {"$gt": "2024-01-01"
|
|||||||
- [x] Исправить ошибки записи журнала логов (в журнал лога кроме текущего времени добавить текущий год)
|
- [x] Исправить ошибки записи журнала логов (в журнал лога кроме текущего времени добавить текущий год)
|
||||||
- [x] Реализовать утилиту тестирования сервера на количество запросов на чтение/запись
|
- [x] Реализовать утилиту тестирования сервера на количество запросов на чтение/запись
|
||||||
- [x] Переписать асинхронную мастер-мастер репликацию на синхронную мастер-мастер репликацию
|
- [x] Переписать асинхронную мастер-мастер репликацию на синхронную мастер-мастер репликацию
|
||||||
- [ ] Реализовать журнал WAL
|
- [x] Реализовать базовый журнал WAL
|
||||||
- [ ] Реализовать графический веб-интерфейс для упраления кластером
|
- [ ] Реализовать графический веб-интерфейс для управления кластером
|
||||||
- [x] Реализовать автоматический шардинг с консистентным хэшированием
|
- [ ] Реализовать автоматический шардинг с консистентным хэшированием
|
||||||
- [ ] Реализовать поддержку алгоритма Raft
|
- [ ] Реализовать полноценную поддержку алгоритма Raft (с автоматическим перевывыбором лидера, с доменом отказа)
|
||||||
|
- [ ] Реализовать полноценную поддержку кластеризации с обработкой состояний "split-brain"
|
||||||
- [ ] Реализовать поддержку SQL
|
- [ ] Реализовать поддержку SQL
|
||||||
- [ ] Реализовать поддержку ACID-транзакций
|
- [ ] Реализовать поддержку ACID-транзакций
|
||||||
- [ ] Интегрировать интеллектуального помощник FutBot на официальный сайт
|
- [ ] Интегрировать интеллектуального помощник FutBot в веб-интерфейс
|
||||||
- [ ] Реализовать полноценного интеллектуального помощника FutBot, задачами которого будут быстрый поиск ответов на вопросы, возникающие при эксплуатации субд Futrix.
|
- [ ] Реализовать внешние транзакции
|
||||||
|
- [ ] Интеграцию с мониторинговыми системами (Prometheus, Grafana)
|
||||||
|
- [ ] Реализовать полноценную систему бекапирования с возможностью определения корректности созданного бекапа и кроссдацентровых решений по автоматическому копироваю бекапа в другой дацентр
|
||||||
|
- [] Реализовать полноценную систему авторизации на основе RBAC
|
||||||
|
|
||||||
См. [Открытые проблемы](https://source.futriix.ru/gvsafronov/futriixw/issues) полный список предлагаемых функций (и известных проблем).
|
См. [Открытые проблемы](https://source.futriix.ru/gvsafronov/futriixw/issues) полный список предлагаемых функций (и известных проблем).
|
||||||
|
|
||||||
@ -1770,4 +1764,4 @@ local analytics = falcot_db.query("transactions", '{"date": {"$gt": "2024-01-01"
|
|||||||
|
|
||||||
Ссылка на Интеллектуальный помощник - [FutBot](https://t.me/Futriix_bot)
|
Ссылка на Интеллектуальный помощник - [FutBot](https://t.me/Futriix_bot)
|
||||||
|
|
||||||
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
Loading…
x
Reference in New Issue
Block a user