数据同步机制说明及配置指导
更新时间: 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
| 属性名 | 属性类型 | 取值说明 |
|---|---|---|
| Identifier | U8 | CAN设备标识,用于标识在CAN协议传输时的消息来源和目的标识,在CAN设备管理域内唯一 |
| Channels | U8[] | CAN设备管理的可用总线集合,数组中每个元素都表征一个可用的CAN设备总线通道,如:0就表示CAN0通道可用 |
| Enabled | Boolean | CAN设备管理的使能标识,表征当前环境是否要使能CAN。true:使能;false:禁用 |
3.2 DataSync
| 属性名 | 属性类型 | 取值说明 |
|---|---|---|
| CommunicationType | U8 | 数据同步的通信类型 0: CAN-FD 1: TCP |
3.3 TCPMgmt
| 属性名 | 属性类型 | 取值说明 |
|---|---|---|
| Enabled | Boolean | 当前TCP同步功能的使能状态。true:使能;false:禁用 |
| SyncRole | U8 | 数据同步角色,仅用于TCP通信 0:接收者,仅接受其他节点的数据 1:发送者,允许向其他节点同步,同时接受其他节点的数据 |
| Identifier | U8 | BMC节点标识,用于标识在TCP协议传输时的消息来源和目的标识,需要保持唯一 |
| Address | String | 当前BMC节点的通信地址 |
| Port | U16 | 当前BMC节点的通信端口 |
模型说明
- 节点标识通常同步槽位号等属性,用于接收者判断发送的BMC节点
- 使能状态与同步都支持运行中调整
3.4 PropertySync
| 属性名 | 属性类型 | 取值说明 |
|---|---|---|
| ServiceName | String | 目标同步对象所在的D-Bus服务名;CSR引用模式下可为空 |
| SyncMode | U8 | 属性同步的模式 0:实时同步 1:周期性同步 2:实时同步且周期性同步 |
| SyncInterval | U8 | 同步间隔,仅周期性同步时使用,单位:秒,取值范围:5~60,超过时取边界值,如3->5,70->60 |
| TTL | U32 | 当前同步的数据老化时限,此时间内没有数据更新会更新标记,查询时返回此数据是否已老化,单位:秒,0:表示不限制 |
| SyncObjectName | String | 目标同步对象名,需要引用关联对象即可 |
| SyncObjectItems | 结构体数组,其中结构体定义如下方所示 | 目标同步对象信息,表征需要同步那些数据,支持同步多个接口 |
| SyncType | U8 | 属性同步的类型 0:自动覆盖,数据同步服务直接调用目标组件接口写入属性值到目标组件 1:信号通知,数据同步服务通知目标组件获取数据 |
| ForceSync | Boolean | 属性强制同步模式 false:非强制同步 true:强制同步 |
| 结构体属性名 | 属性类型 | 取值说明 |
|---|---|---|
| Interface | String | 目标同步对象的接口 |
| Properties | String[] | 目标同步对象接口下需要同步的属性 |
模型说明
- 同步周期应当小于老化时间,否则默认将老化时间调整至同步周期的3倍,同时也建议按照此倍率进行配置
- 所有属性直接访问资源协作接口,所以不支持同步私有属性
- 如果选择实时同步,对应的资源需要支持发送信号
- 目标发现支持三种模式:
SyncObjectName以/开头时按指定对象路径同步;以#/开头或包含CSR引用信息时按CSR引用同步;两者均未配置时按ServiceName和SyncObjectItems中的接口发现目标 - 接口发现模式会订阅接口的添加和移除信号,新增目标先做一次全量同步,移除目标后同步回收监听;短暂发现失败时保留已有目标
DataSyncAllowed=false时,ForceSync=true的属性同步任务继续执行,ForceSync=false的任务暂停
3.5 SyncDestination
| 属性名 | 属性类型 | 取值说明 |
|---|---|---|
| Address | String | 目标节点的地址;作为bmc.kepler.Managers.DataSync.Destination资源协作接口属性发布 |
| Port | U16 | 目标节点的端口;作为bmc.kepler.Managers.DataSync.Destination资源协作接口属性发布 |
| DestinationFilter | U8 | 目标节点用途位图:bit0置1表示不参与文件同步,bit1置1表示不参与属性同步,bit2置1表示不用于RPC,bit3~bit7保留 |
模型说明
- 地址与端口作为资源协作接口属性发布,可通过资源协作接口查询和监听;配置值仍可使用CSR引用语法
- 用途过滤器按位生效,
DestinationFilter=0表示参与文件同步、属性同步和RPC;DestinationFilter=7表示所有用途均不参与 - 同步属性、文件和RPC可以使用相同或不同的目标地址;如需隔离用途,按bit0~bit2组合配置
3.6 FileSync
| 属性名 | 属性类型 | 取值说明 |
|---|---|---|
| SyncFileList | String[] | 需要同步的文件列表 |
| SyncMode | U8 | 文件同步的模式 0:实时同步 1:周期性同步 2:实时同步且周期性同步 |
| SyncInterval | U8 | 同步间隔,仅周期性同步时使用,单位:秒,取值范围:5~60 |
| ForceSync | Boolean | 文件强制同步模式 false:非强制同步 true:强制同步 |
| SyncType | U8 | 文件同步的类型 0:自动覆盖,即同步完成后直接覆盖原文件 1:回调通知模式,即同步后通过广播信号的方式告知订阅组件相关文件已同步 |
模型说明
- 发送端先生成文件摘要,内容包括类型、大小、修改时间、权限、属主和CRC16;接收端按摘要比较,仅在需要时返回
NeedSync并请求内容 - 文件内容传输后会再次校验CRC16,目录和软链接也纳入摘要比较范围
- 普通文件大小上限为50MB,超限文件不同步
- 自动覆盖模式先写入临时文件并恢复元数据,校验通过后替换或复制到正式文件;原路径不存在或文件类型变化时使用原子替换;软链接先创建临时链接再替换;回调通知模式将文件写入
/dev/shm/bmc_datasync/<Identifier>临时目录,业务组件处理后再替换或读取 - 回调通知模式的临时文件10分钟未更新会被清理;业务组件应在合理时间内消费,避免重复传输或长期占用内存盘
- 与属性同步相同,同步周期应当小于老化时间,否则默认将老化时间调整至同步周期的3倍
- 同步后直接覆盖的模式应当用于低风险文件,避免如账户信息等关键文件被替换导致异常;由于传输过程不会加密,敏感文件内容应按需加密