三层存储韧性

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 会导致数据不一致。