OpenLava 完全入门(五):生产部署与运维实战

OpenLava 完全入门(五):生产部署与运维实战

摘要:前面四篇讲了功能和用法,这一篇讲生产环境怎么管。内容涵盖:集群高可用(Master 主备切换)、监控告警(Prometheus + Grafana)、日志管理、性能调优、常见故障排查(LIM 失联、作业卡死、调度慢)、集群扩容缩容、备份恢复、安全加固。最后附上生产环境 Checklist。掌握这些,你就是合格的 OpenLava 运维负责人。

这是 OpenLava 系列的最后一篇,讲生产运维干货。


零、读前必看

0.1 适合谁

  • ✅ 负责维护 OpenLava 集群的运维/系统工程师
  • ✅ 集群已经在跑,想知道怎么管得稳
  • ✅ 想把测试集群升级为生产集群

0.2 你将学到

主题 重点
高可用 Master 主备切换、LIM 选主机制
监控告警 指标采集、Grafana 看板、常见告警规则
日志管理 日志种类、轮转、集中收集
性能调优 调度参数、网络优化、文件系统
故障排查 8 类常见问题 + 排查思路
扩容缩容 加节点 / 减节点流程
备份恢复 配置备份、作业数据备份、灾备
安全加固 用户权限、网络、审计

一、高可用架构

1.1 为什么需要高可用

单 Master 节点的 OpenLava 集群有单点故障:Master 挂了 → 整个集群不能提交新作业、调度停了。

生产环境必须做主备。

1.2 OpenLava 的高可用机制

OpenLava 内置了 LIM 选主机制:

       ┌─────────────┐
       │  master01   │  ← 当前 Master(Active)
       │  (lim +     │
       │   mbatchd)  │
       └──────┬──────┘
              │
       ┌──────┴──────┐
       │  master02   │  ← 备节点(Standby)
       │  (lim)      │
       └─────────────┘
              │
     计算节点连接到 Active Master

工作原理

  1. 所有节点的 LIM 互相通信
  2. 配置文件里指定哪些是 Master 候选节点
  3. 当前 Master 挂了,备用 LIM 自动选举出新的 Master
  4. mbatchd 跟着在新 Master 上启动

1.3 配置高可用

1.3.1 修改 lsf.cluster

Begin   ClusterAdmins
Administrators = lsf
End     ClusterAdmins

Begin   Master
# 候选 Master 列表,排在前面的优先级高
master01  master02
End     Master

Begin   Host
HOSTNAME   model    type    server  r1m  mem    swp    RESOURCES
master01   IntelI7  linux   1       3.5  32G    64G    (mg master candidate)
master02   IntelI7  linux   1       3.5  32G    64G    (mg master candidate)
compute01  IntelI7  linux   1       3.5  64G    128G   (compute)
compute02  IntelI7  linux   1       3.5  64G    128G   (compute)
compute03  IntelI7  linux   1       3.5  64G    128G   (compute)
End     Host
**关键**:`Begin Master / End Master` 段列出候选 Master 节点。

1.3.2 共享存储

Master 上的关键数据需要两台都能访问:

数据 建议方案
$LSF_ENVDIR 配置文件 NFS / rsync 同步
$LSF_LOGDIR 日志 本地(各记各的)
$LSB_SHAREDIR 作业数据 必须共享(NFS)
# lsf.conf 里配置
LSB_SHAREDIR=/opt/openlava/share
# 这个目录必须放在共享存储上(NFS / NAS)

