跳转至

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)。定位后确认三件事:

  1. 真实 logdir = /data/nfs/lsf/lsf/work/lsfce/logdir/(由 mbatchd 的 /proc/<pid>/fd 实证,非猜路径);
  2. 模板里的 /data/nfs/lsf/*/logdir/*.log 双重不匹配:通配层级少一层、且目标文件无 .log 后缀(lsb.acct / lsb.events)——从未采到任何数据;
  3. 该承载路径 /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:

  1. 从 host-domain 段的 paths 中删除 - /data/nfs/lsf/*/logdir/*.log(G3);
  2. 其后新增 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 同步,请勿在站点侧修改)