数据同步机制说明及配置指导
更新时间: 2026/09/03
在AtomGit上查看源码

前言

什么是数据同步

如框式设备等场景涉及多个BMC的互相通信,每个BMC作为一个节点,可以发送自身的数据给其他节点,或者接收其他节点的数据

例如查询所有节点数据

或者主备场景

bmc_datasync组件主要负责不同的BMC设备实体之间的数据同步功能。当前组件支持的不同的BMC设备实体之间数据同步通信的方式有:

  • 基于 TCP-IP 的设备内部以太网络通信同步
  • 基于 CAN-FD 的设备内部总线通信同步

怎么使用

1 基于 TCP-IP 方式同步

1.1 通信机制介绍

节点通信基于dophi创建客户端和服务端,实现2个节点间的通信。

对于需要发送数据的节点需要配置对端节点的IP信息,用于创建客户端发送本节点的数据。

对应的需要接收数据的节点则需要通过本节点的IP信息创建服务端。

1.2 配置示例

json
        "DataSync_1": {
            "CommunicationType": 1  // TCP同步
        },
        "TCPMgmt_1": {
            "Enabled": true,  // 开启TCP同步
            "Identifier": 1,  // 本机标识
            "Address": "xx.xx.xx.x",  // 本机地址
            "Port": 1,  // 本机端口
            "SyncRole": 1  // 同步角色为发送者
        },
        "PropertySync_1": {
            "SyncMode": 1,  // 当前节点为周期性同步
            "SyncInterval": 3,  // 每3秒同步一次
            "TTL": 20,  // 20秒不更新数据即老化
            "SyncObjectName": "#/Component_BMC",  // 需要同步的对象
			// 同步的接口与属性
            "SyncObjectItems": [
                {
                    "Interface": "bmc.kepler.Systems.Component",
                    "Properties": [
                        "Health",
                        "Presence"
                    ]
                }
            ],
            "ServiceName": "bmc.kepler.frudata",  // 目标同步对象所在的服务;CSR引用模式下可为空
            "ForceSync": false  // DataSyncAllowed=false时,false表示停止同步,true表示继续同步
        },
		// 目标同步对象(举例)
        "Component_BMC": {
            "FruId": 255,
            "Name": "BMC",
            "Type": 26
        },
		// 其他节点的IP信息
        "ServiceDestination_1": {
            "Address": "xx.xx.xx.y",
            "Port": 1,
            "DestinationFilter": 0  // bit0=0参与文件同步,bit1=0参与属性同步,bit2=0参与RPC
        },
        "ServiceDestination_2": {
            "Address": "xx.xx.xx.z",
            "Port": 1,
            "DestinationFilter": 1  // bit0=1,不参与文件同步;bit1=0,继续参与属性同步
        },
        "FileSync_1": {
            "SyncFileList": [  // 同步的文件列表
                "/dev/shm/a.txt"
            ],
            "SyncMode": 1,  // 周期性同步
            "SyncInterval": 5,  // 同步周期5s
            "SyncType": 0 // 当前的文件可以直接覆盖远端节点
        }

1.3 属性同步机制

1.4 文件同步机制

2 基于 CAN-FD 方式同步

2.1 CAN-FD 总线介绍

在不同的设备之间有一条 CAN-FD 总线,每个BMC设备相当于挂接在这个总线上的设备,可以从总线获取或者向总线发布数据。如下图:

2.2 CAN-FD 总线应用框架

2.2.1 CAN-FD 总线应用框架处理流程总览

2.2.2 CAN-FD 配置示例

json
        "CANMgmt_1": {
            "Identifier": 1,  // CAN标识
            "Channels": [1, 2],  // 通道号
            "Enabled": true  // CAN使能
        },
        "DataSync_1": {
            "CommunicationType": 0,  // CAN同步
        },
        "PropertySync_1": {
            "SyncMode": 1,  // 当前节点时周期性同步
            "SyncInterval": 3,  // 每3秒同步一次
            "TTL": 20,  // 20秒不更新数据即老化
            "SyncObjectName": "#/Component_BMC",  // 需要同步的对象
			// 同步的接口与属性
            "SyncObjectItems": [
                {
                    "Interface": "bmc.kepler.Systems.Component",
                    "Properties": [
                        "Health",
                        "Presence"
                    ]
                }
            ],
            "ServiceName": "bmc.kepler.frudata"  // 目标同步对象所在的服务;CAN同步不使用CSR引用时不可为空
        },
		// 目标同步对象
        "Component_BMC": {
            "FruId": 255,
            "Name": "BMC",
            "Type": 26
        }

3 配置详解

3.1 CANMgmt

属性名属性类型取值说明
IdentifierU8CAN设备标识,用于标识在CAN协议传输时的消息来源和目的标识,在CAN设备管理域内唯一
ChannelsU8[]CAN设备管理的可用总线集合,数组中每个元素都表征一个可用的CAN设备总线通道,如:0就表示CAN0通道可用
EnabledBooleanCAN设备管理的使能标识,表征当前环境是否要使能CAN。true:使能;false:禁用

3.2 DataSync

属性名属性类型取值说明
CommunicationTypeU8数据同步的通信类型 0: CAN-FD 1: TCP

3.3 TCPMgmt