LSB_SHAREDIR 存的是:

  • 作业历史数据(lsb.acctlsb.events
  • 正在运行的作业状态
  • mbatchd 的状态文件
**没有共享存储的后果**:主备切换后,mbatchd 丢失作业状态,正在运行的作业信息全没了。

1.4 验证主备切换

# 1. 看当前 Master
lsid
# My cluster name is openlava
# My master name is master01

# 2. 模拟主节点宕机(在 master01 上执行)
lsadmin limshutdown

# 3. 在备节点或任意节点看新 Master
lsid
# My master name is master02   ← 切过去了

# 4. 恢复 master01
lsadmin limstartup
# master01 起来后会接管(因为列表里排在前面)

1.5 高可用最佳实践

建议 说明
Master 节点不跑业务作业 MXJ=0,避免作业负载影响调度
两台 Master 配置一样 硬件规格、OS 版本、OpenLava 版本都一致
配置共享存储 LSB_SHAREDIR 必须在共享存储上
VIP(可选) 用 Keepalived 配虚拟 IP,用户不用感知切换
定时验证主备切换 每月演练一次,别等真挂了才发现切不过去

二、监控告警

2.1 监控什么

层级 监控项 告警阈值参考
系统层 CPU、内存、磁盘、网络 磁盘 > 85%、内存 > 90%
服务层 LIM、sbatchd、mbatchd、mbschd 进程存活 进程挂了立即告警
集群层 可用节点数、空闲槽位数 可用节点 < N-1、槽位利用率 > 95%
作业层 PEND 作业数、失败作业率、长作业 PEND > 阈值、失败率 > 10%
调度层 调度延迟、调度周期 调度延迟 > 60s

2.2 用命令行监控

日常巡检用这些命令:

# 1. 集群状态
lsid                     # 当前 Master、集群名
bparams                  # batch 参数

# 2. 主机状态
bhosts                   # 主机槽位使用
lsload                   # 主机负载
lshosts                  # 主机属性

# 3. 队列状态
bqueues                  # 队列使用情况
bqueues -l               # 详细

# 4. 作业状态
bjobs -u all             # 所有作业
bjobs -sum -u all        # 汇总统计
bjobs -p -u all | wc -l  # PEND 作业数

# 5. 用户使用
busers                   # 用户 FairShare 使用
bacct -u all -d          # 昨日作业统计

# 6. 调度器状态
badmin showstatus        # mbatchd 状态

2.3 Prometheus + Grafana 监控

推荐用 openlava_exporter(社区有开源实现),核心指标:

# 核心指标(示例)
openlava_nodes_total{status="ok"}           # 在线节点数
openlava_nodes_total{status="unavail"}      # 失联节点数
openlava_slots_total                        # 总槽位数
openlava_slots_used                         # 已用槽位数
openlava_jobs_total{status="RUN"}           # RUN 作业数
openlava_jobs_total{status="PEND"}          # PEND 作业数
openlava_jobs_total{status="EXIT"}          # 失败作业数
openlava_queue_slots_used{queue="normal"}   # 队列槽位使用

2.4 关键告警规则

# 1. Master 节点宕机
- alert: MasterDown
  expr: openlava_master_status == 0
  for: 1m
  severity: critical

# 2. 计算节点失联 > 1
- alert: ComputeNodeDown
  expr: openlava_nodes_total{status="unavail"} > 1
  for: 5m
  severity: warning

# 3. PEND 作业太多
- alert: TooManyPendingJobs
  expr: openlava_jobs_total{status="PEND"} > 100
  for: 10m
  severity: warning

# 4. 槽位利用率过高
- alert: SlotUtilizationHigh
  expr: openlava_slots_used / openlava_slots_total > 0.95
  for: 30m
  severity: warning

# 5. 作业失败率高
- alert: HighJobFailureRate
  expr: rate(openlava_jobs_total{status="EXIT"}[1h]) / rate(openlava_jobs_total[1h]) > 0.1
  for: 1h
  severity: warning

# 6. 磁盘满
- alert: DiskAlmostFull
  expr: node_filesystem_avail_bytes / node_filesystem_size_bytes < 0.15
  for: 5m
  severity: warning

2.5 日常巡检脚本

写个脚本每天早上自动发巡检报告:

#!/bin/bash
# /opt/openlava/scripts/daily_check.sh

echo "========== OpenLava 每日巡检报告 =========="
echo "时间: $(date)"
echo

echo "--- 集群信息 ---"
lsid

echo
echo "--- 节点状态 ---"
bhosts

echo
echo "--- 队列状态 ---"
bqueues

echo
echo "--- 作业统计 ---"
echo "RUN:  $(bjobs -r -u all 2>/dev/null | wc -l)"
echo "PEND: $(bjobs -p -u all 2>/dev/null | wc -l)"
echo "SUSP: $(bjobs -s -u all 2>/dev/null | wc -l)"

echo
echo "--- TOP 5 用户(按运行作业数)---"
bjobs -u all 2>/dev/null | awk 'NR>1 {print $2}' | sort | uniq -c | sort -rn | head -5

三、日志管理

3.1 日志种类

日志文件 位置 内容 谁写的
lim.log. $LSF_LOGDIR LIM 日志(资源采集、选主) LIM
mbatchd.log $LSB_SHAREDIR/log mbatchd 日志(作业接收、调度) mbatchd
mbschd.log $LSB_SHAREDIR/log 调度器日志(调度决策) mbschd
sbatchd.log. $LSF_LOGDIR sbatchd 日志(本地作业管理) sbatchd
res.log. $LSF_LOGDIR res 日志(执行代理) res
lsb.acct $LSB_SHAREDIR/log 作业记账日志 mbatchd
lsb.events $LSB_SHAREDIR/log 作业事件流 mbatchd
# 查看日志目录
echo $LSF_LOGDIR
ls -la $LSF_LOGDIR

3.2 常用排错日志

问题 看哪个日志
节点失联 lim.log.
作业调度异常 mbatchd.log / mbschd.log
作业执行失败 sbatchd.log. / res.log.
主备切换 两个节点的 lim.log
作业历史分析 lsb.acct

3.3 日志轮转

日志文件会越来越大,必须配置轮转:

# /etc/logrotate.d/openlava
/opt/openlava/log/*.log /opt/openlava/share/log/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    copytruncate
    dateext
}
**关键参数**:
- `copytruncate`:先复制再清空,不用重启进程
- `rotate 30`:保留 30 天
- `compress`:压缩老日志

3.4 日志集中收集

生产环境建议把日志集中到 ELK / Loki:

计算节点日志 → Filebeat → Elasticsearch → Kibana
                              ↑
                         Master 日志

关键查询

  • level:ERROR:所有错误
  • lim:LIM 相关日志
  • mbatchd:调度相关
  • job exit:作业异常退出

四、性能调优

4.1 调度参数调优

lsb.params 里的关键参数:

Begin   Parameters
MBD_SLEEP_TIME         = 10    # mbatchd 调度间隔(秒),默认 60,调低响应更快
SBD_SLEEP_TIME         = 7     # sbatchd 汇报间隔
JOB_SCHEDULING_INTERVAL = 30   # 作业调度间隔
MAX_RSCHED_TIME        = 60    # 单次调度最长时间
CONCURRENT_QUERY_MAX   = 50    # 并发查询数
End     Parameters

调小 MBD_SLEEP_TIME:调度更频繁,短作业响应更快。但 Master CPU 消耗增加。

调大 MBD_SLEEP_TIME:Master 负载低,但调度延迟高。

**经验值**:
- 小集群(< 50 节点):`MBD_SLEEP_TIME = 10`
- 中集群(50-200 节点):`MBD_SLEEP_TIME = 20`
- 大集群(> 200 节点):`MBD_SLEEP_TIME = 30-60`

4.2 LIM 采集间隔

lsf.conf 里:

LSF_LIM_INTERVAL = 30    # LIM 采集间隔(秒)
LSF_SBD_INTERVAL = 30    # sbatchd 心跳间隔

4.3 网络优化

优化项 建议
Master 和计算节点用同一网段 减少延迟
万兆网络 节点间数据传输快
网卡绑定(bonding) 高可用 + 带宽
TCP 参数调优 net.core.somaxconn = 1024

4.4 文件系统优化

目录 建议
LSB_SHAREDIR NAS / 分布式存储(不能是本地盘)
作业工作目录 NFS / Lustre / GPFS(共享 + 高性能)
tmp 目录 本地 SSD(临时文件读写快)
日志目录 本地盘(避免网络影响日志写入)

4.5 Master 节点资源

Master 节点规格建议:

集群规模 CPU 内存 磁盘
< 50 节点 8 核 16G 200G SSD
50-200 节点 16 核 32G 500G SSD
> 200 节点 32 核 64G 1T SSD
Master 是调度大脑,**不能省资源**。CPU 不够 → 调度慢 → 作业排队多。

五、常见故障排查

5.1 节点失联(unavail)

# 现象
bhosts
# compute01    unavail  ...

# 排查步骤
# 1. 网络通不通
ping compute01
ssh compute01 hostname

# 2. 进程在不在
ssh compute01 ps aux | grep lim

# 3. 看日志
ssh compute01 tail -100 $LSF_LOGDIR/lim.log.compute01

# 4. 重启 LIM
lsadmin limrestart compute01
badmin hrestart compute01

常见原因

  • 机器宕机 / 网络断了
  • LIM 进程异常退出
  • /etc/hosts 改了,主机名解析不对
  • 时间不同步(NTP 挂了)

5.2 作业一直 PEND

# 第一步:看 PEND 原因
bjobs -p <jobid>

# 第二步:看节点资源
bhosts
lsload

# 第三步:看队列限制
bqueues -l <queue>

# 第四步:看调度日志
tail -f $LSB_SHAREDIR/log/mbschd.log

常见原因

原因 排查
槽位不够 bhosts 看 NJOBS / MAX
资源不足 bjobs -p 看需求,lsload 看实际
队列上限 bqueues -l 看 QJOB_LIMIT
用户上限 busers 看 UJOB_LIMIT
依赖没满足 bjobs -l 看依赖条件
调度窗口没到 队列的 DISPATCH_WINDOW

5.3 作业 RUN 但没输出

# 1. 看作业有没有真在跑
bpeek -f <jobid>

# 2. 进节点看进程
ssh <exec_host> ps aux | grep <jobname>

# 3. 看 sbatchd 日志
ssh <exec_host> tail -100 $LSF_LOGDIR/sbatchd.log.<host>

常见原因

  • 程序卡死(死循环 / 等 IO)
  • 输出缓冲没刷新(加 stdbuf -oL 或 fflush)
  • 挂在某个等待上(等 license、等文件锁)

5.4 作业 EXIT 异常退出

# 1. 看退出码
bjobs -l <jobid> | grep Exit_code

# 2. 看错误输出
cat <job_err_file>

# 3. 看作业历史
bhist -l <jobid>

退出码速查

退出码 含义
0 正常结束(DONE 状态)
1 程序错误(通用失败)
130 被 Ctrl+C / SIGINT 杀掉
137 bkill -r / SIGKILL 杀掉
139 段错误(Segfault)
143 被 SIGTERM 杀掉(正常 bkill)
-10 / 138 被 bkill(SIGBUS 等)

5.5 Master 切换后调度不工作

# 1. 确认新 Master
lsid

# 2. mbatchd 起来了吗
ps aux | grep mbatchd

# 3. 看 mbatchd 日志
tail -100 $LSB_SHAREDIR/log/mbatchd.log

# 4. 手动重配置
badmin reconfig

常见原因

  • LSB_SHAREDIR 共享目录没挂载上
  • 新 Master 上的 mbatchd 启动失败
  • 配置文件不完整(没同步过来)

5.6 调度变慢

# 1. 看 Master CPU
top  # 看 mbatchd / mbschd CPU 使用率

# 2. 看调度周期
# mbschd.log 里每次调度的耗时

# 3. 看作业总数
bjobs -u all | wc -l

常见原因

  • Master CPU 不够
  • 作业量太大(几千个 PEND 作业)
  • 资源需求太复杂(导致调度计算慢)
  • 日志盘 I/O 慢

5.7 数据不完整 / 作业历史丢失

# 检查 lsb.acct 文件
ls -la $LSB_SHAREDIR/log/lsb.acct*

# 检查 lsb.events
ls -la $LSB_SHAREDIR/log/lsb.events*

常见原因

  • 磁盘满了(日志轮转失败,写不进去)
  • 共享存储断了
  • 手动删了日志

5.8 用户提交作业报权限错

# 1. 用户在不在允许列表里
bqueues -l <queue> | grep USERS

# 2. 用户在 lsf.users 里吗
cat $LSF_ENVDIR/lsf.users

# 3. 看 mbatchd 日志
grep <user> $LSB_SHAREDIR/log/mbatchd.log | tail -20

六、集群扩容缩容

6.1 加计算节点

# ===== 新节点上操作 =====

# 1. 基础配置(hostname / hosts / NTP / 关防火墙 / 创建 lsf 用户)
# (参考第一篇)

# 2. 安装 OpenLava(从现有节点 scp 过去)
scp -r master:/opt/openlava /opt/
chown -R lsf:lsf /opt/openlava

# 3. 配置环境变量
scp master:/etc/profile.d/openlava.sh /etc/profile.d/
source /etc/profile.d/openlava.sh

# 4. 挂载 NFS(如果有)
echo "master:/home/lsf  /home/lsf  nfs  defaults  0 0" >> /etc/fstab
mount -a

# ===== Master 上操作 =====

# 5. 修改 lsf.cluster,加入新节点
vi $LSF_ENVDIR/lsf.cluster.openlava
# 在 Host 段加一行:
# compute04  IntelI7  linux  1  3.5  64G  128G  (compute)

# 6. 修改 lsb.hosts
vi $LSF_ENVDIR/lsb.hosts
# 加一行:compute04  8  -  ()  1.00

# 7. 重新加载配置
lsadmin reconfig
badmin reconfig

# 8. 在新节点启动服务
ssh compute04 "su - lsf -c 'lsadmin limstartup && lsadmin resstartup && badmin hstartup'"

# 9. 验证
bhosts compute04
lsload compute04

6.2 减计算节点

# 1. 关闭节点(不再接新作业)
badmin hclose compute04

# 2. 等现有作业跑完(或手动杀掉)
badmin -m compute04 bjobs   # 看上面还有没有作业

# 3. 停服务
badmin hshutdown compute04
lsadmin limshutdown compute04
lsadmin resshutdown compute04

# 4. 从配置里移除(可选)
# vi lsf.cluster.openlava
# vi lsb.hosts
# lsadmin reconfig
# badmin reconfig
**安全下线**:先 `hclose` 不接新作业,等老作业跑完再停机,不要直接拔电源。

七、备份与恢复

7.1 什么需要备份

内容 频率 保留时长
配置文件($LSF_ENVDIR 每天 / 每次修改 30 天
作业数据($LSB_SHAREDIR 每天 90 天
日志文件 每天 30 天
用户数据(家目录) 每天 按业务要求

7.2 备份脚本

#!/bin/bash
# /opt/openlava/scripts/backup.sh
BACKUP_DIR=/data/backup/openlava
DATE=$(date +%Y%m%d_%H%M)

mkdir -p $BACKUP_DIR

# 1. 配置文件
tar czf $BACKUP_DIR/config_$DATE.tar.gz -C /opt/openlava etc/

# 2. 作业数据
tar czf $BACKUP_DIR/share_$DATE.tar.gz -C /opt/openlava share/

# 3. 删除 30 天前的备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete

echo "Backup completed: $DATE"

加到 crontab:

0 2 * * * /opt/openlava/scripts/backup.sh >> /var/log/openlava_backup.log 2>&1

7.3 恢复流程

# 1. 停掉所有服务
lsadmin limshutdown all
badmin hshutdown all

# 2. 恢复配置
tar xzf config_YYYYMMDD_HHMM.tar.gz -C /opt/openlava

# 3. 恢复作业数据
tar xzf share_YYYYMMDD_HHMM.tar.gz -C /opt/openlava

# 4. 重启服务
lsadmin limstartup
badmin hstartup

# 5. 验证
lsid
bhosts
bqueues

八、安全加固

8.1 用户权限

措施 说明
限制 badmin 用户 只有集群管理员能执行 badmin
队列级用户控制 USERS 参数限制谁能提交
项目级控制 -P project 分类计费
禁止 root 提交 一般不让 root 直接跑作业

8.2 网络安全

措施 说明
防火墙限制 只开放必要端口(6881、6882 等)
内网部署 计算节点不接公网
SSH 加固 计算节点只允许特定 IP 登录

8.3 审计

# lsb.acct 记录了所有作业,可以做审计
# 谁、什么时候、跑了什么、用了多少资源

# 月度审计示例
bacct -u all -b "2024:01:01" -e "2024:01:31" > jan_usage.txt

九、生产环境 Checklist

部署到生产前,逐项打勾:

架构

  • [ ] Master 节点 HA(至少 2 台候选)
  • [ ] LSB_SHAREDIR 在共享存储上
  • [ ] NTP 时间同步(所有节点)
  • [ ] DNS / hosts 解析正确

资源

  • [ ] Master CPU/内存足够
  • [ ] 计算节点资源规划合理(CPU/内存比例)
  • [ ] 共享存储容量满足需求

监控

  • [ ] 基础监控(CPU/内存/磁盘/网络)
  • [ ] OpenLava 服务监控(LIM/mbatchd 进程)
  • [ ] 关键告警(节点宕机、PEND 堆积、磁盘满)
  • [ ] 日常巡检脚本 / 报表

安全

  • [ ] 防火墙配置
  • [ ] 管理员用户受限
  • [ ] 队列用户权限划分
  • [ ] 审计日志开启

运维

  • [ ] 备份脚本(配置 + 数据 + 日志)
  • [ ] 备份恢复演练过
  • [ ] 主备切换演练过
  • [ ] 扩容缩容流程文档化
  • [ ] 故障排查 SOP 文档

十、写在最后

五篇 OpenLava 教程到这里就结束了。回顾一下整个系列:

  1. 入门篇 — 认识 OpenLava + 从零部署
  2. 作业管理篇 — bsub / bjobs / bkill 等核心命令
  3. 队列资源篇 — 队列配置 + 自定义资源 + -R 表达式
  4. 高级功能篇 — 并行 / 依赖 / 数组 / FairShare
  5. 生产运维篇 — HA / 监控 / 调优 / 排错 / 备份

从"是什么"到"怎么用"再到"怎么管",一条线走下来。

OpenLava 是一个功能完整且稳定的开源调度系统,EDA、渲染、科研计算等场景用它完全够用。社区虽然不如 Slurm 活跃,但胜在 LSF 兼容、上手简单、运维成本低。

生产环境真正的挑战不在于功能,而在于:

  • 监控够不够完善(出事了能不能第一时间知道)
  • 排查流程清不清晰(出问题了能不能快速定位)
  • 文档完不完备(换人了能不能接手)

把这三件事做好,集群就稳了。


本系列五篇全部完成。你觉得哪一篇最有用?有没有想深入了解的话题? 评论区告诉我。

OpenLava #LSF #高可用 #监控 #运维 #故障排查 #HPC #生产环境

发表回复

后才能评论