主备管理
更新时间:2025/7/28
在Gitcode上查看源码

本文主要描述如何基于openUBMC完成主备管理功能的配置。

openUBMC 主备管理用于对框式设备中的多个具备主从关系的节点进行管理,功能特性主要涉及节点间的主备关系切换,例如当前BMC发生致命告警等问题时不适合继续运行,需要将当前节点进行降备,再决策出另一个主BMC保障设备运行

以上功能通过对象配置承载,下面对这些配置进行详细介绍。

配置项是否必须配置配置说明
本端配置唯一标识以及通信地址等信息
远端配置唯一标识以及通信地址等信息
切换条件通过配置可以自定义主动进行主备切换的条件或者禁止进行切换的条件
主备服务配置包含主备状态读取相关的一系列硬件信号以及辅助主备检测的属性

本端BMC配置 ActiveStandbyLocal

属性名称属性类型属性说明
IdU8唯一标识
PresenceU8在位状态 1:在位 0:不在位
AddressStringBMC节点通信的地址
PortU16BMC节点通信的端口

配置解读

Id标识通常是使用槽位号,没有槽位号也可以自定义,此Id用于匹配默认的主BMC,也就是说希望某个节点为主,那么此节点就会先一步发送信号,参与到主备的仲裁当中。

本端BMC的地址端口号用于创建远程访问的服务端,因为对于其他节点来说,此BMC才是远端,端口需要保证未被使用。

在位信号不限制数据源,如CPLD,通过配置Accessor读取,也可通过下级Connector在位状态获取。

配置示例

json
    "ActiveStandbyLocal_0":{
        "Id": 1,
        "Presence": "#/Object1.Presence",
        "Address": "192.168.100.114",
        "Port": 51000
    }

远端BMC配置 ActiveStandbyRemote

配置与本端BMC相同,这里简单讲述配置类的区别。

远端BMC的资源协作接口由本端BMC更新,即通过配置的地址和端口创建远程访问客户端,访问远端节点创建的远程访问服务端。

配置示例

json
    "ActiveStandbyLocal_0":{
        "Id": 2,
        "Presence": "#/Object2.Presence",
        "Address": "192.168.100.115",
        "Port": 51001
    }

主备BMC切换条件 SwitchRule

属性名称属性类型属性说明
RuleTypeU8切换条件类型 0:BMC主动切换的触发条件 1:BMC被动切换的禁止条件
ThresholdU32当前主备切换条件的门限值
ReadingU32当前主备切换条件的输入值
EnabledBoolean是否使能当前主备切换条件
OperatorU8当前主备切换条的运算符 1:小于 2:小于等于 3:大于 4:大于等于 5:等于 6:不等于
DirectionU8切换条件为0时表示BMC主动切换的主备方向,配置为1时表示被动切换时被禁止的主备方向 0:降备 1:升主
DescriptionString主备条件命中之后的描述信息,表示BMC发生主动切换或者被动切换禁止的原因

配置解读

此配置支持两类场景:

  1. 满足特定条件需要立即切换主备,例如存在致命告警需要降备的情况,那么上述配置触发生效后会发送申请倒换的请求。

  2. 而像固件正在升级生效等场景不希望发生主备切换的,可以配置为禁止切换条件,触发门限后会检测是否存在生效的禁止条件

配置示例

json
    "SwitchOverRule_0": {
        "RuleType": 1,
        "Threshold": 1,
        "Reading": "<=/Scanner_CPLD1.Value",
        "Operator": 5,
        "Enabled": true,
        "Direction": 0,
        "Description": "CPLD Validating"
    }

资源显示示例

bash
> busctl --user tree bmc.kepler.active_standby_mgmt
...
├─/bmc/kepler/Managers
 /bmc/kepler/Managers/1
  /bmc/kepler/Managers/1/ActiveStandby
   /bmc/kepler/Managers/1/ActiveStandby/Local  # 本端BMC
   /bmc/kepler/Managers/1/ActiveStandby/Remotes
     /bmc/kepler/Managers/1/ActiveStandby/Remotes/ActiveStandbyRemote_0_01  # 远端BMC
     /bmc/kepler/Managers/1/ActiveStandby/Remotes/ActiveStandbyRemote_1_01  # 远端BMC
   /bmc/kepler/Managers/1/ActiveStandby/SwitchRules
     /bmc/kepler/Managers/1/ActiveStandby/SwitchRules/SwitchRule_0  # 切换条件
     /bmc/kepler/Managers/1/ActiveStandby/SwitchRules/SwitchRule_1  # 切换条件
    ...

主备服务管理 私有类 ActiveStandbyService

属性名称属性类型属性说明
DefaultActiveIdU8默认单板的标识,与主备对象的Id对应
StandbyToActiveWriteU8升主写入硬件信号对象
ActiveToStandbyWriteU8降备写入硬件信号对象
StandbyToActiveWriteProtectU8升主写保护硬件信号对象
ActiveToStandbyWriteProtectU8降备写保护硬件信号对象
HeartbeatWriteU8当前BMC主备心跳写入硬件信号对象
HealthStatusReadU8当前BMC健康状态读取硬件信号对象 0: Not Health 1: Health
ActiveReadU8当前BMC主备状态读取硬件信号对象 0: Standby 1: Active
BoardInReadU8单板插稳状态读取对象 0: 未插稳 1:已插稳
HeartbeatIntervalMSU16当前BMC主备心跳检测周期,单位:ms 取值范围:10~1000 默认值:300
HeartbeatTimeoutMSU16当前BMC主备心跳检测间隔的超时时间,单位:ms 取值范围:500~3000 默认值:3000
StatusIntervalMSU16当前BMC主备检测间隔,单位:ms 取值范围:50~300 默认值:200

配置解读

此类包含BMC主备服务需要读取主备管理相关的一系列硬件信号,以及辅助BMC主备服务需要的属性。

对于有默认值的配置项非必配项,例如心跳检测间隔等,有需要进行调整时可配置.

上述配置为支撑各产业使用,所以不一定具备所有硬件信号,例如读取类BoardInRead如果没有配置必要,可以配死为1

写入类是通过写1(写入)和0(清除)的方式,简要流程为: 先打开写保护再写入升主/降备寄存器,最后读取ActiveRead获取硬件信号判断主备状态。

因此如果不涉及写保护可以不配置。

配置示例

json
    "ActiveStandbyService_0": {
        "DefaultActiveId": 1, // 默认框内1号BMC为主BMC
        "StandbyToActiveWrite": "#/Accessor_ToActive.Value",
        "ActiveToStandbyWrite": "#/Accessor_ToStandby.Value",
        "StandbyToActiveWriteProtect": "#/Accessor_ToActivePro.Value",
        "ActiveToStandbyWriteProtect": "#/Accessor_ToStandbyPro.Value",
        "HeartbeatWrite": "#/Accessor_Heartbeat.Value",
        "HealthStatusRead": "#/Scanner_Health.Value",
        "ActiveRead": "#/Scanner_Active.Value",
        "BoardInRead": "#/Scanner_BoardIn.Value",
        "HeartbeatIntervalMS": 300,
        "HeartbeatTimeoutMS": 3000,
        "StatusIntervalMS": 200
    }

当然,配置示例中数据源来自于Accessor,实际并未限定数据源一定是硬件寄存器,可根据产业自身业务进行适配。