03 - 核心架构
03 - 核心架构
3.1 RADOS — 可靠自主分布式对象存储
RADOS(Reliable Autonomic Distributed Object Store) 是 Ceph 的基础存储层,所有上层接口(RBD、CephFS、RGW)都构建在 RADOS 之上。
┌─────────────────────────────────────────────────┐
│ RBD (块) CephFS (文件) RGW (对象) │ ← 存储接口层
├─────────────────────────────────────────────────┤
│ librados │ ← 客户端库
├─────────────────────────────────────────────────┤
│ RADOS │ ← 核心对象存储层
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ OSD │ │ OSD │ │ OSD │ │ OSD │ │ ← 存储守护进程
│ │ 0 │ │ 1 │ │ 2 │ │ 3 │ │
│ └──────┘ └──────┘ └──────┘ └──────┘ │
│ MON (监控) MGR (管理) │ ← 控制平面
└─────────────────────────────────────────────────┘
RADOS 对象模型
每个 RADOS 对象包含:
| 组件 | 说明 |
|---|---|
| OID | Object ID,全局唯一标识符 |
| Data | 对象的实际数据内容 |
| XATTRs | 扩展属性键值对 |
| OMAP | Object Map,类似键值存储 |
# 查看池中的对象
rados -p mypool ls
# 查看对象的详细信息
rados stat <object-name> -p mypool
# 查看对象的 xattr
rados listxattr <object-name> -p mypool
3.2 Monitor (MON) 组件
职责
Monitor 维护集群的状态映射(Cluster Map),包括:
| 映射类型 | 说明 |
|---|---|
| Monitor Map | MON 节点列表和地址 |
| OSD Map | OSD 状态(up/down/in/out)、权重 |
| PG Map | PG 状态和映射关系 |
| CRUSH Map | 存储拓扑和放置规则 |
| MDS Map | MDS 状态(CephFS 使用) |
法定人数(Quorum)
MON 使用 Paxos 协议达成共识,需要超过半数(majority)的 MON 节点在线才能工作。
MON 数量 最少存活数 可容忍故障数
1 1 0 ← 不推荐
3 2 1 ← 最常用
5 3 2 ← 大规模集群
7 4 3 ← 超大规模
# 查看 MON 状态
ceph mon stat
# 输出: e3: 3 mons at {node1=[v2:192.168.1.10:3300/0,...],node2=...,node3=...}, election epoch 10, leader 0 node1
# 查看 MON 详情
ceph mon dump
# 查看法定人数状态
ceph quorum_status --format json-pretty
MON 数据存储
# MON 数据目录结构
/var/lib/ceph/mon/ceph-node1/
├── keyring # 密钥
├── kv_backend # 存储后端(rocksdb)
├── store.db/ # RocksDB 数据文件
├── done # 标记初始化完成
└── unit.first_boot # 首次启动标记
注意事项:
- MON 节点数量必须为奇数
- MON 使用 RocksDB 存储数据,磁盘 I/O 要求较高
- 建议 MON 使用 SSD,避免与其他 OSD 混合部署
3.3 Manager (MGR) 组件
MGR 是 Ceph 的管理守护进程,提供监控接口和运行管理模块。
MGR 模块
# 查看已启用的模块
ceph mgr module ls
# 启用常用模块
ceph mgr module enable dashboard
ceph mgr module enable prometheus
ceph mgr module enable balancer # PG 自动均衡
ceph mgr module enable pg_autoscaler # PG 自动伸缩
# 查看当前活跃的 MGR
ceph mgr stat
| 模块 | 功能 | 建议 |
|---|---|---|
| dashboard | Web 管理界面 | 启用 |
| prometheus | Prometheus 指标导出 | 启用 |
| balancer | PG 自动均衡 | 启用 |
| pg_autoscaler | PG 数量自动调整 | 启用 |
| crash | 崩溃数据收集 | 启用 |
| telemetry | 遥测数据上报 | 按需 |
| iostat | I/O 统计 | 调试用 |
3.4 OSD 组件
OSD(Object Storage Daemon) 是 Ceph 的数据存储守护进程,每个 OSD 对应一块物理磁盘。
OSD 架构
┌──────────────────────────────────────┐
│ OSD 守护进程 │
│ ┌──────────────────────────────────┐│
│ │ BlueStore ││
│ │ ┌────────┐ ┌────────┐ ┌────┐││
│ │ │ WAL │ │ DB │ │Data│││ ← BlueFS
│ │ │(高速) │ │(高速) │ │(盘)│││
│ │ └────────┘ └────────┘ └────┘││
│ └──────────────────────────────────┘│
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Heartbeat │ │ Replication│ │ ← 心跳 & 复制
│ └──────────────┘ └──────────────┘ │
│ ┌──────────────────────────────────┐│
│ │ Recovery & Backfill ││ ← 恢复 & 回填
│ └──────────────────────────────────┘│
└──────────────────────────────────────┘
OSD 状态
| 状态 | 含义 | 说明 |
|---|---|---|
| up/in | 正常运行且参与数据存储 | 正常状态 |
| up/out | 运行但不参与数据存储 | 罕见 |
| down/in | 故障但标记仍在 | 等待恢复 |
| down/out | 故障且已移出 | 数据已迁移到其他 OSD |
# 查看 OSD 状态
ceph osd stat
ceph osd tree
# 查看 OSD 详情
ceph osd dump
# 查看 OSD 的性能计数器
ceph daemon osd.0 perf dump
# 查看 OSD 的日志
journalctl -u ceph-osd@0 -f
OSD 心跳机制
OSD 0 ←──heartbeat──→ OSD 1
↑ ↑
│ heartbeat │
└──────→ OSD 2 ←────────┘
每 6 秒发送一次心跳
如果 20 秒无响应,标记为 down
如果 600 秒(默认)仍 down,标记为 out 并触发数据迁移
# 调整 OSD down/out 超时
ceph osd set-down-interval 120 # 120 秒标记 down
ceph osd set-out-interval 1800 # 1800 秒标记 out
# 或通过配置文件
[osd]
osd_heartbeat_grace = 20
osd_mon_report_interval = 300
mon_osd_min_down_reporters = 3
3.5 MDS 组件
MDS(Metadata Server) 仅用于 CephFS 文件存储,负责管理文件系统的元数据(目录结构、文件属性、权限等)。
# 查看 MDS 状态
ceph mds stat
# 输出: myfs:1 {0=node1=up:active} 2 up:standby
# 查看 MDS 性能
ceph tell mds.* perf dump
# 创建文件系统时会自动部署 MDS
ceph fs volume create myfs --placement="3 node1 node2 node3"
注意:RBD 和 RGW 不需要 MDS。
3.6 Placement Group (PG)
PG 概念
PG(Placement Group) 是数据映射的逻辑单元,是对象到 OSD 之间的中间层。
Object → hash(oid) % pg_num → PG → CRUSH → [OSD列表]
PG 状态
| 状态 | 说明 | 是否正常 |
|---|---|---|
| active+clean | 正常,所有副本就绪 | ✅ |
| active+degraded | 有 OSD 故障,数据降级 | ⚠️ |
| active+undersized | 副本数不足 | ⚠️ |
| active+remapped | 数据正在迁移 | ⚠️ |
| active+backfilling | 正在回填数据 | ⚠️ |
| peering | PG 正在建立对等关系 | ⚠️ |
| inactive | PG 不可用 | ❌ |
| stale | PG 状态过期 | ❌ |
# 查看所有 PG 状态
ceph pg stat
# 输出: 128 pgs: 128 active+clean; 45 GiB data, 120 GiB used, 2.8 TiB / 3 TiB avail
# 查看特定池的 PG
ceph pg ls | head -20
# 查看 PG 的详细映射
ceph pg map 0.0
# 输出: osdmap e50 pg 0.0 (0.0) -> up [2,0,1] acting [2,0,1]
# 查看 PG 的分布
ceph pg dump --format json-pretty | jq '.pg_map.pg_stats[:5]'
PG 与 PGP
| 参数 | 说明 |
|---|---|
| pg_num | PG 的数量,影响数据分布粒度 |
| pgp_num | 用于 CRUSH 计算的 PG 数量,应等于 pg_num |
# 设置 PG 数量
ceph osd pool create mypool 128 128 replicated
# pg_num=128, pgp_num=128
# 查看推荐的 PG 数
ceph osd pool get mypool pg_num
ceph osd pool get mypool pgp_num
3.7 数据分布流程详解
完整写入流程
1. Client 向 MON 请求最新 Cluster Map
2. Client 计算对象的 PG:
pgid = hash(pool_id + object_name) % pg_num
3. Client 根据 CRUSH 算法计算 PG 对应的 OSD 列表:
[Primary OSD, Secondary OSD, Tertiary OSD]
4. Client 将写入请求发送到 Primary OSD
5. Primary OSD 写入本地数据
6. Primary OSD 将写入复制到 Secondary 和 Tertiary OSD
7. Secondary 和 Tertiary 返回确认
8. Primary OSD 向 Client 返回写入成功
读取流程
1. Client 计算对象的 PG 和 OSD 列表
2. Client 向 Primary OSD 发送读取请求
3. Primary OSD 返回数据(如果 Primary 不可用,可从其他副本读取)
# 查看对象的 PG 映射
ceph osd map mypool myobject
# 输出:
# osdmap e100 pool 'mypool' (3) object 'myobject' -> pg 3.bac5debc (3.0) -> up [1,0,2] acting [1,0,2]
# 表示:
# - 对象 'myobject' 映射到 PG 3.0
# - Primary OSD = 1, Secondary OSD = 0, Tertiary OSD = 2
3.8 CRUSH Map 基础结构
# 导出 CRUSH Map
ceph osd getcrushmap -o /tmp/crushmap.bin
crushtool -d /tmp/crushmap.bin -o /tmp/crushmap.txt
cat /tmp/crushmap.txt
CRUSH Map 结构
# devices (OSD 列表)
device 0 osd.0
device 1 osd.1
device 2 osd.2
# types (桶类型)
type 0 osd
type 1 host
type 2 rack
type 3 row
type 4 room
type 5 datacenter
type 6 root
# buckets (桶层级)
host node1 {
id -2
alg straw2
hash 0
item osd.0 weight 1.000
item osd.1 weight 1.000
}
rack rack1 {
id -3
alg straw2
hash 0
item node1 weight 2.000
}
root default {
id -1
alg straw2
hash 0
item rack1 weight 2.000
}
# rules (放置规则)
rule replicated_rule {
id 0
type replicated
step take default
step chooseleaf firstn 0 type host
step emit
}
3.9 完整组件交互示例
# 模拟完整的数据写入流程
# 1. 查看集群状态
ceph -s
# 2. 创建测试池
ceph osd pool create testpool 32 32 replicated
# 3. 写入测试对象
echo "Hello Ceph Architecture" > /tmp/test.txt
rados put testobj1 /tmp/test.txt -p testpool
# 4. 查看对象在哪个 PG
ceph osd map testpool testobj1
# 记录 PG ID 和 OSD 列表
# 5. 查看 PG 的详细状态
ceph pg dump pgs | grep <pg-id>
# 6. 验证数据完整性
rados get testobj1 /tmp/verify.txt -p testpool
cat /tmp/verify.txt
# 7. 查看 OSD 负载分布
ceph osd df
# 清理
ceph osd pool delete testpool testpool --yes-i-really-really-mean-it
3.10 组件资源消耗参考
| 组件 | CPU | 内存 | 磁盘 I/O | 网络 |
|---|---|---|---|---|
| MON | 低 | 中(1-4GB,随集群规模增长) | 高(SSD 推荐) | 低 |
| MGR | 低 | 低(512MB-2GB) | 低 | 低 |
| OSD | 高 | 高(每 OSD 约 1-4GB) | 高 | 高 |
| MDS | 中 | 高(元数据缓存) | 中 | 中 |
| RGW | 中 | 中 | 低 | 高 |
扩展阅读
下一章:04 - 存储池管理 — 深入学习存储池、PG、副本、纠删码、CRUSH 规则和配额管理。