属性名属性类型取值说明
EnabledBoolean当前TCP同步功能的使能状态。true:使能;false:禁用
SyncRoleU8数据同步角色,仅用于TCP通信 0:接收者,仅接受其他节点的数据 1:发送者,允许向其他节点同步,同时接受其他节点的数据
IdentifierU8BMC节点标识,用于标识在TCP协议传输时的消息来源和目的标识,需要保持唯一
AddressString当前BMC节点的通信地址
PortU16当前BMC节点的通信端口

模型说明

  1. 节点标识通常同步槽位号等属性,用于接收者判断发送的BMC节点
  2. 使能状态与同步都支持运行中调整

3.4 PropertySync

属性名属性类型取值说明
ServiceNameString目标同步对象所在的D-Bus服务名;CSR引用模式下可为空
SyncModeU8属性同步的模式 0:实时同步 1:周期性同步 2:实时同步且周期性同步
SyncIntervalU8同步间隔,仅周期性同步时使用,单位:秒,取值范围:5~60,超过时取边界值,如3->5,70->60
TTLU32当前同步的数据老化时限,此时间内没有数据更新会更新标记,查询时返回此数据是否已老化,单位:秒,0:表示不限制
SyncObjectNameString目标同步对象名,需要引用关联对象即可
SyncObjectItems结构体数组,其中结构体定义如下方所示目标同步对象信息,表征需要同步那些数据,支持同步多个接口
SyncTypeU8属性同步的类型 0:自动覆盖,数据同步服务直接调用目标组件接口写入属性值到目标组件 1:信号通知,数据同步服务通知目标组件获取数据
ForceSyncBoolean属性强制同步模式 false:非强制同步 true:强制同步
结构体属性名属性类型取值说明
InterfaceString目标同步对象的接口
PropertiesString[]目标同步对象接口下需要同步的属性

模型说明

  1. 同步周期应当小于老化时间,否则默认将老化时间调整至同步周期的3倍,同时也建议按照此倍率进行配置
  2. 所有属性直接访问资源协作接口,所以不支持同步私有属性
  3. 如果选择实时同步,对应的资源需要支持发送信号
  4. 目标发现支持三种模式:SyncObjectName/开头时按指定对象路径同步;以#/开头或包含CSR引用信息时按CSR引用同步;两者均未配置时按ServiceNameSyncObjectItems中的接口发现目标
  5. 接口发现模式会订阅接口的添加和移除信号,新增目标先做一次全量同步,移除目标后同步回收监听;短暂发现失败时保留已有目标
  6. DataSyncAllowed=false时,ForceSync=true的属性同步任务继续执行,ForceSync=false的任务暂停

3.5 SyncDestination

属性名属性类型取值说明
AddressString目标节点的地址;作为bmc.kepler.Managers.DataSync.Destination资源协作接口属性发布
PortU16目标节点的端口;作为bmc.kepler.Managers.DataSync.Destination资源协作接口属性发布
DestinationFilterU8目标节点用途位图:bit0置1表示不参与文件同步,bit1置1表示不参与属性同步,bit2置1表示不用于RPC,bit3~bit7保留

模型说明

  1. 地址与端口作为资源协作接口属性发布,可通过资源协作接口查询和监听;配置值仍可使用CSR引用语法
  2. 用途过滤器按位生效,DestinationFilter=0表示参与文件同步、属性同步和RPC;DestinationFilter=7表示所有用途均不参与
  3. 同步属性、文件和RPC可以使用相同或不同的目标地址;如需隔离用途,按bit0~bit2组合配置

3.6 FileSync

属性名属性类型取值说明
SyncFileListString[]需要同步的文件列表
SyncModeU8文件同步的模式 0:实时同步 1:周期性同步 2:实时同步且周期性同步
SyncIntervalU8同步间隔,仅周期性同步时使用,单位:秒,取值范围:5~60
ForceSyncBoolean文件强制同步模式 false:非强制同步 true:强制同步
SyncTypeU8文件同步的类型 0:自动覆盖,即同步完成后直接覆盖原文件 1:回调通知模式,即同步后通过广播信号的方式告知订阅组件相关文件已同步

模型说明

  1. 发送端先生成文件摘要,内容包括类型、大小、修改时间、权限、属主和CRC16;接收端按摘要比较,仅在需要时返回NeedSync并请求内容
  2. 文件内容传输后会再次校验CRC16,目录和软链接也纳入摘要比较范围
  3. 普通文件大小上限为50MB,超限文件不同步
  4. 自动覆盖模式先写入临时文件并恢复元数据,校验通过后替换或复制到正式文件;原路径不存在或文件类型变化时使用原子替换;软链接先创建临时链接再替换;回调通知模式将文件写入/dev/shm/bmc_datasync/<Identifier>临时目录,业务组件处理后再替换或读取
  5. 回调通知模式的临时文件10分钟未更新会被清理;业务组件应在合理时间内消费,避免重复传输或长期占用内存盘
  6. 与属性同步相同,同步周期应当小于老化时间,否则默认将老化时间调整至同步周期的3倍
  7. 同步后直接覆盖的模式应当用于低风险文件,避免如账户信息等关键文件被替换导致异常;由于传输过程不会加密,敏感文件内容应按需加密