Crimson OSD 三副本实现分析
概述
虽然 main.cc 是 Crimson OSD 的入口点,但三副本(replication)的实现并不在 main.cc 中。main.cc 主要负责 OSD 的启动和初始化,而三副本的核心逻辑在 ReplicatedBackend 类中实现。
架构概览
1 | main.cc (启动 OSD) |
三副本实现位置
1. 核心类:ReplicatedBackend
文件位置:
cephMain/src/crimson/osd/replicated_backend.hcephMain/src/crimson/osd/replicated_backend.cc
继承关系:
1 | ReplicatedBackend : public PGBackend |
2. 关键方法:submit_transaction
这是三副本写入的核心方法,负责将事务提交到所有副本。
三副本工作流程
1. 副本集合确定
副本集合由 PG 的 acting set 决定,通常包含 3 个 OSD:
- Primary OSD(主副本,通常是当前 OSD)
- Secondary OSD(第二副本)
- Tertiary OSD(第三副本)
1 | // 在 ReplicatedBackend::submit_transaction 中 |
2. 写操作流程
步骤 1: 创建待处理事务
1 | // replicated_backend.cc:94-119 |
步骤 2: 发送到所有副本
1 | // replicated_backend.cc:136-167 |
步骤 3: 本地提交
1 | // replicated_backend.cc:169-176 |
步骤 4: 等待所有副本确认
1 | // replicated_backend.cc:178-197 |
3. 副本确认处理
当副本 OSD 完成写入后,会发送 MOSDRepOpReply 消息:
1 | // replicated_backend.cc:231-249 |
关键数据结构
1. pending_on_t - 待处理事务状态
1 | // replicated_backend.h:51-71 |
2. acked_peers_t - 已确认副本列表
1 | // acked_peers.h:9-13 |
3. pending_transactions_t - 待处理事务映射
1 | // replicated_backend.h:72 |
三副本保证机制
1. 同步写入
- 主副本必须等待所有副本(包括自己)确认后才完成写操作
- 使用
shared_promise和shared_future实现多等待者同步
2. 版本控制
- 每个写操作都有唯一的版本号(
at_version) - 副本必须按顺序应用操作,保证一致性
3. 故障处理
1 | // replicated_backend.cc:221-229 |
消息类型
1. MOSDRepOp - 副本操作请求
主副本发送给其他副本的操作请求,包含:
- 事务数据(
txn_payload和data) - 日志条目(
log_entries) - 版本信息
- PG 统计信息
2. MOSDRepOpReply - 副本操作响应
副本 OSD 完成写入后发送的确认消息,包含:
- 事务 ID(
tid) - 最后完成版本(
last_complete_ondisk) - 操作结果
与 main.cc 的关系
虽然 main.cc 不直接实现三副本逻辑,但它负责:
- 初始化 OSD:
1 | // main.cc:210-213 |
- 启动 OSD:
1 | // main.cc:239 |
- 创建 Messenger:
1 | // main.cc:189-204 |
这些组件为三副本通信提供了基础设施。
完整写操作流程示例
假设有 3 个副本:OSD 0(主)、OSD 1、OSD 2
1 | 1. 客户端发送写请求到 OSD 0(主副本) |
性能优化
1. 异步发送
所有副本操作消息异步发送,不阻塞主流程:
1 | sends->emplace_back( |
2. 批量处理
使用 when_all_succeed 等待所有发送完成:
1 | auto sends_complete = seastar::when_all_succeed( |
3. 条件发送
根据副本状态决定发送完整操作还是简化操作:
1 | if (pg.should_send_op(pg_shard, hoid)) { |
总结
三副本实现的核心特点:
- 位置:主要在
ReplicatedBackend类中,不在main.cc - 机制:主副本发送操作到所有副本,等待所有确认
- 同步:使用
shared_promise/shared_future实现同步 - 容错:副本集合变化时取消待处理事务
- 性能:异步发送,批量等待,条件优化
main.cc 的作用是启动整个系统,为三副本提供运行环境(OSD、Messenger、Store 等),但具体的副本逻辑由 ReplicatedBackend 实现。
正在加载留言…