Update README.md

This commit is contained in:
gvsafronov committed 2026-10-03 21:24:07 +00:00
1 parent a373f05b18
commit 6b9ee6b3d2
1 file changed
+79 -120
+79 -120
View File
@@ -618,7 +618,7 @@ $ ./futriix
В субд **"futriix"** используется два журнала для ведение логов: `"futriix.log"`-основной журнал, в котором ведутся логи при работе в субд через терминал. В субд **"futriix"** используется два журнала для ведение логов: `"futriix.log"`-основной журнал, в котором ведутся логи при работе в субд через терминал.
**futriix.log** — основной системный журнал, фиксирующий все события жизненного цикла СУБД: запуск/остановку сервера, инициализацию компонентов (транзакции, Raft-координатор, ACL), состояние кластера и критические ошибки выполнения запросов. **futriix.log** — основной системный журнал, фиксирующий все события жизненного цикла СУБД: запуск/остановку сервера, инициализацию компонентов (batch, Raft-координатор, ACL), состояние кластера и критические ошибки выполнения запросов.
Журнал использует структурированный JSON-формат (для webui.log) и текстовый формат с временными метками (для futriis.log), что обеспечивает удобный парсинг и интеграцию с системами мониторинга. Журнал использует структурированный JSON-формат (для webui.log) и текстовый формат с временными метками (для futriis.log), что обеспечивает удобный парсинг и интеграцию с системами мониторинга.
@@ -942,148 +942,109 @@ futriix:~> db.startSession()
<p align="right">(<a href="#readme-top">К началу</a>)</p> <p align="right">(<a href="#readme-top">К началу</a>)</p>
## Транзакции ## Batch
# Механизм надёжности и восстановления в СУБД futriix
В СУБД **futriix** для обеспечения надёжности (durability) и быстрого восстановления БД из резервной копии реализована полноценная поддержка WAL (Write-Ahead Logging). Журнал WAL по умолчанию хранится в файле futriix.wal, находящемся в каталоге futriix. В СУБД **futriix** для обеспечения надёжности (durability), атомарности и быстрого восстановления базы данных реализована двухуровневая система журналирования:
СУБД поддерживает ACID‑транзакции с MVCC (Multi‑Version Concurrency Control) — для локальной атомарности и изоляции на уровне отдельных узлов кластера. Для распределённых операций используется паттерн SAGA с оркестратором: глобальная согласованность достигается через последовательность компенсируемых локальных транзакций, управляемых централизованным оркестратором, который отслеживает состояние шагов, инициирует компенсацию при сбоях и гарантирует завершение сценария в согласованном состоянии. 1. **WAL (Write-Ahead Log)** — сегментированный журнал предзаписи для **batch-операций** (атомарных групп изменений). По умолчанию хранится в каталоге `futriix/wal_segments/`.
2. **AOF (Append-Only File)** — журнал дозаписи для **одиночных мутаций**, выполненных вне batch (прямые вызовы `Insert`, `Update`, `Delete`, `Restore`, а также операции из REPL, HTTP-API и Lua-плагинов). По умолчанию хранится в каталоге `futriix/aof/`.
Парадигма eventual consistency обеспечивает согласованность данных в распределённой среде: изменения распространяются асинхронно между узлами, а финальное согласованное состояние достигается со временем с учётом гарантий доставки событий и правил разрешения конфликтов. Такой подход позволяет сохранить высокую доступность и производительность даже при временных сетевых сбоях. Такое разделение даёт:
- **Атомарность** для сложных составных операций (batch).
- **Гарантированную сохранность** каждой отдельной мутации (AOF).
- **Быстрое восстановление** через воспроизведение обоих журналов при старте.
- **Разделение нагрузки**: batch-операции пишутся в WAL сегментами по 64 МБ, одиночные мутации — в AOF с ротацией по 64 МБ.
Доступны команды, с восстановлением после сбоев через журнал предзаписи: ---
* `startSession()`- Начать сессию (устойчивый контекст взаимодействия клиента с СУБД, в рамках которого поддерживается состояние) в субд в рамках которой будет открыта транзакция ## Что такое Batch
* `startTransaction()`- Начать транзакцию
* `commitTransaction()`- Сделать коммит транзакцию
* `abortTransaction()` - Прервать транзакцию
> [!IMPORTANT] **Batch** — это группа операций, применяемых **атомарно**: либо все операции из группы применяются, либо ни одна. Batch заменяет полноценные ACID-транзакции в локальном узле и работает по принципу «всё или ничего» через WAL.
> **Матрица гарантий согласованности** <br>
> Ниже приведена матрица гарантий согласованности, призванная дать ответ на потенциальный возможный вопрос пользователя: "А вдруг у меня
> данные потеряются"?
# Матрица гарантий согласованности Futriix **Ключевые свойства batch:**
| Операция | Уровень изоляции | Поведение при нормальной работе | Поведение при сетевых сбоях | Восстановление после сбоя | - **Атомарность** через WAL: сначала весь batch сериализуется и записывается в WAL с `fsync`, только после успешной записи операции применяются к in-memory структурам.
|----------|------------------|--------------------------------|----------------------------|---------------------------| - **Откат при ошибке применения**: если операция падает на середине применения, уже применённые операции откатываются (best-effort) — полная атомарность гарантируется на уровне WAL при восстановлении.
| **Чтение (Read)** | **Read Committed** + MVCC | • Чтение всегда возвращает только закоммиченные данные<br>• MVCC предоставляет снапшот на момент начала чтения<br>• Используется Visibility Map для быстрого доступа к версиям<br>• Кеширование через ReadTimestampCache | • При потере соединения - операция повторяется автоматически (идиемпотентность)<br>• Если узел недоступен - запрос перенаправляется к реплике (Raft)<br>• Чтение из кэша возможно при недоступности основного узла | • После восстановления узла - чтение продолжается с момента прерывания<br>• WAL не требуется для чтения (только для записи)<br>• Снапшоты MVCC восстанавливаются из documentVersions | - **Короткое время жизни**: batch создаётся, наполняется операциями и коммитится в рамках одной логической операции. Не поддерживает savepoints, таймауты, распределённую координацию.
| **Запись (Write)** | **Read Committed** | • Запись сначала сохраняется в WAL (атомарно)<br>• Затем применяется к in-memory структурам<br>• Индексы обновляются атомарно с документом<br>• Атомарное обновление метаданных коллекции | • Если WAL запись не подтверждена - операция не применяется<br>• При сбое до коммита - данные не теряются (WAL)<br>• При потере лидера (Raft) - запись перенаправляется к новому лидеру<br>• Используется fsync для гарантии записи на диск | • После восстановления - запись повторяется из WAL<br>• Автоматическое применение WAL при загрузке<br>• Консистентность через LSN (Log Sequence Number)<br>• Segmented WAL позволяет восстанавливать частичные записи | - **Реестр активных batch'ей**: `BatchManager.activeBatches` (см. `runtime_limits.go`) защищает документы, участвующие в незакоммиченном batch, от вытеснения (eviction) при нехватке памяти.
| **Транзакция (BEGIN...COMMIT)** | **Read Committed / Repeatable Read** (MVCC) | • Транзакция атомарна: все или ничего<br>• MVCC предоставляет снапшот на момент начала транзакции<br>• Операции внутри транзакции изолированы<br>• Savepoints для частичного отката<br>• Deadlock detection с автоматическим abort‑ом | • При сбое в середине транзакции — автоматический откат<br>• WAL гарантирует восстановление закоммиченных транзакций<br>• SAGA с оркестратором для распределённых транзакций с таймаутом (10 сек)<br>• Pending‑шаги Saga автоматически компенсируются при таймауте | • Асинхронное восстановление из WAL<br>• Восстановление только закоммиченных транзакций<br>• Pending‑шаги SAGA проверяются на таймаут<br>• Recovery Manager обрабатывает записи параллельно | - **AOF-дублирование**: после коммита batch также пишется в AOF для ускорения восстановления.
| **Индексация** | **Read Committed** | • Индексы обновляются атомарно с документом<br>• Уникальные индексы проверяются перед вставкой<br>• Индексы хранятся в sync.Map (wait-free)<br>• Поддержка составных индексов | • Индексы восстанавливаются из данных при загрузке<br>• При сбое - индексы перестраиваются автоматически<br>• Консистентность через LSN<br>• Уникальные индексы проверяются при восстановлении | • Индексы перестраиваются из документов при старте<br>• WAL содержит операции обновления индексов<br>• Автоматическое восстановление целостности индексов<br>• Проверка дубликатов при восстановлении уникальных индексов |
| **Удаление (Delete)** | **Read Committed** | • Soft delete сохраняет данные (метка deleted_at)<br>• Удаление из индексов происходит атомарно<br>• Физическое удаление - только после подтверждения<br>• Атомарное обновление счётчиков | • При сбое - операция повторяется из WAL<br>• Soft delete защищает от потери данных<br>• Окончательное удаление - после подтверждения всеми репликами<br>• Permanent delete требует подтверждения | • Soft delete записи восстанавливаются из WAL<br>• Permanent delete повторяется из WAL<br>• Счётчики документов восстанавливаются атомарно |
| **Репликация (Raft)** | **Linearizable** (для записей) / **Read Committed** (для чтений) | • Записи проходят через Raft-журнал<br>• Линейная консистентность для записей<br>• Чтения могут быть из реплик (Read Committed)<br>• Автоматическое переизбрание лидера | • При сбое лидера - автоматический выбор нового (Raft)<br>• Запросы перенаправляются к новому лидеру<br>• Данные согласованы через журнал Raft<br>• Read-запросы могут обслуживаться репликами | • Raft журнал восстанавливается из WAL<br>• Новый лидер применяет все закоммиченные записи<br>• Реплики синхронизируются с лидером<br>• Автоматическое восстановление кластера |
| **Шардирование (Range Shards)** | **Read Committed** | • Диапазонные шарды с динамическим сплитом/мерджем<br>• Данные распределены по диапазонам ключей<br>• Предсказуемая нагрузка на узлы<br>• Возможность предварительного добавления узлов под горячие диапазоны | • При сбое узла - шард перераспределяется<br>• Данные реплицируются для отказоустойчивости<br>• Автоматический сплит при переполнении шарда<br>• Мердж при уменьшении нагрузки | • Шарды восстанавливаются из чекпоинтов<br>• WAL применяется к каждому шарду<br>• Балансировка после восстановления<br>• Автоматическое перераспределение |
| **Checkpoint / Snapshot** | **Read Committed** | • Периодическое сохранение снапшотов (каждые 5 мин)<br>• Атомарная запись с временным файлом<br>• Контрольная сумма для верификации<br>• Сжатие снапшотов (gzip)<br>• Хранение последних N чекпоинтов | • При сбое во время создания - временный файл удаляется<br>• Предыдущий чекпоинт остаётся целым<br>• Атомарное переименование гарантирует целостность<br>• WAL LSN сохраняется в чекпоинте | • Загрузка из последнего валидного чекпоинта<br>• Применение WAL после чекпоинта<br>• Проверка контрольной суммы при загрузке<br>• Автоматическое восстановление из чекпоинта |
| **WAL (Write-Ahead Log)** | **Persistent** | • Все записи сначала идут в WAL<br>• Segmented WAL с ротацией (64 MB)<br>• Пакетная запись с fsync<br>• CRC32 для верификации целостности<br>• Асинхронная запись с буферизацией | • При сбое — WAL сохраняет все записи<br>• fsync гарантирует запись на диск<br>• Segments позволяют восстанавливать частичные данные<br>• Индекс LSN для быстрого поиска | • Полное восстановление из WAL<br>• Асинхронный Recovery Manager<br>• Параллельное применение записей (4 воркера)<br>• Восстановление Saga с оркестратором (pending‑шагов и компенсаций) |
| **SAGA с оркестратором** | **Read Committed** | • Оркестрированная Saga для распределённых транзакций<br>• Последовательность шагов с компенсационными действиями для каждого этапа<br>• Оркестратор управляет порядком выполнения и обработкой отказов<br>• Таймаут на выполнение шага (10 сек) | • При сбое оркестратора — шаг остаётся в незавершённом состоянии<br>• Автоматическая компенсация при превышении таймаута<br>• Отдельные шаги могут выполняться автономно на узлах<br>• Pending шаги и компенсации сохраняются в WAL | • Восстановление pending Saga‑шагов при старте<br>• Проверка таймаутов и статуса шагов<br>• Автоматический запуск компенсационных действий для просроченных шагов<br>• Координация узлов для завершения/отката цепочки шагов |
| **Deadlock Detection** | **N/A** | • Обнаружение циклических ожиданий<br>• Автоматический abort одной из транзакций<br>• Периодическая проверка (каждую секунду)<br>• Поддержка распределённых deadlock-ов | • При сетевых задержках - возможны ложные срабатывания<br>• Abort транзакции с последующим повтором<br>• Распределённый deadlock detection через координатор | • Deadlock граф восстанавливается из активных транзакций<br>• Автоматическое разрешение при старте<br>• Логирование deadlock-ов для анализа |
| **MVCC (Multi-Version Concurrency Control)** | **Repeatable Read** (внутри транзакции) | • Каждая запись хранит несколько версий<br>• Чтение получает версию на момент начала транзакции<br>• Автоматическая очистка старых версий (каждые 5 мин)<br>• Хранение до 100 версий на документ<br>• Retention: 7 дней | • Версии сохраняются в памяти и WAL<br>• При сбое - версии восстанавливаются из WAL<br>• Visibility Map ускоряет проверку видимости<br>• ReadTimestampCache для быстрого доступа | • Версии восстанавливаются из WAL записей<br>• Автоматическая очистка устаревших версий<br>• Восстановление Visibility Map<br>• Кеш перестраивается при загрузке |
### Условные обозначения: **Операции batch:**
| Символ | Значение | | Команда | Действие |
|--------|----------| |---------|----------|
| ✅ **Гарантировано** | Операция гарантирует консистентность при любых условиях | | `NewBatch(db, coll)` | Создать новый batch для указанной БД и коллекции |
| ⚠️ **Частично** | Требует дополнительных проверок или имеет ограничения | | `batch.AddInsert(doc)` | Добавить операцию вставки документа |
| 🔄 **Автоматически** | Восстановление происходит без вмешательства пользователя | | `batch.AddUpdate(docID, updates)` | Добавить операцию обновления |
| 📊 **Настраивается** | Поведение можно настроить через конфигурацию | | `batch.AddDelete(docID)` | Добавить операцию удаления |
| `batch.AddRestore(docID)` | Добавить операцию восстановления |
| `batch.Commit()` | Применить batch атомарно через WAL |
## Ключевые гарантии: ---
1. **ACID**: Все операции соответствуют ACID благодаря WAL + MVCC + SAGA c оркестратором ### Что такое AOF
2. **Durability**: fsync + WAL гарантируют сохранность данных
3. **Consistency**: Чекпоинты + контрольные суммы + верификация
4. **Isolation**: MVCC + Read Committed + Repeatable Read внутри транзакций
5. **Availability**: Raft + репликация + автоматическое переизбрание лидера
6. **Partition Tolerance**: SAGA c оркестратором + таймауты + автоматический откат
**AOF (Append-Only File)** — журнал дозаписи, который логирует **каждую отдельную мутацию**, выполненную вне batch. Это нужно, потому что прямые вызовы `coll.Insert()`, `coll.Update()`, `coll.Delete()` идут мимо WAL, и без AOF такие изменения могли бы потеряться при сбое.
**Ключевые свойства AOF:**
> [!TIP] - **Формат**: JSON-lines (по одной JSON-записи на строку) с CRC32 для верификации целостности.
> WAL- это журнал предзаписи транзакций, который в субд **futriix** выполняет следующие действия: - **Ротация**: файлы разбиваются по размеру 64 МБ, имена вида `aof_<N>.log`.
> 1. Хранит все операции транзакций до их фиксации (INSERT, UPDATE, DELETE) - **fsync**: каждая запись синхронизируется с диском через `file.Sync()` для гарантии сохранности.
> 2. Записывает каждое изменение последовательно с LSN (Log Sequence Number) - **Восстановление при старте**: `ReplayAOF(storage)` читает все файлы и применяет операции к хранилищу.
> 3. Используется для восстановления после сбоя через recoverFromWAL() - **Идемпотентность**: повторное применение операции не ломает состояние (insert/update/delete идемпотентны по ключу).
> 4. Формат: бинарный с CRC-контролем, размером записи и типом (Transaction/Checkpoint) - **Автоматическое логирование**: методы `Collection.Insert`, `Update`, `Delete`, `PermanentDelete`, `RestoreDeleted` вызывают `LogAOFInsert`, `LogAOFUpdate`, `LogAOFDelete`, `LogAOFRestore` соответственно.
> 5. Расположение: /futriix/futriix.wal (один файл)
> [!TIP] **Типы записей AOF:**
> **Кроме того существуют так называемые **Периодические снимки состояния** журнала предзаписи, которые выполняют следующие функции:**
> 1. Фиксируют состояние всех активных транзакций на момент создания
> 2. Создаются автоматически каждые **5 минут (300 секунд)**
> 3. Именуются по маске: `futriis.wal.checkpoint.{timestamp}`
> 4. Хранят сжатое состояние: последний LSN + активные транзакции
> 5. Автоматически очищаются: остаётся только 5 последних чекпоинтов
> 6. Расположение: `/futriix/wal.checkpoint.wal` (несколько файлов файл)
> **Подводя итог, хочется отметить следующее: журнал предзаписи транзакций и периодические снимки состояния работают следующим образом:**
> 1. Штатная работа: WAL пишет каждую транзакцию
> 2. Периодически: создаётся checkpoint (снимок активных транзакций)
> 3. При сбое: восстанавливаемся с последнего checkpoint + доигрываем операции из WAL
| Тип | Описание |
|-----|----------|
| `insert` | Вставка документа |
| `update` | Обновление документа |
| `delete` | Удаление документа (soft или permanent) |
| `restore` | Восстановление мягко удалённого документа |
```sh ---
# Начало сессии (с временем создания сессии)
futriix:~> db.startSession()
✓ Session started: session_12345 at 2026-01-15 10:55:15.123
# Начало транзакции в рамках сессии ### SAGA для распределённых операций
futriix:~> session.startTransaction()
✓ Transaction started: TX_67890 at 2026-01-15 10:55:18.456
# Выполнение операций в транзакции (с временем выполнения) Для **распределённых** операций (между узлами кластера, между сервисами, для долгоживущих бизнес-процессов) используется паттерн **SAGA с оркестратором**:
futriix:~> insert employees name=New User,position=Trainee,age=22
✓ Document inserted with ID: 550e8400-e29b-41d4-a716-446655440005 (created at: 2026-01-15 10:55:21.789)
futriix:~> update employees 550e8400-e29b-41d4-a716-446655440005 status=active - Глобальная согласованность достигается через последовательность **компенсируемых локальных шагов**.
✓ Document '550e8400-e29b-41d4-a716-446655440005' updated at 2026-01-15 10:55:24.012 - Каждый шаг SAGA может использовать **batch** для гарантии атомарности внутри себя.
- Оркестратор отслеживает состояние шагов, инициирует **компенсацию** при сбоях и гарантирует завершение сценария в согласованном состоянии.
- Состояние SAGA персистентно хранится в JSON-файлах (директория `saga_states/`), при старте pending-шаги восстанавливаются, а просроченные — компенсируются.
- Компенсации **идемпотентны**: повторный вызов не ломает состояние.
- При превышении таймаута шага (по умолчанию 10 сек) автоматически запускается компенсация.
# Подтверждение транзакции (с временем коммита) **Пример SAGA с batch внутри шага:**
futriix:~> session.commitTransaction()
✓ Transaction committed successfully at 2026-01-15 10:55:27.345
# Откат транзакции (при ошибке) (с временем отката) ```go
futriix:~> session.startTransaction() saga := sagaManager.BeginSaga("order_flow")
✓ Transaction started: TX_67891 at 2026-01-15 10:56:10.123
futriix:~> insert employees name=Test User,position=Test,age=25 saga.AddStep("create_order",
✓ Document inserted with ID: 550e8400-e29b-41d4-a716-446655440006 (created at: 2026-01-15 10:56:13.456) func() error {
batch := NewBatch("shop", "orders")
batch.AddInsert(orderDoc)
batch.AddUpdate("inv_1", map[string]interface{}{"qty": 5})
return batch.Commit() // атомарность шага через WAL
},
func() error {
batch := NewBatch("shop", "orders")
batch.AddDelete(orderDoc.ID)
batch.AddUpdate("inv_1", map[string]interface{}{"qty": 10})
return batch.Commit() // атомарность компенсации
},
nil)
futriix:~> session.abortTransaction() saga.AddStep("reserve_payment",
✓ Transaction aborted, changes rolled back at 2026-01-15 10:56:16.789 func() error { return paymentClient.Reserve(orderID, amount) }, // внешний вызов
func() error { return paymentClient.Cancel(orderID) },
nil)
# Просмотр активных транзакций (с временем начала) sagaManager.Execute(saga)
futriix:~> show transactions
=== Active Transactions ===
ID: TX_67892, Status: active, Operations: 2, Started: 2026-01-15 10:57:00.123
- INSERT: company.employees [user-uuid-001]
- UPDATE: company.employees [user-uuid-002]
ID: TX_67893, Status: active, Operations: 1, Started: 2026-01-15 10:57:05.456
- DELETE: company.employees [user-uuid-003]
# Просмотр сессий (с временем создания)
futriix:~> show sessions
=== Active Sessions ===
session_12345 - Created: 2026-01-15 10:55:15.123, Last active: 2026-01-15 10:57:30.456
session_12346 - Created: 2026-01-15 10:56:20.789, Last active: 2026-01-15 10:57:15.234
# Статистика транзакций с временными метками
futriix:~> stats transactions
=== Transaction Statistics ===
Total transactions: 150
Committed: 145 (96.7%)
Aborted: 5 (3.3%)
Average duration: 234 ms
Min duration: 45 ms
Max duration: 1523 ms
Transactions by hour:
10:00 - 11:00: 45 transactions
11:00 - 12:00: 52 transactions
12:00 - 13:00: 38 transactions
```
<p align="right">(<a href="#readme-top">К началу</a>)</p> <p align="right">(<a href="#readme-top">К началу</a>)</p>
@@ -2814,7 +2775,7 @@ futriix:~> doc compression employees 550e8400-e29b-41d4-a716-446655440000
- [x] Реализовать поддержку триггеров (обратных вызовов) - [x] Реализовать поддержку триггеров (обратных вызовов)
- [x] Реализовать поддержку многопоточности - [x] Реализовать поддержку многопоточности
- [x] Реализовать неблокирующие чтение/запись - [x] Реализовать неблокирующие чтение/запись
- [x] Реализовать неблокирующие транзакции - [x] Реализовать неблокирующие batch-команды (аналог batch в субд Valkey)
- [x] Реализовать constraints (Ограничения) - [x] Реализовать constraints (Ограничения)
- [x] Реализовать мульти-мастер асинхронную репликацию через файл конфигурации - [x] Реализовать мульти-мастер асинхронную репликацию через файл конфигурации
- [x] Реализовать логирование для субд - [x] Реализовать логирование для субд
@@ -2832,7 +2793,6 @@ futriix:~> doc compression employees 550e8400-e29b-41d4-a716-446655440000
- [x] Библиотека "raft-boltdb" заменить на встроенное файловое хранилище - [x] Библиотека "raft-boltdb" заменить на встроенное файловое хранилище
- [x] Реализовать уникальные и составные индексы - [x] Реализовать уникальные и составные индексы
- [x] Реализовать временные метки для основных объектов субд (таппл, коллекция, документ, поле, индекс, транзакция, ACL, узел кластера) - [x] Реализовать временные метки для основных объектов субд (таппл, коллекция, документ, поле, индекс, транзакция, ACL, узел кластера)
- [x] Оптимизировать транзакции под высокие нагрузки (Реализовать: Пакетную запись WAL - вместо синхронной записи каждой операции, используется асинхронная запись пакетами по 100 записей, Буферизацию записей - 64KB буфер для WAL записей, Периодическую синхронизацию - синхронизация с диском каждые 5 секунд вместо каждой записи, Чекпоинты - периодическое создание контрольных точек состояния, Атомарные операции - использование atomic.Value и sync.Map для wait-free доступа)
- [x] Реализовать MVCC версионирование - поддержка множественных версий документов - [x] Реализовать MVCC версионирование - поддержка множественных версий документов
- [x] Реализовать временные метки для объектов субд (Ограничений, Импорта-Экспорта, Триггеров, Lua-плагинов) - [x] Реализовать временные метки для объектов субд (Ограничений, Импорта-Экспорта, Триггеров, Lua-плагинов)
- [x] Реализовать обработку состояний "split-brain" - [x] Реализовать обработку состояний "split-brain"
@@ -2852,12 +2812,11 @@ futriix:~> doc compression employees 550e8400-e29b-41d4-a716-446655440000
- [x] Реализовать Distributed Transactions - двухфазный коммит для распределённых транзакций - [x] Реализовать Distributed Transactions - двухфазный коммит для распределённых транзакций
- [x] Реализовать Deadlock Detection - циклический детектор дедлоков с таймаутами (DFS по графу ожидания) - [x] Реализовать Deadlock Detection - циклический детектор дедлоков с таймаутами (DFS по графу ожидания)
- [x] Реализовать Transaction Timeout - настраиваемый таймаут для долгих транзакций - [x] Реализовать Transaction Timeout - настраиваемый таймаут для долгих транзакций
- [x] Реализовать Savepoints - точки сохранения внутри транзакции для частичного отката
- [x] Вынести настройи настройки MVCC,WAL и настройки плагинов из исходного кода проекта в файл конфигурации "config.toml" - [x] Вынести настройи настройки MVCC,WAL и настройки плагинов из исходного кода проекта в файл конфигурации "config.toml"
- [x] Реализовать выделение жирным шифтом все информационные сообщения в скриптах сборки - [x] Реализовать выделение жирным шифтом все информационные сообщения в скриптах сборки
- [x] Реализовать ограничения на количество создаваемых Lua-состояний в плагинах - [x] Реализовать ограничения на количество создаваемых Lua-состояний в плагинах
- [x] Реализовать WAL recovery сделать асинхронным для ускорения скорости работы субд - [x] Реализовать WAL recovery сделать асинхронным для ускорения скорости работы субд
- [x] Реализовать SAGA c оркестратором (Распределённые транзакции) - [x] Реализовать SAGA c оркестратором (Распределённые batch)
- [x] Голосование узлов перед коммитом в протоколе Raft - [x] Голосование узлов перед коммитом в протоколе Raft
- [x] Реализовать автоматическое масштабирование - [x] Реализовать автоматическое масштабирование
- [x] Реализовать TLS, backpressure - [x] Реализовать TLS, backpressure