在 clustervps 多台 Mac 上跑 OpenClaw,控制面故事常被讲得很长,真正打穿值班的往往是:JSONL 洪峰、logrotate 与进程句柄不同步,以及 inode 先于字节见底。本文把「多节点合并、多路切片、落盘配额、Webhook 失败摘要广播」压成一套可演练的 HowTo,并附轮转与磁盘排障清单。
与「按 AZ 拆网关」「按租户拆片段」两篇正交:前者管入口与令牌,后者管配置边界与金丝雀;本篇只管观测落盘形态与失败噪声的形状。上线前请交叉阅读 《多可用区网关、探针合并与 Webhook》、《租户拆分与 Doctor 合并》 以及 《片段模板合并与金丝雀工作流》,避免把日志配额误配在仍热加载的路径上。
多路切片矩阵(谁写哪棵树)
原则:一路进程一类 append-only 根,再按 JOB_ID / 日期分子目录;合并层只读各节点产物写聚合 JSON,禁止三进程争用同一 JSONL 文件句柄。
| 组件 | 建议根路径切片 | 轮转键 |
|---|---|---|
| gateway | …/logs/gateway/<AZ>/,按请求链路与 trace id 分文件 |
按日 + 单文件字节上限;TLS 握手失败单独文件,便于 digest。 |
| worker | …/logs/worker/<queue>/,每作业独立子树 |
队列深度大时改 按大小 轮转优先于按日,降低峰值同时 rename 风险。 |
| notifier | …/logs/notifier/,只写聚合与广播副本 |
保留代数最少、窗口最短;广播失败应进入 digest,而非原始堆栈洪流。 |
合并对账:各节点在本地生成「片段合并 + Doctor」后的就绪 JSON,计算 sha256;编排侧只比较哈希与 digest 字段,避免把整份 YAML 打进 Slack。
最小可复现六步
- 目录落地:创建三路根路径与
promotions.jsonl审计目录,权限收敛为服务账户只写自有树。 - 合并预演:在金丝雀节点跑片段合并与
doctor --json,把输出路径写进单元化 systemd/launchd 单元,避免热加载目录与日志根重叠。 - 轮转策略:为每路配置 logrotate:
daily或size、rotate N;若用copytruncate,必须在postrotate触发进程 USR1 重开 或等价信号,否则会出现双文件写入或丢行。 - 配额与告警:对日志卷配置软阈值(仅告警)+ 硬上限(拒纳新作业);探针同时抓
df -h与df -i,JSONL 高频场景常 inode 先红。 - digest 槽位:在合并就绪 JSON 增加
webhook_digest(近五分钟聚类计数 + 首末时间戳),由 notifier 回填;LB 只读布尔门闩「digest 非空即降权」。 - 广播演练:人为制造 429/5xx,确认 fleet 频道只收到短摘要,且轮转后无重复投递;记录回滚:恢复上一代 symlink + LB 权重。
排障清单:轮转、磁盘、inode
- 轮转疑似双写:核对是否 copytruncate 与未重开句柄并存;短期改为
create+ 进程自身 reopen;检查postrotate退出码。 - 磁盘余量正常但仍 ENOSPC:跑
df -i;若 inode 使用率 >85%,先合并小文件、提高单文件轮转阈值或外迁冷 JSONL。 - 空间与索引背离:APFS 本地快照占逻辑空闲;结合
tmutil listlocalsnapshots与备份策略审阅,避免「df 好看但写入失败」。 - Webhook 广播风暴:关原始正文广播,只保留 digest;检查网关侧速率限制与 notifier 退避是否一致。
把上述检查项粘进值班手册:每条附负责人、命令、期望输出,演练季度跑一次,成本远低于一次跨区事故复盘。
可引用阈值与采购引导
可引用信息:单路 JSONL 建议单文件 ≤256MB 即轮转;全集群保留代数 N≤14 与近线对象存储二选一;inode 黄线 80%、红线 90% 与字节水位同屏展示。
需要对称节点与统一磁盘档位把日志扇出摊薄时,请直接使用本站公开页完成决策:价格 透明、购买 流程可免登录浏览;规格与 SLA 说明见 帮助。选定套餐后尽早加节点,比事后压缩 JSONL 更便宜。
本文为运维向指引。 OpenClaw 具体发行版与网关热重载边界以官方说明为准;文中路径与阈值为团队常用启发式,请在预发验证后写入你们自己的版本化 runbook。