zhizhi/grid-db/docs/architecture.md

171 lines
4.4 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.

# Grid-DB 架构设计文档
> 项目编号PRJ-GDB-001
> 版权:国作登字-2026-A-00037559
> 版本v0.1.0 · Phase 0
> 签发AG-SY-01 霜砚 · 执行AG-ZY-01 铸渊
---
## 1. 本体论锚定 [ONT-PATCH-006]
### Grid-DB · 纸 · 格子 · 笔迹
**Grid-DB = 纸**
笔需要纸来承载笔迹。Grid-DB 是纸。纸上有格子(格点),每个格子是最小寻址单元。
纸不属于笔,纸属于写字的人。
**格点 = 格子**
格子是纸上的最小单元。不同的格子存不同的数据。
同一个格子可以有多层raw → cleaned → indexed → semantic
**事件 = 笔迹**
每写一笔,笔迹就留在了历史中,不可篡改。
天眼通过观察笔迹,发现异常行为。
### 与 EXE-Engine 的关系
| 层 | 组件 | 职责 | 本体论 |
|---|---|---|---|
| 执行层 | EXE-Engine | 模型调度、任务编排、算力路由 | 笔 |
| 存储层 | Grid-DB | 数据持久化、格点索引、事件流 | 纸 |
| 采集层 | DC v1.0 | 外部数据采集与清洗 | 墨水收集器 |
---
## 2. 核心组件
### 2.1 GridCell — 格点数据模型
文件:`src/core/grid-cell.js`
四元组寻址:`(namespace, grid_x, grid_y, layer)`
- **namespace** — 隔离不同 Agent / 项目的数据域
- **grid_x / grid_y** — 坐标轴
- **layer** — 数据层级raw → cleaned → indexed → semantic
支持:
- JSON 序列化 / 反序列化
- 二进制 Buffer 编解码(用于页存储)
- 键生成(`toKey()` → `ns:x:y:layer`
- 曼哈顿距离计算
### 2.2 WAL — Write-Ahead Log
文件:`src/storage/wal.js`
所有写操作先追加到 WAL 文件,崩溃后可从 WAL 恢复。
记录格式:
```
[length:4][seqNo:4][op:1][keyLen:2][key:N][dataLen:4][data:M][checksum:4]
```
操作码:
- `0x01` = PUT
- `0x02` = DELETE
特性:
- 追加写入 + fsync 保证持久化
- XOR 校验和验证完整性
- 支持截断checkpoint 后清除已持久化记录)
- 崩溃恢复:重新打开时自动读取并恢复
### 2.3 PageManager — 页管理器
文件:`src/storage/page-manager.js`
以固定大小页(默认 4096 字节)为最小 I/O 单位。
文件结构:
```
[Header: 1 page] [Page 1] [Page 2] ... [Page N]
```
Header 页:`[magic:4][version:2][pageSize:4][pageCount:4][freeListHead:4]`
数据页:`[flags:1][nextFree:4][dataLen:4][data:N]`
特性:
- 空闲链表管理:释放的页自动回收复用
- 持久化:重新打开文件后数据完好
- 文件格式验证magic number `0x47444230` = 'GDB0'
### 2.4 EventLog — 事件溯源日志
文件:`src/events/event-log.js`
Phase 0内存事件流保留最近 1000 条)
Phase 1持久化事件流 + 回放 + 订阅
每次写操作生成事件:
```json
{
"eventId": "evt-xxxx",
"seqNo": 1,
"timestamp": "2026-03-26T13:00:00Z",
"namespace": "exe-engine",
"operation": "put",
"gridCellKey": "exe-engine:1:2:raw",
"payload": { "dataSize": 256 }
}
```
支持订阅回调,可被天眼系统监听。
### 2.5 GridAPI — 统一接口
文件:`src/api/grid-api.js`
协调 WAL、PageManager、EventLog 协同工作。
```javascript
const { open } = require('./grid-db/src/index');
const db = open({ dataDir: './my-data' });
// put
db.put('my-ns', { gridX: 1, gridY: 2, layer: 'raw' }, { hello: 'world' });
// get
const data = db.get('my-ns', { gridX: 1, gridY: 2, layer: 'raw' });
// scan
const results = db.scan('my-ns', { xRange: [0, 10], yRange: [0, 10], layer: 'raw' });
// delete
db.delete('my-ns', { gridX: 1, gridY: 2, layer: 'raw' });
// subscribe
db.subscribe('auditor', (event) => console.log(event));
// checkpoint (truncate WAL)
db.checkpoint();
db.close();
```
---
## 3. 技术栈
| 层 | 选型 | 理由 |
|---|---|---|
| 语言 | Node.js 20 | 与 EXE-Engine 同栈 |
| 持久化 | 自研 (.gdb/.wal) | 零外部依赖,嵌入式 |
| 序列化 | JSON + Binary Buffer | JSON 调试友好Buffer 高性能 |
| 测试 | 自定义 assert runner | 与 EXE-Engine 测试框架统一 |
---
## 4. Phase 路线
| Phase | 目标 | 状态 |
|---|---|---|
| P0 基础骨架 | GridCell + WAL + PageManager + EventLog + GridAPI | 🟢 完成 |
| P1 索引与查询 | B+Tree + Namespace 隔离 + 范围扫描 + Event 持久化 | ⚪ 待开始 |
| P2 高级特性 | HNSW 向量索引 + EXE-Engine 对接 + DC 迁移 + 天眼审计 | ⚪ 待开始 |
| P3 生产就绪 | 性能基准 + 资源计量 + 全文索引 + 文档 | ⚪ 待开始 |