三层存储韧性
wesgine Cell 的三层 SQLite 数据库韧性架构。
三层分离
每个 Cell 维护三个独立的 SQLite 数据库文件:
| 层 | 文件 | 内容 | 损坏影响 |
|---|---|---|---|
| meta.db | 元数据层 | Cell 配置、Agent 配置 | 配置丢失,可重建 |
| state.db | 运行时状态层 | Run traces、Observe 数据、Cron 状态 | 历史数据丢失 |
| sessions.db | 会话层 | 消息、Memory、Sessions | 对话历史丢失 |
单层损坏不扩散(INV-RESIL-03)
sessions.db 损坏不影响 memory/observe。
state.db 损坏不影响 sessions。
三层物理独立,一层损坏时其他层继续工作。
Boot 永远成功(INV-RESIL-01)
Cell Boot 永远成功。无论何种数据损坏,Boot 都返回 nil error。
降级是合法状态。唯一的 boot 失败是 ErrCellLocked(进程竞争,非数据问题)。
进程排他锁(INV-RESIL-04)
同一 Cell 同一时刻只有一个写入者。
.cell.lock 使用 flock 实现进程级排他。
快照与备份
快照验证(INV-RESIL-05)
每次快照后立即 PRAGMA quick_check。
损坏快照丢弃,不写入目标。
Journal 只追加(INV-RESIL-06)
Journal 文件没有 seek/truncate,只有 O_APPEND 写入。
损坏文件保留(INV-RESIL-07)
损坏 DB 归档到 corrupt/ 目录供诊断,不直接删除。
SQLite 安全配置
mmap 禁用(INV-RESIL-08)
PRAGMA mmap_size=0
消除整类 SQLITE_IOERR_MMAP 故障。
VACUUM 禁止自动(INV-RESIL-09)
VACUUM 中断 = 全损。
只在 SQLiteBackup(VACUUM INTO)中使用。
迁移全幂等(INV-RESIL-10)
任何迁移重跑 N 次结果一致。
含多语句 ADD COLUMN 场景。
SQLite Backup
resilience.SQLiteBackup() 使用 VACUUM INTO 实现原子快照。
不使用 cp 拷贝 .db 文件——忽略 -wal / -shm 会导致数据不一致。