13 KiB
13 KiB
Архитектура 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:
- Лексер (
query/lexer.nim): Токенизация входных данных в 80+ типов токенов - Парсер (
query/parser.nim): Рекурсивный нисходящий парсер, создающий AST - AST (
query/ast.nim): 300+ строк, покрывающих 25+ видов узлов - IR (
query/ir.nim): Промежуточное представление для планов выполнения - Оптимизатор (
query/adaptive.nim): Адаптивная кросс-модальная оптимизация запросов - Кодоген (
query/codegen.nim): Трансляция IR в операции хранилища - Исполнитель (
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
Ключевые архитектурные решения
- Чистый Nim: Без Cython, Python или Rust зависимостей
- Унифицированное хранилище: Один движок для KV, графов, векторов, FTS и колоночного
- Встраиваемый режим: Может работать как библиотека или сервер
- Бинарный протокол: Кастомный эффективный wire протокол
- MVCC: Многоверсионное управление параллелизмом
- Схема-первый: Строго типизированная система схем с наследованием
- Кросс-модальность: Единый язык запросов для всех моделей данных
- Формальная верификация: Основные распределённые алгоритмы специфицированы в 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 │
└─────────────┘