SOP — LSF 记账/事件日志纳入 EFK 采集¶
主题目录:
lsf-logdir-20261001/| 状态:已实施并验证通过(2026-10-01 23:00) | 2026-10-01 被改工程:monitoring-p2-20261001(EFK 日志聚合与黑盒探测)
1. 背景¶
日志覆盖面盘点发现 LSF 集群日志完全未进 EFK(mbatchd/sbatchd/egos 关键词全为 0)。定位后确认三件事:
- 真实 logdir =
/data/nfs/lsf/lsf/work/lsfce/logdir/(由mbatchd的/proc/<pid>/fd实证,非猜路径); - 模板里的
/data/nfs/lsf/*/logdir/*.log双重不匹配:通配层级少一层、且目标文件无.log后缀(lsb.acct/lsb.events)——从未采到任何数据; - 该承载路径
/data/nfs/lsf是 nfs4 共享挂载(192.168.31.249:/data/nfs/lsf),被 6 台(lsf.23–.27+ hpc-submit.28)同时挂载、内容字节级相同——即模板那条通配一旦将来匹配成功,就是 6 倍重复。
2. 目标¶
| # | 可验证状态 |
|---|---|
| G1 | 14 台配置中只有 lsf-master-01(.23) 含 host-lsf-logdir 段;只有 hpc-submit(.28) 含 host-vnc 段 |
| G2 | 数据面 log_source:lsf_logdir 的文档只来自 lsf-master-01 |
| G3 | 模板中原 /data/nfs/lsf/*/logdir/*.log 条目消失(消除潜在重复源) |
| G4 | main.py deploy 复跑一次零变更、全跳过(幂等) |
3. 前置条件¶
- 本机:工程
.venv、SSH 凭据(共享库处理)、~/.kube/config; - ES 可查:
set -a; . ~/.secrets/efk.env; set +a(不要cat该文件); - 变更前备份:见第 7 章。
4. 影响范围¶
| 项 | 说明 |
|---|---|
| 涉及主机 | 全部 14 台。原因:本次同时删除了 host-domain 段里那条无效的 NFS 路径、并新增了段注释,host-domain 是共享段 → 所有主机渲染结果都变 |
| 是否停服 | 否。filebeat 重启期间该主机日志秒级断流(seek: tail 不补历史) |
| 业务影响 | 无(filebeat 不参与计算);执行于 23:00,无作业 |
| 数据面变化 | 新增 log_source=lsf_logdir(约 381 条,体量 104 KB 全量);log_source=domain 不变(slurm) |
| K8s 侧 | 不受影响(DaemonSet 与 ConfigMap 未动) |
5. 分步操作¶
实现体:monitoring-p2-20261001/modules/host_filebeat.py。以下为等价操作序列。
5.1 备份¶
cd ~/Documents/k8s_ins
TS=20261001-225850 # 实际执行时的时间戳
mkdir -p lsf-logdir-20261001/backup/monitoring-p2-20261001/{artifacts,modules}
cp monitoring-p2-20261001/artifacts/filebeat-host.yml.tpl \
lsf-logdir-20261001/backup/monitoring-p2-20261001/artifacts/filebeat-host.yml.tpl.bak.$TS
cp monitoring-p2-20261001/modules/host_filebeat.py \
lsf-logdir-20261001/backup/monitoring-p2-20261001/modules/host_filebeat.py.bak.$TS
chmod 600 lsf-logdir-20261001/backup/monitoring-p2-20261001/*/*.bak.$TS
预期:5287 B / 14924 B 两个 .bak;已登记 backup/README.md。
5.2 模板:删错路径 + 新增单点采集段¶
artifacts/filebeat-host.yml.tpl:
- 从
host-domain段的paths中删除- /data/nfs/lsf/*/logdir/*.log(G3); - 其后新增
host-lsf-logdir段,包在# >>> host-lsf-logdir >>>/# <<< host-lsf-logdir <<<之间:
- type: filestream
id: host-lsf-logdir
enabled: true
paths:
- /data/nfs/lsf/lsf/work/lsfce/logdir/lsb.acct
- /data/nfs/lsf/lsf/work/lsfce/logdir/lsb.*events
fields: { cluster: __CLUSTER__, role: __ROLE__, host_name: __HOST_NAME__, log_source: lsf_logdir }
fields_under_root: true
prospector.scanner.check_interval: 30s
为什么写 lsb.*events 而不是 *.log:实测目标文件是 lsb.events/lsb.jobinfo.events/lsb.ncb.events(无 .log 后缀);lsb.*events 恰好覆盖三者,且不会匹配锁文件 #lsb.event.lock。
5.3 渲染:剥离机制由单段通用化为多段¶
modules/host_filebeat.py——把原先只处理 vnc 的常量改为段表,render_config() 遍历剥离:
ROLE_GATED_BLOCKS = (
("# >>> host-vnc >>>", "# <<< host-vnc <<<", {"submit"}),
("# >>> host-lsf-logdir >>>", "# <<< host-lsf-logdir <<<", {"master-primary"}),
)
# render_config(): for begin, end, roles in ROLE_GATED_BLOCKS:
# out = self._strip_block(out, begin, end, keep=(node["role"] in roles))
_strip_vnc_block() 更名为通用 _strip_block(text, begin, end, keep),逻辑不变:标记行对所有主机都去掉,故非保留主机的渲染结果与裁剪前逐字节一致。
坑:keep 表现为 skip = not keep——若写成 skip = True,连保留主机也会被整段删掉(vnc 那轮本地自测抓到过,见 vnc-dedup-20261001/SOP.md)。
5.4 本地自测(不上机)¶
对 18 个节点字典逐个渲染并断言(脚本见会话记录):保留 host-vnc 的只有 hpc-submit;保留 host-lsf-logdir 的只有 lsf-master-01;YAML 全部可解析。实测:符合预期 0 异常。
5.5 上机收敛¶
cd ~/Documents/k8s_ins/monitoring-p2-20261001
.venv/bin/python main.py precheck
.venv/bin/python main.py deploy --dry-run
.venv/bin/python main.py deploy
预期:14 台全部 write-config,start-service、失败 0。
6. 验证¶
实测结果(2026-10-01 23:00–23:02)¶
| # | 检查 | 实测 |
|---|---|---|
| V1 | 配置面 | ✅ lsfdir=1 仅 .23;vnc=1 仅 .28;14 台 filebeat=active |
| V2 | 旧路径残留 | ✅ .16/.28 实际 paths 中 /data/nfs 条目 0;.23 的 2 条为新段自身的两条路径 |
| V3 | 数据面 | ✅ lsf_logdir 381 条,全部来自 lsf-master-01(lsb.events 341 + lsb.acct 40) |
| V4 | 幂等 | ✅ 23:01:48 复跑:14 台全部 -> OK(无 actions)、失败 0 |
| V5 | 漂移 | ✅ main.py drift rc=0、无漂移输出 |
收敛动作:14 台 write-config,start-service;汇总「14 台处理,失败 0 台」;黑盒探测 10 目标失败 0。
7. 回滚¶
失败判据(任一达标即回滚):任一主机 filebeat 非 active;.23 未出现 host-lsf-logdir;V3 的文档来自非 .23 主机。
cd ~/Documents/k8s_ins/monitoring-p2-20261001
cp ../lsf-logdir-20261001/backup/monitoring-p2-20261001/artifacts/filebeat-host.yml.tpl.bak.20261001-225850 \
artifacts/filebeat-host.yml.tpl
cp ../lsf-logdir-20261001/backup/monitoring-p2-20261001/modules/host_filebeat.py.bak.20261001-225850 \
modules/host_filebeat.py
.venv/bin/python main.py deploy # 14 台恢复旧配置(重新引入那条无效路径)
回滚后验证:V1 中 lsfdir 全为 0、14 台 active、main.py deploy 复跑零变更。
备份位置:本主题 backup/(见 lsf-logdir-20261001/backup/README.md)。
8. 风险说明¶
| 风险 | 缓解 |
|---|---|
lsb.events 是滚动/累积文件,filebeat 首次会全量读入(约 79 KB) |
体量可控,实测仅 381 条文档;后续按增量采集 |
误采 #lsb.event.lock(锁文件) |
路径用 lsb.*events,不匹配 # 开头文件 |
| 该目录位于 NFS 共享 → 多台重复 | ROLE_GATED_BLOCKS 限定仅 master-primary;V3 以"文档只来自一台"作为硬判据 |
| 14 台重启造成秒级日志断流 | 选无作业时段执行;断流窗口最小化 |
| 文档与代码再次漂移 | 模板注释、本文、工程 SOP §9.5 三处同步说明"必须单点采集" |
附录 A:交付物清单¶
| 文件 | 说明 |
|---|---|
SOP.md |
本文件 |
backup/README.md |
两个源码备份的台账与回滚依据 |
附录 B:本次未做¶
- Lustre 日志:服务端无独立日志文件(走内核 → 已由 journald 采集),无需新增;
- EDA 作业日志:位于用户作业目录、量大且属用户数据,须先定范围与脱敏策略,另行立项。
来源:
/home/rain/Documents/k8s_ins/lsf-logdir-20261001/SOP.md| 最后更新:2026-10-01 23:02(由build/sync.py同步,请勿在站点侧修改)