强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 对象包含:

组件说明
OIDObject ID,全局唯一标识符
Data对象的实际数据内容
XATTRs扩展属性键值对
OMAPObject 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 MapMON 节点列表和地址
OSD MapOSD 状态(up/down/in/out)、权重
PG MapPG 状态和映射关系
CRUSH Map存储拓扑和放置规则
MDS MapMDS 状态(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
模块功能建议
dashboardWeb 管理界面启用
prometheusPrometheus 指标导出启用
balancerPG 自动均衡启用
pg_autoscalerPG 数量自动调整启用
crash崩溃数据收集启用
telemetry遥测数据上报按需
iostatI/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正在回填数据⚠️
peeringPG 正在建立对等关系⚠️
inactivePG 不可用
stalePG 状态过期
# 查看所有 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_numPG 的数量,影响数据分布粒度
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

扩展阅读

  1. RADOS 文档
  2. CRUSH Map 详解
  3. PG 计算器
  4. OSD 配置参考

下一章04 - 存储池管理 — 深入学习存储池、PG、副本、纠删码、CRUSH 规则和配额管理。