Update README.md
This commit is contained in:
1 parent
a373f05b18
commit
6b9ee6b3d2
1 file changed
+79
-120
@@ -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
|
||||||
|
|||||||
Reference in new issue
Block a user