InfraGuard

存储与 RAID

只读实时看板,展示 RAID 控制器健康状况(Optimal/Degraded/Failed)、物理磁盘图,以及各主机数据卷的磁盘使用率。

概述 — 这个页面做什么

基础设施 ▸ 存储与 RAID(/infra/storage)是一个只读的可用性看板,把每台主机的存储健康状况汇聚到同一个屏幕上。它把两类遥测数据组装成卡片。

其核心目的是磁盘故障的早期预警。当 RAID 阵列跌落为 Degraded,或某块物理磁盘变为 Failed/Missing 时,颜色(琥珀色/红色)会立刻让它显现出来,让您能够在第二块磁盘也损坏、整个阵列崩溃之前完成更换与重建。

本页面只覆盖实时状态(此刻的健康状况)。存储的资产台账(设备元数据、容量规划、文件区域树)归 资产 ▸ 存储与文件 所有。二者是有意分开的(参见数据来源)。

何时使用

布局

主区 · 控制栏

存储卡片

每台主机渲染一张卡片。

区域 内容
页眉 主机名 · 最后更新时间 · RAID 汇总徽标(status_summary)
使用率 DATA VOL usage 标签 + 百分比 + (used / available) + 进度条
控制器 图标 + 型号 · 温度 · 电池状态
逻辑卷 name (RAID level) + 状态 / size
物理磁盘图 插槽小标签(S-{slot} + 容量),按状态着色,工具提示为 model · serial · status

若没有控制器信息,卡片显示 No controller data;若一张卡片都没有,则显示 No storage data.。列表按每页 10 条分页。

状态配色规则

RAID 汇总 · 逻辑卷状态(raid_tone):

包含 颜色 含义
optimal good(绿色) 健康
degrad warn(琥珀色) 降级 — 一块磁盘已损坏,需要重建
fail crit(红色) RAID 故障 — 数据处于风险中
其他 muted(灰色) 未知

物理磁盘状态(disk_tone):

包含 颜色 含义
online / optimal good 健康
rebuild warn 正在重建
fail / missing crit 已损坏/已掉盘
其他 muted 未知

磁盘使用率(usage_tone):

使用率 颜色
≥ 95% crit
≥ 80% warn
< 80% good

使用方法

  1. 从菜单打开 基础设施 ▸ 存储与 RAID。
  2. 用顶部的主机筛选聚焦到某一台服务器,或查看 All。
  3. 先扫视每张卡片页眉上的 RAID 徽标,优先处理琥珀色/红色的卡片。
  4. 在有问题的卡片上,阅读物理磁盘图,找出哪个插槽处于 Failed/Missing/Rebuild。把鼠标悬停在小标签上可看到型号与序列号的工具提示。
  5. 查看使用率条,判断数据卷是否正在逼近 80%/95% 的阈值。
  6. 如果数据看起来已经陈旧,点击右上角的刷新。

本页面不会自动轮询。展示的数据会经过服务端 30 秒缓存,只有当您按下刷新按钮(会重新查询 /infra/storage/live)时屏幕才会更新。若让它一直开着观察趋势,请定期按刷新。

数据来源

两张表都来自遗留 MySQL(legacy 连接,只读)。应用从不写入它们。

表 内容 供给方
storage_status host、status_summary、json_data(controllers/logical_volumes/disks)、created_at sync_adp.js(Adaptec arcconf)
server_status df-* part 快照 → 磁盘使用率 run_report.js

json_data 的结构(示例)

{
  "controllers": [
    {
      "model": "Adaptec ASR-5805",
      "temperature": "41C",
      "battery_status": "Optimal",
      "status": "Optimal",
      "logical_volumes": [
        { "name": "Data", "raid_level": "6", "status": "Optimal", "size": "10.9TB" }
      ],
      "disks": [
        { "slot": 0, "status": "Online", "model": "ST4000NM0033", "serial": "Z1Z00000", "size": "3.6TB" }
      ]
    }
  ]
}

df-* 的取值结构

server_status.value 是一段 JSON,携带 p(百分比)· u(已用)· a(可用)。

{ "p": 72, "u": "7.2T", "a": "2.8T" }

主机 ↔ 别名映射

使用率是通过一张静态映射表关联的:从 storage_status.host(大写标签)映射到 server_status.server_alias(小写)。映射表中不存在的主机,退回使用小写化的主机名。

host alias host alias
AMBER am ART art
MEDIA media BUD bud
ARCH1 arch1 GLORY glory
SOL sol DOCU documents
BLUE blue DNS_SERVER demo

seq 窗口查询 — 避免慢扫描

server_status 是一张大型时间序列表。用 MAX(seq) … GROUP BY server_alias, part 聚合整张表会触发全表扫描。构建器(StorageStatusService::dfUsageByAlias)改为只通过索引取出最近的 3 个 seq 值,然后仅读取这些 seq 中的 df-* 行。

-- 1) 最近的 3 个 seq 值(seq 索引 → O(log N))
SELECT DISTINCT seq FROM server_status ORDER BY seq DESC LIMIT 3;

-- 2) 仅取这些 seq 中的 df-* 行(由旧到新,后者胜出)
SELECT server_alias, part, value
  FROM server_status
 WHERE seq IN (?, ?, ?) AND part LIKE 'df-%'
 ORDER BY seq;

对每个别名优先取 df-data part;若不存在,则以使用率最高的卷(p 最大者)作为代表值。

最新的 RAID 行同样会收窄为每台主机的最新一行。

SELECT MAX(id) AS mid FROM storage_status GROUP BY host;   -- 每台主机的最新一行
SELECT * FROM storage_status WHERE id IN (?, ...) ORDER BY host;

结果以键 infr:infra:storage:v1 缓存 30 秒。这样可以抑制对遗留库的往返查询,并吸收并发访问。如果遗留库不可达,构建器会吞掉异常并返回空数组,因此页面会优雅降级为 No storage data.。

访问权限

排障与常见问题

Q. 卡片显示出来了,但使用率(DATA VOL)是空的。 该主机的 alias 在最近的 seq 窗口内没有匹配到任何 df-* 数据。请确认该节点上 run_report.js 正在运行,并且主机↔别名映射正确。该映射是一张静态映射表,与 管理 ▸ 采集器 中的 run_report 配置是分开的。

Q. 磁盘图/控制器显示“No controller data”。 storage_status.json_data 的 controllers 数组为空,或解析失败。该主机可能没有 Adaptec RAID,或者 sync_adp.js(arcconf)采集正在失败。请检查 arcconf 的路径与权限。

Q. 所有内容都显示“No storage data.”。 遗留库连接失败,或 storage_status 中没有任何行。构建器在异常时返回空数组。请核验 legacy 连接(.env 的 DB_*)以及采集器的健康状况。

Q. 数值和几分钟前一模一样。 (1) 本页面不会自动轮询 — 请按刷新。(2) 服务端缓存有效期为 30 秒。(3) 从根本上说,采集器(sync_adp.js、run_report.js)在 Laravel 之外按计划运行,因此数据源的新鲜度取决于 cron 的执行周期。

Q. 出现了 Degraded 徽标 — 我该怎么办? 在物理磁盘图中找到处于 Failed/Missing 的插槽,更换该磁盘,并确认控制器已开始自动 Rebuild。重建期间阵列对双盘故障很脆弱,因此也请一并核验您的备份态势(备份 ▸ 计划看板)。

相关内容

스토리지 · RAID 건전성
스토리지 · RAID 건전성