Files
Baradb/docs/ru/architecture.md

13 KiB
Raw Permalink Blame History

Архитектура 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   │
                     └─────────────┘