Files
Baradb/docs/ru/architecture.md
T

197 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Архитектура BaraDB
## Обзор
BaraDB — это **мультимодальный движок баз данных** на языке Nim, объединяющий документное (KV), графовое, векторное, колоночное хранилище и полнотекстовый поиск в едином движке с унифицированным языком запросов **BaraQL**.
## Слоёвая архитектура
```
┌─────────────────────────────────────────────────────────┐
│ 1. СЛОЙ КЛИЕНТА │
│ Бинарный протокол │ HTTP/REST │ WebSocket │ Встраивание│
├─────────────────────────────────────────────────────────┤
│ 2. СЛОЙ ЗАПРОСОВ (BaraQL) │
│ Лексер → Парсер → AST → IR → Оптимизатор → Кодоген │
├─────────────────────────────────────────────────────────┤
│ 3. ДВИЖОК ВЫПОЛНЕНИЯ │
│ Документы │ Граф │ Векторы │ Колоночный │ FTS │
├─────────────────────────────────────────────────────────┤
│ 4. ХРАНИЛИЩЕ │
│ LSM-Tree │ B-Tree │ WAL │ Bloom │ Компактификация │ Cache│
├─────────────────────────────────────────────────────────┤
│ 5. РАСПРЕДЕЛЁННОСТЬ │
│ Raft │ Шардирование │ Репликация │ Gossip │
└─────────────────────────────────────────────────────────┘
```
## Слой 1: Клиентский слой
Несколько протоколов связи:
- **Бинарный протокол** (`protocol/wire.nim`): Эффективный бинарный протокол в big-endian с 16 типами сообщений
- **HTTP/REST** (`core/httpserver.nim`): JSON-based REST API с многопоточностью
- **WebSocket** (`core/websocket.nim`): Полнодуплексная потоковая передача
- **Встраиваемый режим** (`storage/lsm.nim`): Прямой доступ внутри процесса
### Управление соединениями
- **Пул соединений** (`protocol/pool.nim`): Мин/макс лимиты соединений с таймаутом простоя
- **Ограничение скорости** (`protocol/ratelimit.nim`): Token-bucket глобальные и пери-клиент лимиты
- **Аутентификация** (`protocol/auth.nim`): JWT с HMAC-SHA256 и ролевой доступ
- **TLS/SSL** (`protocol/ssl.nim`): TLS 1.3 с автогенерируемыми сертификатами
## Слой 2: Слой запросов (BaraQL)
Конвейер BaraQL:
1. **Лексер** (`query/lexer.nim`): Токенизация входных данных в 80+ типов токенов
2. **Парсер** (`query/parser.nim`): Рекурсивный нисходящий парсер, создающий AST
3. **AST** (`query/ast.nim`): 300+ строк, покрывающих 25+ видов узлов
4. **IR** (`query/ir.nim`): Промежуточное представление для планов выполнения
5. **Оптимизатор** (`query/adaptive.nim`): Адаптивная кросс-модальная оптимизация запросов
6. **Кодоген** (`query/codegen.nim`): Трансляция IR в операции хранилища
7. **Исполнитель** (`query/executor.nim`): Выполнение планов с параллелизацией
### Кросс-модальное планирование
Оптимизатор (`query/adaptive.nim`) определяет порядок выполнения между движками:
```
1. Оценить селективность каждого предиката
2. Направить наиболее селективный предикат в его движок первым
3. Использовать bloom-фильтры для KV поисков
4. Параллелизовать независимые ветви
5. Потоковая передача результатов для избежания материализации
```
## Слой 3: Движок выполнения
### Документный/KV движок
- **LSM-Tree** (`storage/lsm.nim`): Хранилище с оптимизацией записи с MemTable, WAL, SSTables
- **B-Tree индекс** (`storage/btree.nim`): Упорядоченный индекс для диапазонных сканирований с COW
### Векторный движок (`vector/`)
- **HNSW индекс** (`vector/engine.nim`): Иерархический навигируемый граф малого мира
- **IVF-PQ индекс** (`vector/engine.nim`): Инвертированный файловый индекс с продуктовым квантованием
- **SIMD операции** (`vector/simd.nim`): AVX2-оптимизированные вычисления расстояний
- **Квантование** (`vector/quant.nim`): Скалярное, продуктовое и бинарное квантование
### Графовый движок (`graph/`)
- **Список смежности** (`graph/engine.nim`): Граф с рёберными весами
- **Алгоритмы** (`graph/engine.nim`): BFS, DFS, Dijkstra, PageRank
- **Обнаружение сообществ** (`graph/community.nim`): Алгоритм Louvain
- **Сопоставление шаблонов** (`graph/community.nim`): Изоморфизм подграфов
- **Cypher парсер** (`graph/cypher.nim`): Cypher-подобные графовые запросы
### Полнотекстовый поиск (`fts/`)
- **Инвертированный индекс** (`fts/engine.nim`): Терм-документ индекс
- **Ранжирование** (`fts/engine.nim`): BM25 и TF-IDF scoring
- **Нечёткий поиск** (`fts/engine.nim`): Сопоставление по расстоянию Левенштейна
- **Многоязычность** (`fts/multilang.nim`): Токенизаторы для EN, BG, DE, FR, RU
### Колоночный движок (`core/columnar.nim`)
- Поколоночное хранение для аналитических запросов
- RLE и словарное кодирование
- SIMD-ускоренные агрегаты
## Слой 4: Хранилище
- **LSM-Tree** (`storage/lsm.nim`): MemTable, WAL, SSTable, Bloom Filter, Компактификация
- **Page Cache** (`storage/compaction.nim`): LRU кэш с отслеживанием hit rate
- **Memory-mapped I/O** (`storage/mmap.nim`): mmap-based доступ к файлам
- **Восстановление** (`storage/recovery.nim`): WAL replay и восстановление после сбоев
### Путь записи
```
Клиент → Протокол → Auth → Парсер → AST → IR → Кодоген
→ StorageOp → MVCC Txn → WAL Write → MemTable → Commit
```
### Путь чтения
```
Клиент → Протокол → Auth → Парсер → AST → IR → Кодоген
→ StorageOp → MVCC Snapshot → MemTable → SSTable → Result
```
## Слой 5: Распределённость
- **Raft Consensus** (`core/raft.nim`): Лидер-выборы, репликация лога
- **Шардирование** (`core/sharding.nim`): Hash, range и consistent hashing
- **Репликация** (`core/replication.nim`): Sync, async, semi-sync режимы
- **Gossip протокол** (`core/gossip.nim`): SWIM-like управление членством
- **Распределённые транзакции** (`core/disttxn.nim`): Two-phase commit
## Ключевые архитектурные решения
1. **Чистый Nim**: Без Cython, Python или Rust зависимостей
2. **Унифицированное хранилище**: Один движок для KV, графов, векторов, FTS и колоночного
3. **Встраиваемый режим**: Может работать как библиотека или сервер
4. **Бинарный протокол**: Кастомный эффективный wire протокол
5. **MVCC**: Многоверсионное управление параллелизмом
6. **Схема-первый**: Строго типизированная система схем с наследованием
7. **Кросс-модальность**: Единый язык запросов для всех моделей данных
8. **Формальная верификация**: Основные распределённые алгоритмы специфицированы в TLA+ и проверены с TLC
## Статистика по модулям
| Категория | Модули | Строк кода | Назначение |
|----------|---------|------------|------------|
| Core | 16 | ~4,200 | Сервер, протоколы, транзакции, распределённость |
| Storage | 7 | ~3,100 | LSM, B-Tree, WAL, bloom, компактификация, mmap |
| Query | 7 | ~2,800 | Лексер, парсер, AST, IR, оптимизатор, кодоген, исполнитель |
| Vector | 3 | ~1,200 | HNSW, IVF-PQ, квантование, SIMD |
| Graph | 3 | ~1,000 | Список смежности, алгоритмы, обнаружение сообществ |
| FTS | 2 | ~900 | Инвертированный индекс, BM25, нечёткий, многоязычный |
| Protocol | 7 | ~2,400 | Wire, HTTP, WebSocket, пул, auth, rate limit, SSL |
| Schema | 1 | ~600 | Типы, связи, наследование, миграции |
| Client | 2 | ~800 | Nim binary клиент, файловые хелперы |
| CLI | 1 | ~400 | Интерактивная BaraQL оболочка |
| **Всего** | **49** | **~14,100** | |
## Диаграммы потока данных
### Простой запрос
```
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│ Client │───→│ Lexer │───→│ Parser │───→│ IR │───→│ Codegen│
└────────┘ └────────┘ └────────┘ └────────┘ └───┬────┘
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
│ Result │←───│ Format │←───│ Execute│←───│ Storage│←──────┘
└────────┘ └────────┘ └────────┘ └────────┘
```
### Кросс-модальный запрос
```
┌─────────────┐
│ Parser │
└──────┬──────┘
┌──────▼──────┐
│ Adaptive │
│ Optimizer │
└──────┬──────┘
┌───────────────┼───────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Vector │ │ Graph │ │ FTS │
│ Engine │ │ Engine │ │ Engine │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└───────────────┼───────────────┘
┌──────▼──────┐
│ Join │
│ & Sort │
└──────┬──────┘
┌──────▼──────┐
│ Result │
└─────────────┘
```