diff --git a/README.md b/README.md index e8a6d72..3d70706 100644 --- a/README.md +++ b/README.md @@ -627,6 +627,43 @@ futriix:~> db.startSession() В субд **futriix** для обеспечения надёжности (durability) и быстрого восстановления бд из резевной копии, реализована полноценная поддержка WAL (Write-Ahead Logging). Журнал WAL по умолчанию хранится в файле **futriix.wal**, находящимся в каталоге **futriix**, а также поддержка ACID-транзакций с MVCC (Multi-Version Concurrency Control). Доступны команды startSession(), startTransaction(), commitTransaction(), abortTransaction() с восстановлением после сбоев через журнал предзаписи. +# Матрица гарантий согласованности Futriix + +| Операция | Уровень изоляции | Поведение при нормальной работе | Поведение при сетевых сбоях | Восстановление после сбоя | +|----------|------------------|--------------------------------|----------------------------|---------------------------| +| **Чтение (Read)** | **Read Committed** + MVCC | • Чтение всегда возвращает только закоммиченные данные
• MVCC предоставляет снапшот на момент начала чтения
• Используется Visibility Map для быстрого доступа к версиям
• Кеширование через ReadTimestampCache | • При потере соединения - операция повторяется автоматически (идиемпотентность)
• Если узел недоступен - запрос перенаправляется к реплике (Raft)
• Чтение из кэша возможно при недоступности основного узла | • После восстановления узла - чтение продолжается с момента прерывания
• WAL не требуется для чтения (только для записи)
• Снапшоты MVCC восстанавливаются из documentVersions | +| **Запись (Write)** | **Read Committed** | • Запись сначала сохраняется в WAL (атомарно)
• Затем применяется к in-memory структурам
• Индексы обновляются атомарно с документом
• Атомарное обновление метаданных коллекции | • Если WAL запись не подтверждена - операция не применяется
• При сбое до коммита - данные не теряются (WAL)
• При потере лидера (Raft) - запись перенаправляется к новому лидеру
• Используется fsync для гарантии записи на диск | • После восстановления - запись повторяется из WAL
• Автоматическое применение WAL при загрузке
• Консистентность через LSN (Log Sequence Number)
• Segmented WAL позволяет восстанавливать частичные записи | +| **Транзакция (BEGIN...COMMIT)** | **Read Committed / Repeatable Read** (MVCC) | • Транзакция атомарна: все или ничего
• MVCC предоставляет снапшот на момент начала транзакции
• Операции внутри транзакции изолированы
• Savepoints для частичного отката
• Deadlock detection с автоматическим abort-ом | • При сбое в середине транзакции - автоматический откат
• WAL гарантирует восстановление закоммиченных транзакций
• 2PC для распределённых транзакций с таймаутом (10 сек)
• Prepared транзакции автоматически откатываются при таймауте | • Асинхронное восстановление из WAL
• Восстановление только закоммиченных транзакций
• Pending 2PC транзакции проверяются на таймаут
• Recovery Manager обрабатывает записи параллельно | +| **Индексация** | **Read Committed** | • Индексы обновляются атомарно с документом
• Уникальные индексы проверяются перед вставкой
• Индексы хранятся в sync.Map (wait-free)
• Поддержка составных индексов | • Индексы восстанавливаются из данных при загрузке
• При сбое - индексы перестраиваются автоматически
• Консистентность через LSN
• Уникальные индексы проверяются при восстановлении | • Индексы перестраиваются из документов при старте
• WAL содержит операции обновления индексов
• Автоматическое восстановление целостности индексов
• Проверка дубликатов при восстановлении уникальных индексов | +| **Удаление (Delete)** | **Read Committed** | • Soft delete сохраняет данные (метка deleted_at)
• Удаление из индексов происходит атомарно
• Физическое удаление - только после подтверждения
• Атомарное обновление счётчиков | • При сбое - операция повторяется из WAL
• Soft delete защищает от потери данных
• Окончательное удаление - после подтверждения всеми репликами
• Permanent delete требует подтверждения | • Soft delete записи восстанавливаются из WAL
• Permanent delete повторяется из WAL
• Счётчики документов восстанавливаются атомарно | +| **Репликация (Raft)** | **Linearizable** (для записей) / **Read Committed** (для чтений) | • Записи проходят через Raft-журнал
• Линейная консистентность для записей
• Чтения могут быть из реплик (Read Committed)
• Автоматическое переизбрание лидера | • При сбое лидера - автоматический выбор нового (Raft)
• Запросы перенаправляются к новому лидеру
• Данные согласованы через журнал Raft
• Read-запросы могут обслуживаться репликами | • Raft журнал восстанавливается из WAL
• Новый лидер применяет все закоммиченные записи
• Реплики синхронизируются с лидером
• Автоматическое восстановление кластера | +| **Шардирование (Range Shards)** | **Read Committed** | • Диапазонные шарды с динамическим сплитом/мерджем
• Данные распределены по диапазонам ключей
• Предсказуемая нагрузка на узлы
• Возможность предварительного добавления узлов под горячие диапазоны | • При сбое узла - шард перераспределяется
• Данные реплицируются для отказоустойчивости
• Автоматический сплит при переполнении шарда
• Мердж при уменьшении нагрузки | • Шарды восстанавливаются из чекпоинтов
• WAL применяется к каждому шарду
• Балансировка после восстановления
• Автоматическое перераспределение | +| **Checkpoint / Snapshot** | **Read Committed** | • Периодическое сохранение снапшотов (каждые 5 мин)
• Атомарная запись с временным файлом
• Контрольная сумма для верификации
• Сжатие снапшотов (gzip)
• Хранение последних N чекпоинтов | • При сбое во время создания - временный файл удаляется
• Предыдущий чекпоинт остаётся целым
• Атомарное переименование гарантирует целостность
• WAL LSN сохраняется в чекпоинте | • Загрузка из последнего валидного чекпоинта
• Применение WAL после чекпоинта
• Проверка контрольной суммы при загрузке
• Автоматическое восстановление из чекпоинта | +| **WAL (Write-Ahead Log)** | **Persistent** | • Все записи сначала идут в WAL
• Segmented WAL с ротацией (64 MB)
• Пакетная запись с fsync
• CRC32 для верификации целостности
• Асинхронная запись с буферизацией | • При сбое - WAL сохраняет все записи
• fsync гарантирует запись на диск
• Segments позволяют восстанавливать частичные данные
• Индекс LSN для быстрого поиска | • Полное восстановление из WAL
• Асинхронный Recovery Manager
• Параллельное применение записей (4 воркера)
• Восстановление 2PC транзакций | +| **2PC (Distributed Transactions)** | **Read Committed** | • Двухфазный коммит для распределённых транзакций
• Состояния: Active → Prepared → Committed/Aborted
• Координатор отслеживает статус узлов
• Таймаут Prepared транзакций (10 сек) | • При сбое координатора - транзакция в Prepared состоянии
• Автоматический откат по таймауту
• Узлы могут завершить транзакцию автономно
• Pending транзакции сохраняются в WAL | • Восстановление pending 2PC транзакций
• Проверка таймаута при старте
• Автоматический откат просроченных транзакций
• Голосование узлов для завершения | +| **Deadlock Detection** | **N/A** | • Обнаружение циклических ожиданий
• Автоматический abort одной из транзакций
• Периодическая проверка (каждую секунду)
• Поддержка распределённых deadlock-ов | • При сетевых задержках - возможны ложные срабатывания
• Abort транзакции с последующим повтором
• Распределённый deadlock detection через координатор | • Deadlock граф восстанавливается из активных транзакций
• Автоматическое разрешение при старте
• Логирование deadlock-ов для анализа | +| **MVCC (Multi-Version Concurrency Control)** | **Repeatable Read** (внутри транзакции) | • Каждая запись хранит несколько версий
• Чтение получает версию на момент начала транзакции
• Автоматическая очистка старых версий (каждые 5 мин)
• Хранение до 100 версий на документ
• Retention: 7 дней | • Версии сохраняются в памяти и WAL
• При сбое - версии восстанавливаются из WAL
• Visibility Map ускоряет проверку видимости
• ReadTimestampCache для быстрого доступа | • Версии восстанавливаются из WAL записей
• Автоматическая очистка устаревших версий
• Восстановление Visibility Map
• Кеш перестраивается при загрузке | + +### Условные обозначения: + +| Символ | Значение | +|--------|----------| +| ✅ **Гарантировано** | Операция гарантирует консистентность при любых условиях | +| ⚠️ **Частично** | Требует дополнительных проверок или имеет ограничения | +| 🔄 **Автоматически** | Восстановление происходит без вмешательства пользователя | +| 📊 **Настраивается** | Поведение можно настроить через конфигурацию | + +## Ключевые гарантии: + +1. **ACID**: Все операции соответствуют ACID благодаря WAL + MVCC + 2PC +2. **Durability**: fsync + WAL гарантируют сохранность данных +3. **Consistency**: Чекпоинты + контрольные суммы + верификация +4. **Isolation**: MVCC + Read Committed + Repeatable Read внутри транзакций +5. **Availability**: Raft + репликация + автоматическое переизбрание лидера +6. **Partition Tolerance**: 2PC + таймауты + автоматический откат + + + > [!TIP] > WAL- это журнал предзаписи транзакций, который в субд **futriix** выполняет следующие действия: > 1. Хранит все операции транзакций до их фиксации (INSERT, UPDATE, DELETE)