
1) 【一句话结论】:针对船舶设备运行数据(时序数据,高写入率、海量增长),采用分布式对象存储(如Ceph),结合一致性哈希分片、机架感知多副本冗余,通过Raft协议保证强一致性,并实现冷热数据分离(热数据SSD、冷数据HDD/归档),构建高可用、可扩展的长期存储方案,满足性能分析和故障追溯需求。
2) 【原理/概念讲解】:老师口吻,解释关键概念:
3) 【对比与适用场景】:
| 存储方案 | 定义 | 关键特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 分布式时序数据库(如InfluxDB) | 专为时序数据设计 | 分片+副本,支持水平扩展,内置压缩索引 | 船舶设备实时数据采集、实时分析 | 长期存储需归档,扩展性受限于时序特性 |
| 分布式对象存储(如Ceph) | 对象存储,基于块/文件/对象 | 数据分片+多副本,高可用,可扩展 | 海量非结构化/结构化数据,长期存储 | 写入延迟较高,需客户端适配 |
| 关系型数据库(如MySQL) | 结构化数据,ACID事务 | 单机/主从,强一致性,扩展性有限 | 结构化设备参数、配置 | 扩展性差,不适合海量时序数据 |
| NoSQL数据库(如MongoDB) | 非关系型,支持灵活Schema | 分片,最终一致性 | 设备日志、配置 | 一致性依赖应用层,故障追溯需额外设计 |
4) 【示例】:伪代码展示数据写入与冷数据迁移:
// 1. 数据写入(设备运行数据)
function writeDeviceMetrics(deviceId, ts, metrics) {
shardId = hash(deviceId) % numShards // 一致性哈希分片
replicas = getReplicas(shardId, rackAware = true) // 机架感知副本
for (rep in replicas) {
send("PUT", rep, metrics, ts)
}
if (allAcked()) return "写入成功"
else return "写入失败,副本同步异常"
}
// 2. 冷数据迁移(冷热分离)
function migrateColdData() {
coldData = selectData(timestamp < now() - 30days) // 触发条件:超30天
backup(coldData) // 增量备份
for (item in coldData) {
send("MIGRATE", item, hddStorage) // 迁移到HDD
}
verifyChecksum(coldData) // 验证一致性
}
5) 【面试口播版答案】:面试官您好,针对船舶设备运行数据的长期存储需求,我设计的方案是采用分布式对象存储系统(如Ceph),结合一致性哈希分片、机架感知多副本冗余,并通过Raft协议保证强一致性。具体来说,数据按设备ID哈希分片到不同节点,每个数据块存储3个副本,分布在不同机架,避免单点故障。写入时所有副本同步成功后返回,确保数据一致性。扩展性方面,新增节点时自动加入分片,数据会自动迁移,无需停机。同时,实现冷热数据分离,近期数据存储在SSD,历史数据迁移到HDD,降低成本。数据完整性通过副本校验和事务日志保证,故障时从副本和日志恢复,满足性能分析和故障追溯的需求。
6) 【追问清单】:
7) 【常见坑/雷区】: