04 / resilience

断连,
不该等于失忆

连续一天连不上中心,本地节点就在暂存的数据上,一小批一小批地自己整理;满五天还没恢复,就先把自己当中心用。 中心回来以后,两边按固定顺序合回去:推上去 → 送回去 → 确认 → 拉快照,一步都不能跳。 只有最后一步成功、本地那份还在,才删掉暂存。

断一天 / 断五天 pending.db dr/ 每小时自备份 没确认就不删
01

把网线拔掉试试

断开中心,然后推进时间。状态名、暂存行数和自备份计数都按真实状态机走; 数值仅作示范,不代表线上读数。

edge recollect-node
primary hub
0 小时连不上 正常同步
0h
24h · 断满一天
120h · 断满五天

第一步:先断开和中心的连接

node status 正常同步
self_distillfalse
pending_turns0
staging_rows0
dr_backup_count0
replica/只读 · 字节不动
auto_unlocktrue
00
正常同步 connected
正常同步;失败的同步不进暂存。
01 · 24h
本地整理中 offline_distilling
在本地暂存上小批小批地整理;只读副本一个字节不动。
02 · 120h
脱离中心,继续整理 detached_distilling
自备份成功后才进下一态;没确认的备份永远不删。
03
自己当中心 detached_promoted
自己当中心;等确认并回之后,才允许清理旧备份。
04
已并回 rejoined
四步全部走完,暂存才允许删。
02

并回去只有一种顺序

先把本机新写的行推上去(push),再把离线期间攒的行送回去(rows),中心确认之后才拉新快照(pull)。 前一步失败,后一步就不做,本地那份也不删;下一轮把同一批再送一次,中心认得出来,不会写重。 读会话也一样:中心不可达就回落本机,回执里标 source=local + degraded,不把本机结果冒充中心结果。

step 01
push
把本机新写的内容推给中心;失败就先停下。
step 02
rows
把离线期间攒的行送回去;中心答 200(成功)才进下一步。
step 03
确认
同一批送两次也只算一次,不会写重。
step 04
pull
拉回新快照;成功了、本地那份还在,才删暂存。
401 / 403 / 409 不是断网。401/403 是没资格或被拒,409 是两边版本对不上;当成断网会误触本地整理。
1 天 / 5 天 两个关口都按「连续连不上」累计,不是数失败了几次。
0 字节 断网期间只读副本不动;本地整理只写 pending.db 和 dr/。
03

备份只管一件事:追平

备份按复制序号一条条追。落后就追;缺条目就报「不可用 + 缺口」,不拿旧内容冒充。 追平并核对通过,才允许接班。

hub backup · 读数口径三件套
项目值说明
hub backup原始对话 · 记忆 · 清单三件一起写,保留最近 7 组;清单带版本和进度
hub restore三步不带 --confirm 只做检查;恢复时把抽取进度退回清单上的位置
dr/每小时脱离中心(断满五天)之后才启动;当前副本 + 暂存 + 原始对话 + 状态
未确认的自备份永不删除并回原中心、确认之后,才允许清理
备份里的私钥不含明文hub key export 单独加密归档;doctor 只报指纹