用最通俗的语言讲解Ceph是什么、三种存储方式的区别、核心概念、以及一步步搭建Ceph集群的完整教程
前言
“分布式存储是什么?”
“Ceph和NAS有什么区别?”
“对象存储、块存储、文件系统存储,我该用哪个?”
“怎么搭一个Ceph集群?”
如果你有以上疑问,这篇文章就是为你准备的。我会用最通俗易懂的方式,讲解Ceph这个看起来很复杂的分布式存储系统。
一、Ceph是什么?
1.1 通俗理解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
┌─────────────────────────────────────────────────────────────────┐
│ Ceph是什么? │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 想象这样一个场景: │ │
│ │ │ │
│ │ 🏠 普通存储: 就像一个仓库 │ │
│ │ ├── 只能放一种东西 │ │
│ │ ├── 仓库满了就得换更大的 │ │
│ │ └── 一旦着火,数据全没 │ │
│ │ │ │
│ │ 🏢 Ceph存储: 就像一个智能仓库集群 │ │
│ │ ├── 可以放任何东西 (图片/视频/文件/数据库) │ │
│ │ ├── 不够用了就加一个新仓库 │ │
│ │ ├── 某个仓库着火? 自动从其他仓库恢复 │ │
│ │ └── 仓库之间会自动搬运、平衡货物 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
1.2 Ceph的定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
┌─────────────────────────────────────────────────────────────────┐
│ Ceph官方定义 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Ceph是一个统一的分布式存储系统,提供: │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 📦 对象存储 (Object Storage) │ │
│ │ ├── 类似亚马逊S3 │ │
│ │ ├── 通过HTTP接口访问 │ │
│ │ └── 适合存储图片、视频、备份等 │ │
│ │ │ │
│ │ 💿 块存储 (Block Storage) │ │
│ │ ├── 类似云硬盘 │ │
│ │ ├── 挂载到虚拟机当硬盘用 │ │
│ │ └── 适合数据库、虚拟机系统盘 │ │
│ │ │ │
│ │ 📁 文件系统存储 (File Storage / CephFS) │ │
│ │ ├── 类似NFS网络文件系统 │ │
│ │ ├── 多个机器可以同时访问 │ │
│ │ └── 适合共享目录、大数据分析 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 一套Ceph,三种存储方式,按需使用! │
│ │
└─────────────────────────────────────────────────────────────────┘
|
1.3 Ceph的应用场景
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
┌─────────────────────────────────────────────────────────────────┐
│ Ceph能做什么? │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 场景1: 给虚拟机提供硬盘 (最常见) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 你的笔记本电脑 ──▶ 虚拟机1 (CentOS) │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ ▼ │ │ │
│ │ │ │ Ceph块存储 (100GB) │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ ▼ │ │ │
│ │ │ │ Ceph集群 │ │ │
│ │ │ │ ┌──┬──┬──┐ │ │ │
│ │ │ │ │盘1│盘2│盘3│ │ │ │
│ │ │ │ └──┴──┴──┘ │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 场景2: 存储海量图片/视频 │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 用户上传图片 ──▶ APP服务器 │ │ │
│ │ │ │ │ │ │
│ │ │ ▼ │ │ │
│ │ │ Ceph对象存储 (像S3一样) │ │ │
│ │ │ │ │ │ │
│ │ │ ▼ │ │ │
│ │ │ 10亿张图片 │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 场景3: 团队共享文件 (类似NFS) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 程序员A ──▶ 共享代码目录 ──┐ │ │ │
│ │ │ │ │ │ │
│ │ │ 程序员B ──▶ 共享代码目录 ──┼── CephFS │ │ │
│ │ │ │ │ │ │
│ │ │ 程序员C ──▶ 共享代码目录 ──┘ │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
二、三种存储方式详解
2.1 块存储 (RBD)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
┌─────────────────────────────────────────────────────────────────┐
│ 块存储 (RBD) 通俗解释 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 什么是"块存储"? │ │
│ │ │ │
│ │ 就把它想象成一块硬盘! │ │
│ │ │ │
│ │ 就像你电脑里的硬盘: │ │
│ │ ├── 可以分区 │ │
│ │ ├── 可以格式化 │ │
│ │ ├── 可以装系统 │ │
│ │ └── 可以存文件 │ │
│ │ │ │
│ │ 不同的是: │ │
│ │ ├── 这块"硬盘"在网络上,不是本地的 │ │
│ │ └── 可以同时给多台虚拟机用 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 块存储使用方式: │ │
│ │ │ │
│ │ # 1. 从Ceph创建一个100GB的"硬盘" │ │
│ │ rbd create mydisk --size 102400 --pool rbd │ │
│ │ │ │
│ │ # 2. 映射到本地 (就像插上了一块新硬盘) │ │
│ │ rbd map mydisk --pool rbd │ │
│ │ │ │
│ │ # 3. 格式化并挂载 │ │
│ │ mkfs.ext4 /dev/rbd0 │ │
│ │ mount /dev/rbd0 /mnt │ │
│ │ │ │
│ │ # 4. 现在/mnt就是一块100GB的网络硬盘! │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 块存储适合的场景: │ │
│ │ ├── ✅ 虚拟机系统盘 │ │
│ │ ├── ✅ 数据库存储 (MySQL/PostgreSQL) │ │
│ │ ├── ✅ Docker/K8s持久化存储 │ │
│ │ └── ✅ 需要高性能随机读写的场景 │ │
│ │ │ │
│ │ 块存储不适合的场景: │ │
│ │ ├── ❌ 多台机器需要同时读写同一个文件 │ │
│ │ └── ❌ 通过HTTP访问文件 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
2.2 对象存储 (RGW)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
┌─────────────────────────────────────────────────────────────────┐
│ 对象存储 (RGW) 通俗解释 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 什么是"对象存储"? │ │
│ │ │ │
│ │ 就把它想象成一个网盘! │ │
│ │ │ │
│ │ 就像七牛云、阿里云OSS、亚马逊S3: │ │
│ │ ├── 上传文件得到一个链接 │ │
│ │ ├── 通过链接下载文件 │ │
│ │ ├── 支持HTTP访问 │ │
│ │ └── 不需要挂载,直接API调用 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 对象存储 vs 块存储: │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 块存储: "一块硬盘" │ │ │
│ │ │ ├── 需要挂载到本地 │ │ │
│ │ │ ├── 文件路径: /mnt/data/file.txt │ │ │
│ │ │ └── 适合程序本地读写 │ │ │
│ │ │ │ │ │
│ │ │ 对象存储: "一个网盘" │ │ │
│ │ │ ├── 通过HTTP上传下载 │ │ │
│ │ │ ├── 文件地址: http://xxx/bucket/file.txt │ │ │
│ │ │ └── 适合web应用、CDN源站 │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 对象存储使用方式: │ │
│ │ │ │
│ │ # 1. 创建存储桶 (bucket) │ │
│ │ radosgw-admin bucket create --bucket=my-images │ │
│ │ │ │
│ │ # 2. 上传文件 (通过HTTP) │ │
│ │ curl -X PUT http://ceph-node/bucket/photo.jpg │ │
│ │ │ │
│ │ # 3. 下载文件 │ │
│ │ curl -O http://ceph-node/bucket/photo.jpg │ │
│ │ │ │
│ │ # 4. 或者用S3 SDK访问 (兼容AWS S3) │ │
│ │ aws s3 cp photo.jpg s3://my-bucket/ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 对象存储适合的场景: │ │
│ │ ├── ✅ 图片/视频存储 (图床、视频点播) │ │
│ │ ├── ✅ 日志/备份归档 │ │
│ │ ├── ✅ 静态网站资源 │ │
│ │ ├── ✅ 大数据分析数据湖 │ │
│ │ └── ✅ 任何需要HTTP访问的数据 │ │
│ │ │ │
│ │ 对象存储不适合的场景: │ │
│ │ ├── ❌ 需要POSIX文件系统的应用 │ │
│ │ └── ❌ 数据库存储 (用块存储) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
2.3 文件系统存储 (CephFS)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
┌─────────────────────────────────────────────────────────────────┐
│ 文件系统存储 (CephFS) 通俗解释 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 什么是"CephFS"? │ │
│ │ │ │
│ │ 就把它想象成网络版的NFS! │ │
│ │ │ │
│ │ 就像公司里共享文件夹: │ │
│ │ ├── 任何人都可以挂载访问 │ │
│ │ ├── 大家看到的是同一个目录 │ │
│ │ ├── 支持标准Linux文件操作 │ │
│ │ └── 多人同时读写也没问题 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ CephFS vs 块存储: │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 块存储: 独占一块硬盘 │ │ │
│ │ │ ├── 虚拟机A的C盘 ──只能A用 │ │ │
│ │ │ ├── 虚拟机B的D盘 ──只能B用 │ │ │
│ │ │ └── 各自独立,不能共享 │ │ │
│ │ │ │ │ │
│ │ │ CephFS: 共享一个目录 │ │ │
│ │ │ ├── 程序员A的 /code ──┬── 同一个目录 │ │ │
│ │ │ ├── 程序员B的 /code ──┼── 同时可见 │ │ │
│ │ │ └── 程序员C的 /code ──┘── 同时编辑 │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ CephFS使用方式: │ │
│ │ │ │
│ │ # 1. 创建一个文件系统 │ │
│ │ ceph fs new myfs metadata data │ │
│ │ │ │
│ │ # 2. 在客户端挂载 │ │
│ │ mount -t ceph 192.168.1.10:6789:/ /mnt/myfs │ │
│ │ │ │
│ │ # 3. 就像使用本地目录一样使用! │ │
│ │ cd /mnt/myfs │ │
│ │ touch file.txt │ │
│ │ ls -la │ │
│ │ │ │
│ │ # 4. 另一台机器也能看到同样的内容 │ │
│ │ mount -t ceph 192.168.1.10:6789:/ /mnt/myfs │ │
│ │ ls /mnt/myfs # 能看到file.txt! │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ CephFS适合的场景: │ │
│ │ ├── ✅ 团队共享代码目录 │ │
│ │ ├── ✅ 大数据分析 (HDFS替代) │ │
│ │ ├── ✅ 机器学习数据集共享 │ │
│ │ ├── ✅ 容器共享存储 (Docker/K8s) │ │
│ │ └── ✅ 任何需要多客户端读写的场景 │ │
│ │ │ │
│ │ CephFS不适合的场景: │ │
│ │ ├── ❌ 需要极低延迟的数据库存储 │ │
│ │ └── ❌ 超大规模文件存储 (用对象存储) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
2.4 三种存储方式对比
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
┌─────────────────────────────────────────────────────────────────┐
│ 三种存储方式对比表 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 对比项 │ 块存储(RBD) │ 对象存储(RGW)│ CephFS │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 访问方式 │ 像硬盘一样 │ 像网盘一样 │ 像NFS一样 │ │
│ │ ──────────────────────────────────────────────────────│ │
│ │ 接口类型 │ 块设备 │ HTTP/S3 │ POSIX │ │
│ │ ──────────────────────────────────────────────────────│ │
│ │ 共享性 │ 独占 │ 可共享 │ 可共享 │ │
│ │ ──────────────────────────────────────────────────────│ │
│ │ 适合文件 │ 数据库 │ 图片/视频 │ 共享目录 │ │
│ │ ──────────────────────────────────────────────────────│ │
│ │ 延迟 │ 最低 │ 中等 │ 中等 │ │
│ │ ──────────────────────────────────────────────────────│ │
│ │ 扩展性 │ 好 │ 最好 │ 好 │ │
│ │ ──────────────────────────────────────────────────────│ │
│ │ 典型用户 │ K8s/虚拟机 │ Web应用/备份 │ 团队共享 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 形象比喻: │ │
│ │ │ │
│ │ 块存储: 一块真正的硬盘 │ │
│ │ ├── 你的电脑插了一块新硬盘 │ │
│ │ └── 可以装系统、放数据库 │ │
│ │ │ │
│ │ 对象存储: 一个网盘 │ │
│ │ ├── 七牛云/阿里云OSS那种 │ │
│ │ └── 通过链接访问,上传下载 │ │
│ │ │ │
│ │ 文件系统: 一个共享文件夹 │ │
│ │ ├── 公司里大家都能访问的共享目录 │ │
│ │ └── 多人同时读写同一个文件 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 💡 实际项目中,往往三种方式都会用到! │
│ │
└─────────────────────────────────────────────────────────────────┘
|
三、Ceph核心概念
3.1 Ceph集群架构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
┌─────────────────────────────────────────────────────────────────┐
│ Ceph集群架构图 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 用户/应用 │ │
│ │ │ │ │
│ │ ┌───────────┼───────────┐ │ │
│ │ │ │ │ │ │
│ │ ▼ ▼ ▼ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ RBD │ │ RGW │ │ CephFS │ │ │
│ │ │ (块存储)│ │(对象存储)│ │(文件系统)│ │ │
│ │ └────┬────┘ └────┬────┘ └────┬────┘ │ │
│ │ └───────────┼───────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────┐ │ │
│ │ │ RADOS │ │ │
│ │ │ (底层存储) │ │ │
│ │ └──────┬──────┘ │ │
│ │ │ │ │
│ └─────────────────────┼────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Ceph集群 │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ 节点1 │ │ 节点2 │ │ 节点3 │ │ │
│ │ │ ┌───────┐ │ │ ┌───────┐ │ │ ┌───────┐ │ │ │
│ │ │ │ MON │ │ │ │ MON │ │ │ │ MON │ │ │ │
│ │ │ └───────┘ │ │ └───────┘ │ │ └───────┘ │ │ │
│ │ │ ┌───────┐ │ │ ┌───────┐ │ │ ┌───────┐ │ │ │
│ │ │ │ MGR │ │ │ │ MGR │ │ │ │ MGR │ │ │ │
│ │ │ └───────┘ │ │ └───────┘ │ │ └───────┘ │ │ │
│ │ │ ┌───────┐ │ │ ┌───────┐ │ │ ┌───────┐ │ │ │
│ │ │ │ OSD │ │ │ │ OSD │ │ │ │ OSD │ │ │ │
│ │ │ │ (盘1) │ │ │ │ (盘1) │ │ │ │ (盘1) │ │ │ │
│ │ │ └───────┘ │ │ └───────┘ │ │ └───────┘ │ │ │
│ │ │ ┌───────┐ │ │ ┌───────┐ │ │ ┌───────┐ │ │ │
│ │ │ │ OSD │ │ │ │ OSD │ │ │ │ OSD │ │ │ │
│ │ │ │ (盘2) │ │ │ │ (盘2) │ │ │ │ (盘2) │ │ │ │
│ │ │ └───────┘ │ │ └───────┘ │ │ └───────┘ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
3.2 核心组件详解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
┌─────────────────────────────────────────────────────────────────┐
│ Ceph核心组件 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ MON (Monitor) - 监视器 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 作用: 集群的"管理员",管理集群状态 │ │
│ │ │ │
│ │ 就像: 公司前台 + 监控系统 │ │
│ │ ├── 知道集群里有哪些机器 │ │
│ │ ├── 知道每台机器上有什么盘 │ │
│ │ └── 记录集群的健康状态 │ │
│ │ │ │
│ │ 特点: │ │
│ │ ├── 一般部署3个或5个 (保证高可用) │ │
│ │ ├── 数据存在内存中,读写极快 │ │
│ │ └── 挂了一个不影响集群运行 │ │
│ │ │ │
│ │ 命令: │ │
│ │ ceph mon stat # 查看MON状态 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ OSD (Object Storage Daemon) - 存储守护进程 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 作用: 真正存数据的地方! │ │
│ │ │ │
│ │ 就像: 仓库里的货架管理员 │ │
│ │ ├── 负责把数据写入磁盘 │ │
│ │ ├── 负责从磁盘读取数据 │ │
│ │ └── 监控自己硬盘的健康状态 │ │
│ │ │ │
│ │ 特点: │ │
│ │ ├── 每块硬盘 = 一个OSD进程 │ │
│ │ ├── OSD之间会互相备份 (多副本) │ │
│ │ └── 坏了一个,数据从其他OSD恢复 │ │
│ │ │ │
│ │ 命令: │ │
│ │ ceph osd tree # 查看OSD树 │ │
│ │ ceph osd status # 查看OSD状态 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ MGR (Manager) - 管理器 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 作用: 集群的"监控和统计" │ │
│ │ │ │
│ │ 就像: 公司的统计部门 │ │
│ │ ├── 收集集群的使用统计 │ │
│ │ ├── 提供Web管理界面 (Dashboard) │ │
│ │ └── 提供各种模块化功能 │ │
│ │ │ │
│ │ 特点: │ │
│ │ ├── 一般部署2个 (主备) │ │
│ │ ├── 不存数据,只提供管理功能 │ │
│ │ └── Dashboard很实用! │ │
│ │ │ │
│ │ 命令: │ │
│ │ ceph mgr stat # 查看MGR状态 │ │
│ │ ceph dashboard # 访问Web界面 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ MDS (Metadata Server) - 元数据服务器 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 作用: CephFS专用,管理文件元数据 │ │
│ │ │ │
│ │ 就像: 图书馆的目录卡片 │ │
│ │ ├── 记录文件在哪 │ │
│ │ ├── 记录文件权限 │ │
│ │ └── 不存文件内容,只存文件信息 │ │
│ │ │ │
│ │ 特点: │ │
│ │ ├── 只有使用CephFS时才需要 │ │
│ │ ├── 一般部署2个 (主备) │ │
│ │ └── 压力不大,配置要求低 │ │
│ │ │ │
│ │ 命令: │ │
│ │ ceph mds stat # 查看MDS状态 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
3.3 数据存储原理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
┌─────────────────────────────────────────────────────────────────┐
│ 数据是怎么存储的? │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 存储过程 (通俗版) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 想象你要把一个文件存入Ceph: │ │
│ │ │ │
│ │ 第1步: 文件被切成小块 │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 文件: [████ ████ ████ ████] │ │ │
│ │ │ 小块1 小块2 小块3 小块4 │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 第2步: 每个小块变成"对象" │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 对象: object.001 object.002 object.003 │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 第3步: 对象被分配到不同的OSD │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ OSD1 ← object.001 │ │ │
│ │ │ OSD2 ← object.002 │ │ │
│ │ │ OSD3 ← object.003 │ │ │
│ │ │ OSD4 ← object.004 │ │ │
│ │ │ │ │ │
│ │ │ (如果是3副本模式,每个对象会存3份) │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ CRUSH算法 (Ceph的秘密武器) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 问题: Ceph怎么知道数据该存到哪个OSD? │ │
│ │ │ │
│ │ 普通存储: 查表 │ │
│ │ ├── 每次读写都要查表 │ │
│ │ └── 表坏了就完了 │ │
│ │ │ │
│ │ Ceph: CRUSH算法 │ │
│ │ ├── 根据数据特征算出来 │ │
│ │ ├── 不需要查表,算法算就行 │ │
│ │ └── 集群拓扑变化时自动重平衡 │ │
│ │ │ │
│ │ 优点: │ │
│ │ ├── 去中心化,不依赖单独元数据服务器 │ │
│ │ ├── 扩展性好,新增OSD不影响旧数据 │ │
│ │ └── 故障恢复自动进行 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ PG (Placement Group) - 放置组 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 为什么需要PG? │ │
│ │ │ │
│ │ 对象太多时: │ │
│ │ ├── 几百万个对象,每个都要算存哪 │ │
│ │ └── 计算量太大 │ │
│ │ │ │
│ │ 解决方案: 用PG分组 │ │
│ │ ├── 多个对象归为一个PG │ │
│ │ ├── 1个PG对应多个OSD (比如3个) │ │
│ │ └── 100个PG → 比100万个对象好管理多了 │ │
│ │ │ │
│ │ 存储流程: │ │
│ │ 对象 → PG(128个) → OSD(3副本) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
3.4 高可用机制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
┌─────────────────────────────────────────────────────────────────┐
│ Ceph是如何保证数据安全的? │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 副本机制 (最常用) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 原理: 一份数据存多份 │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 3副本模式: │ │ │
│ │ │ │ │ │
│ │ │ 原始数据 │ │ │
│ │ │ ├── 副本1 → OSD1 │ │ │
│ │ │ ├── 副本2 → OSD2 │ │ │
│ │ │ └── 副本3 → OSD3 │ │
│ │ │ │ │ │
│ │ │ 坏了一个OSD? 不怕!还有2份! │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 配置: │ │
│ │ ceph osd pool set rbd size 3 # 设置3副本 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 纠删码 (节省空间) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 原理: 类似RAID5/6,用计算换空间 │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 4+2纠删码: │ │ │
│ │ │ │ │ │
│ │ │ 数据块: [D1] [D2] [D3] [D4] │ │ │
│ │ │ │ │ │ │
│ │ │ ▼ │ │ │
│ │ │ 计算出纠删块: [C1] [C2] │ │ │
│ │ │ │ │ │
│ │ │ 总共6块,任意坏2块都能恢复! │ │ │
│ │ │ 存储效率: 4/6 = 67% (比3副本的33%高) │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 适用: 冷数据、备份、归档 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 故障恢复过程 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 当OSD坏了: │ │
│ │ │ │
│ │ 1. MON发现OSD心跳没了 │ │
│ │ ↓ │ │
│ │ 2. 标记这个OSD为down │ │
│ │ ↓ │ │
│ │ 3. 其他OSD开始重建数据 │ │
│ │ ↓ │ │
│ │ 4. 集群恢复到健康状态 │ │
│ │ ↓ │ │
│ │ 5. 你可以换一块新硬盘 │ │
│ │ │ │
│ │ 整个过程自动完成,不需要人工干预! │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
四、集群规划
4.1 最小集群架构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
┌─────────────────────────────────────────────────────────────────┐
│ 最小Ceph集群需要什么? │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 最少3台服务器! │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 为什么是3台? │ │ │
│ │ │ │ │ │
│ │ │ 1. MON需要奇数个 (3或5) │ │ │
│ │ │ └── 2台对半分,3台才能投票出结果 │ │ │
│ │ │ │ │ │
│ │ │ 2. 3副本需要至少3个OSD │ │ │
│ │ │ └── 1个OSD坏了,其他2个还有数据 │ │ │
│ │ │ │ │ │
│ │ │ 3. 3台服务器互为备份 │ │ │
│ │ │ └── 坏1台还能继续服务 │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 每台服务器配置: │ │
│ │ │ │
│ │ CPU: 4核+ │ │
│ │ 内存: 8GB+ (16GB更好) │ │
│ │ 系统盘: 100GB+ SSD (装系统) │ │
│ │ 数据盘: 至少1块 HDD或SSD (存数据) │ │
│ │ 网络: 千兆网络 (万兆更好) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 推荐练习环境配置: │ │
│ │ │ │
│ │ 3台虚拟机 (VirtualBox/VMware): │ │
│ │ ├── CPU: 2核 │ │
│ │ ├── 内存: 4GB │ │
│ │ └── 系统盘: 50GB + 数据盘: 20GB │ │
│ │ │ │
│ │ 这配置练手够用,上生产不够! │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
4.2 生产环境架构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
┌─────────────────────────────────────────────────────────────────┐
│ 生产环境推荐架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 方案A: 3节点混合部署 (适合小规模) │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ 节点1 │ │ 节点2 │ │ 节点3 │ │ │
│ │ │ MON,MGR │ │ MON,MGR │ │ MON,MGR │ │ │
│ │ │ OSD │ │ OSD │ │ OSD │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ │ │ │
│ │ 特点: 所有角色混在一起,简单 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 方案B: 分离部署 (适合中大规模) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 管理节点 (3台) │ │ │
│ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │
│ │ │ │ MON1 │ │ MON2 │ │ MON3 │ │ │ │
│ │ │ │ MGR1 │ │ MGR2 │ │ MGR3 │ │ │ │
│ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │
│ │ │ │ │ │
│ │ │ ───────────────────────────────────────────── │ │ │
│ │ │ │ │ │
│ │ │ 存储节点 (多台) │ │ │
│ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │
│ │ │ │ OSD1 │ │ OSD2 │ │ OSD3 │ │ │ │
│ │ │ │ (盘1) │ │ (盘1) │ │ (盘1) │ │ │ │
│ │ │ │ (盘2) │ │ (盘2) │ │ (盘2) │ │ │ │
│ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 特点: 管理和存储分离,更清晰 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 每台服务器磁盘规划: │ │
│ │ │ │
│ │ 系统盘: 1块 SSD 100-500GB (装系统+日志) │ │
│ │ 数据盘: 多块 HDD或SSD (存数据) │ │
│ │ │ │
│ │ 建议: │ │
│ │ ├── 日志和数据分离 (提升性能) │ │
│ │ └── 每块数据盘配1块SSD做DB journal │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
五、动手部署 Ceph
5.1 环境准备
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
┌─────────────────────────────────────────────────────────────────┐
│ 部署前准备 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 需要的资源 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 3台虚拟机 (或实体机): │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ node1 (192.168.56.10) │ │ │
│ │ │ ├── CPU: 2核 │ │ │
│ │ │ ├── 内存: 4GB │ │ │
│ │ │ ├── 系统盘: 50GB │ │ │
│ │ │ └── 数据盘: 20GB (用于OSD) │ │ │
│ │ │ │ │ │
│ │ │ node2 (192.168.56.11) │ │ │
│ │ │ └── 同上 │ │ │
│ │ │ │ │ │
│ │ │ node3 (192.168.56.12) │ │ │
│ │ │ └── 同上 │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 操作系统: Ubuntu 22.04 (推荐) 或 CentOS 8/Rocky 9 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 基础环境设置 (所有节点) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 1. 设置主机名 │ │
│ │ hostnamectl set-hostname node1 │ │
│ │ # node2、node3同理 │ │
│ │ │ │
│ │ # 2. 配置hosts文件 │ │
│ │ vi /etc/hosts │ │
│ │ # 添加: │ │
│ │ 192.168.56.10 node1 │ │
│ │ 192.168.56.11 node2 │ │
│ │ 192.168.56.12 node3 │ │
│ │ │ │
│ │ # 3. 关闭防火墙 │ │
│ │ sudo systemctl stop ufw │ │
│ │ sudo systemctl disable ufw │ │
│ │ │ │
│ │ # 4. 关闭SELinux (CentOS) │ │
│ │ sudo setenforce 0 │ │
│ │ │ │
│ │ # 5. 关闭swap │ │
│ │ sudo swapoff --all │ │
│ │ sudo sed -i '/ swap / s/^/#/' /etc/fstab │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
5.2 安装 cephadm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
┌─────────────────────────────────────────────────────────────────┐
│ 安装 cephadm │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 方式1: 在线安装 (推荐) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 在node1上执行 (所有节点都要执行) │ │
│ │ │ │
│ │ # Ubuntu安装cephadm │ │
│ │ sudo apt update │ │
│ │ sudo apt install -y cephadm │ │
│ │ │ │
│ │ # CentOS/Rocky安装 │ │
│ │ sudo dnf install -y cephadm │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 方式2: 手动安装 (离线环境) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 下载cephadm源码 │ │
│ │ curl -o cephadm https://github.com/ceph/ceph/raw/ │ │
│ │ main/src/cephadm/cephadm │ │
│ │ │ │
│ │ # 赋予执行权限 │ │
│ │ chmod +x cephadm │ │
│ │ │ │
│ │ # 安装依赖 │ │
│ │ apt install -y python3 docker.io │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 验证安装 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 查看版本 │ │
│ │ cephadm version │ │
│ │ │ │
│ │ # 预期输出: │ │
│ │ # cephadm version 17.2.6 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
5.3 创建集群
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
┌─────────────────────────────────────────────────────────────────┐
│ 创建Ceph集群 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 第一步: 安装集群 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 在node1上执行 │ │
│ │ │ │
│ │ # 引导集群 (指定初始MON节点) │ │
│ │ cephadm bootstrap --mon-ip 192.168.56.10 │ │
│ │ │ │
│ │ # 如果需要自定义配置: │ │
│ │ cephadm bootstrap \ │ │
│ │ --mon-ip 192.168.56.10 \ │ │
│ │ --dashboard-password-prompt \ │ │
│ │ --allow-fqdn-hostname │ │
│ │ │ │
│ │ # 等待执行完成,通常5-10分钟 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 第二步: 查看输出信息 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 成功后会输出类似: │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ Ceph Dashboard is available at: │ │ │
│ │ │ https://node1:8443 │ │ │
│ │ │ │ │ │
│ │ │ Username: admin │ │ │
│ │ │ Password: xxxxxxxx │ │ │
│ │ │ │ │ │
│ │ │ 记录下来! │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 第三步: 添加其他节点 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 在node1上执行,复制ssh密钥到其他节点 │ │
│ │ ssh-copy-id -f -i /etc/ceph/ceph.pub root@node2 │ │
│ │ ssh-copy-id -f -i /etc/ceph/ceph.pub root@node3 │ │
│ │ │ │
│ │ # 添加node2 │ │
│ │ ceph orch host add node2 192.168.56.11 │ │
│ │ │ │
│ │ # 添加node3 │ │
│ │ ceph orch host add node3 192.168.56.12 │ │
│ │ │ │
│ │ # 查看主机列表 │ │
│ │ ceph orch host ls │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
5.4 添加 OSD 存储
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
┌─────────────────────────────────────────────────────────────────┐
│ 添加OSD (数据存储) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 查看可用磁盘 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 查看所有可用磁盘 │ │
│ │ ceph orch device ls │ │
│ │ │ │
│ │ # 或者 │ │
│ │ ceph orch device ls --hostname=node1 │ │
│ │ │ │
│ │ # 预期输出: │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ HOST DEVICE AVAILABLE REFRESHED ... │ │ │
│ │ │ node1 /dev/sdb Yes Yes ... │ │ │
│ │ │ node2 /dev/sdb Yes Yes ... │ │ │
│ │ │ node3 /dev/sdb Yes Yes ... │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ AVAILABLE = Yes 表示可以用于OSD │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 添加OSD的三种方式 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 方式1: 自动发现并添加 (最简单) │ │
│ │ ceph orch apply osd --all-available-devices │ │
│ │ │ │
│ │ # 方式2: 指定特定磁盘 │ │
│ │ ceph orch daemon add osd node1:/dev/sdb │ │
│ │ ceph orch daemon add osd node2:/dev/sdb │ │
│ │ ceph orch daemon add osd node3:/dev/sdb │ │
│ │ │ │
│ │ # 方式3: 使用配置规范 (推荐生产使用) │ │
│ │ cat << 'EOF' > osd_spec.yaml │ │
│ │ service_type: osd │ │
│ │ service_id: my_osds │ │
│ │ placement: │ │
│ │ hosts: │ │
│ │ - node1 │ │
│ │ - node2 │ │
│ │ - node3 │ │
│ │ data_devices: │ │
│ │ paths: │ │
│ │ - /dev/sdb │ │
│ │ EOF │ │
│ │ │ │
│ │ ceph orch apply -i osd_spec.yaml │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 查看OSD状态 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 查看OSD树 │ │
│ │ ceph osd tree │ │
│ │ │ │
│ │ # 查看OSD状态 │ │
│ │ ceph osd status │ │
│ │ │ │
│ │ # 预期输出: │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ ID CLASS TYPE STATUS REWEIGHT IN │ │ │
│ │ │ 0 hdd osd up 1.0 yes │ │ │
│ │ │ 1 hdd osd up 1.0 yes │ │ │
│ │ │ 2 hdd osd up 1.0 yes │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
5.5 创建存储池和启用服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
┌─────────────────────────────────────────────────────────────────┐
│ 创建存储池和启用服务 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 查看集群状态 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 查看集群健康状态 │ │
│ │ ceph status │ │
│ │ │ │
│ │ # 预期输出: │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ cluster: │ │ │
│ │ │ id: xxxxxxxx-xxxx-xxxx │ │ │
│ │ │ health: HEALTH_OK │ │ │
│ │ │ │ │ │
│ │ │ services: │ │ │
│ │ │ mon: 3 daemons, quorum node1,node2,node3 │ │ │
│ │ │ mgr: 1 daemon active │ │ │
│ │ │ osd: 3 osds: 3 up, 3 in │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ HEALTH_OK = 集群健康! │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 创建块存储池 (RBD) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 1. 创建RBD存储池 │ │
│ │ ceph osd pool create rbd 32 │ │
│ │ │ │
│ │ # 2. 初始化RBD │ │
│ │ rbd pool init rbd │ │
│ │ │ │
│ │ # 3. 设置副本数 │ │
│ │ ceph osd pool set rbd size 3 │ │
│ │ │ │
│ │ # 4. 创建一个100GB的镜像 │ │
│ │ rbd create rbd/mydisk --size 102400 --image-feature layering │ │
│ │ │ │
│ │ # 5. 查看镜像列表 │ │
│ │ rbd list rbd │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 启用对象存储网关 (RGW) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 1. 创建一个zonegroup和zone │ │
│ │ radosgw-admin zonegroup create --master --default │ │
│ │ radosgw-admin zone create --master --default │ │
│ │ │ │
│ │ # 2. 启用RGW服务 │ │
│ │ ceph orch apply rgw myrgw --realm=default --zone=default --placement="1 node1" │ │
│ │ │ │
│ │ # 3. 查看RGW服务状态 │ │
│ │ ceph orch ps | grep rgw │ │
│ │ │ │
│ │ # 4. 创建RGW用户 │ │
│ │ radosgw-admin user create --uid="myuser" --display-name="My User" | tee user.json │
│ │ │ │
│ │ # 5. 查看用户信息 (记住access_key和secret_key) │ │
│ │ cat user.json | grep -E "access_key|secret_key" │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 启用CephFS文件系统 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 1. 创建两个存储池 (元数据+数据) │ │
│ │ ceph osd pool create cephfs_metadata 32 │ │
│ │ ceph osd pool create cephfs_data 32 │ │
│ │ │ │
│ │ # 2. 创建文件系统 │ │
│ │ ceph fs new myfs cephfs_metadata cephfs_data │ │
│ │ │ │
│ │ # 3. 部署MDS (元数据服务器) │ │
│ │ ceph orch apply mds myfs --placement="3 node1 node2 node3" │ │
│ │ │ │
│ │ # 4. 查看文件系统 │ │
│ │ ceph fs ls │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
5.6 客户端使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
┌─────────────────────────────────────────────────────────────────┐
│ 客户端使用Ceph │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 使用块存储 (RBD) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 1. 安装ceph客户端 │ │
│ │ sudo apt install -y ceph-common │ │
│ │ │ │
│ │ # 2. 复制密钥 │ │
│ │ ssh node1 "ceph auth get-or-create client.admin" | \ │ │
│ │ sudo tee /etc/ceph/ceph.client.admin.keyring │ │
│ │ scp /etc/ceph/ceph.conf node1:/etc/ceph/ │ │
│ │ │ │
│ │ # 3. 映射块设备 │ │
│ │ sudo rbd map rbd/mydisk │ │
│ │ │ │
│ │ # 4. 格式化 │ │
│ │ sudo mkfs.ext4 /dev/rbd0 │ │
│ │ │ │
│ │ # 5. 挂载使用 │ │
│ │ sudo mount /dev/rbd0 /mnt │ │
│ │ │ │
│ │ # 6. 测试 │ │
│ │ cd /mnt && sudo dd if=/dev/zero of=test bs=1M count=100 │
│ │ ls -lh test │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 使用对象存储 (S3兼容) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 1. 安装s3客户端 │ │
│ │ pip install boto3 │ │
│ │ │ │
│ │ # 2. Python示例代码 │ │
│ │ cat << 'EOF' > s3_test.py │ │
│ │ import boto3 │ │
│ │ import botocore │ │
│ │ │ │
│ │ # 连接RGW │ │
│ │ s3 = boto3.client( │ │
│ │ 's3', │ │
│ │ endpoint_url='http://node1:80', │ │
│ │ aws_access_key_id='YOUR_ACCESS_KEY', │ │
│ │ aws_secret_access_key='YOUR_SECRET_KEY', │ │
│ │ region_name='us-east-1' │ │
│ │ ) │ │
│ │ │ │
│ │ # 创建桶 │ │
│ │ s3.create_bucket(Bucket='my-bucket') │ │
│ │ │ │
│ │ # 上传文件 │ │
│ │ s3.upload_file('test.txt', 'my-bucket', 'test.txt')│ │
│ │ │ │
│ │ # 下载文件 │ │
│ │ s3.download_file('my-bucket', 'test.txt', '/tmp/test.txt')│ │
│ │ EOF │ │
│ │ │ │
│ │ python s3_test.py │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 使用CephFS (文件系统) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 1. 安装ceph-fuse │ │
│ │ sudo apt install -y ceph-fuse │ │
│ │ │ │
│ │ # 2. 创建挂载点 │ │
│ │ sudo mkdir -p /mnt/cephfs │ │
│ │ │ │
│ │ # 3. 挂载CephFS │ │
│ │ sudo mount -t ceph node1:6789:/ /mnt/cephfs │ │
│ │ │ │
│ │ # 4. 或者使用内核驱动 (更高效) │ │
│ │ sudo yum install -y ceph-common # CentOS │ │
│ │ sudo mount -t ceph 192.168.56.10:6789:/ /mnt/cephfs │ │
│ │ │ │
│ │ # 5. 测试 │ │
│ │ cd /mnt/cephfs │ │
│ │ touch test_file.txt │ │
│ │ echo "Hello CephFS!" > test_file.txt │ │
│ │ cat test_file.txt │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
六、常用运维命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
┌─────────────────────────────────────────────────────────────────┐
│ Ceph常用运维命令速查 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 集群状态查看 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ ceph status # 集群整体状态 │ │
│ │ ceph health detail # 健康状态详情 │ │
│ │ ceph -s # 简写 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ OSD管理 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ ceph osd tree # OSD树 │ │
│ │ ceph osd status # OSD状态 │ │
│ │ ceph osd df # OSD使用率 │ │
│ │ ceph osd pool ls # 存储池列表 │ │
│ │ │ │
│ │ # OSD维护 │ │
│ │ ceph osd stop 0 # 停止OSD 0 │ │
│ │ ceph osd start 0 # 启动OSD 0 │ │
│ │ ceph osd reweight 0 0.5 # 调整权重 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ MON/MGR管理 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ ceph mon stat # MON状态 │ │
│ │ ceph mon dump # MON详细信息 │ │
│ │ ceph mgr stat # MGR状态 │ │
│ │ ceph mgr services # MGR服务列表 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 存储池管理 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ ceph osd pool ls # 列出所有池 │ │
│ │ ceph osd pool create mypool 64 # 创建池 │ │
│ │ ceph osd pool delete mypool # 删除池 │ │
│ │ ceph osd pool set mypool size 3 # 设置副本数 │ │
│ │ ceph osd pool get mypool size # 查看副本数 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ RBD管理 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ rbd list # 列出镜像 │ │
│ │ rbd info -p rbd mydisk # 镜像详情 │ │
│ │ rbd create rbd/newdisk --size 51200 # 创建镜像 │ │
│ │ rbd rm rbd/olddisk # 删除镜像 │ │
│ │ rbd resize rbd/mydisk --size 204800 # 扩容 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 故障排查 │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 查看日志 │ │
│ │ journalctl -u ceph-osd@0 -f │ │
│ │ journalctl -u ceph-mon@node1 -f │ │
│ │ │ │
│ │ # 查看OSD日志 │ │
│ │ ceph logs │ │
│ │ │ │
│ │ # 健康检查 │ │
│ │ ceph health detail │ │
│ │ ceph pg dump_stuck stale │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
七、常见问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
┌─────────────────────────────────────────────────────────────────┐
│ 常见问题解答 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Q1: 集群 HEALTH_WARN 怎么办? │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 先查看详情 │ │
│ │ ceph health detail │ │
│ │ │ │
│ │ # 常见原因: │ │
│ │ ├── OSD数量不足 │ │
│ │ ├── PG数量不足 │ │
│ │ ├── 网络延迟 │ │
│ │ └── 某个OSD挂了 │ │
│ │ │ │
│ │ # 解决方法: │ │
│ │ ceph osd set noout # 防止数据迁移 │ │
│ │ # 修复问题后: │ │
│ │ ceph osd unset noout │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Q2: OSD坏了怎么办? │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ Ceph会自动处理: │ │
│ │ 1. MON检测到OSD心跳丢失 │ │
│ │ 2. 标记OSD为down │ │
│ │ 3. 其他OSD自动重建数据 │ │
│ │ 4. 集群自动恢复健康 │ │
│ │ │ │
│ │ 人工处理: │ │
│ │ # 1. 把OSD踢出集群 │ │
│ │ ceph osd out 0 │ │
│ │ │ │
│ │ # 2. 停止OSD进程 │ │
│ │ systemctl stop ceph-osd@0 │ │
│ │ │ │
│ │ # 3. 更换硬盘后重新添加 │ │
│ │ ceph orch daemon add osd node1:/dev/sdb │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Q3: 如何扩容Ceph集群? │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ # 添加新节点: │ │
│ │ ceph orch host add newnode 192.168.56.20 │ │
│ │ │ │
│ │ # 在新节点添加OSD: │ │
│ │ ceph orch daemon add osd newnode:/dev/sdb │ │
│ │ │ │
│ │ # Ceph会自动平衡数据! │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Q4: Ceph和NAS/普通存储的区别? │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 普通NAS/存储: │ │ │
│ │ │ ├── 容量有限 │ │ │
│ │ │ ├── 坏一块盘可能全部丢失 │ │ │
│ │ │ └── 需要人工备份 │ │ │
│ │ │ │ │ │
│ │ │ Ceph: │ │ │
│ │ │ ├── 容量可无限扩展 │ │ │
│ │ │ ├── 多副本保证数据安全 │ │ │
│ │ │ ├── 故障自动恢复 │ │ │
│ │ │ └── 支持三种存储方式 │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
八、总结
8.1 Ceph核心要点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
┌─────────────────────────────────────────────────────────────────┐
│ Ceph学习要点 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1. 一个系统,三种存储方式 │ │
│ │ ├── RBD = 块存储 (像硬盘) │ │
│ │ ├── RGW = 对象存储 (像S3网盘) │ │
│ │ └── CephFS = 文件系统 (像NFS共享目录) │ │
│ │ │ │
│ │ 2. 核心组件要记住 │ │
│ │ ├── MON = 集群监视器 (管状态) │ │
│ │ ├── OSD = 存储守护进程 (存数据) │ │
│ │ ├── MGR = 管理器 (监控统计) │ │
│ │ └── MDS = 元数据服务器 (CephFS专用) │ │
│ │ │ │
│ │ 3. 高可用靠多副本 │ │
│ │ ├── 3副本 = 坏1个OSD不怕 │ │
│ │ ├── 自动故障恢复 │ │
│ │ └── 自动数据重平衡 │ │
│ │ │ │
│ │ 4. 用cephadm部署简单 │ │
│ │ ├── bootstrap初始化 │ │
│ │ ├── 添加主机 │ │
│ │ ├── 添加OSD │ │
│ │ └── 创建存储池和启用服务 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
|
8.2 下一步学习建议
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
┌─────────────────────────────────────────────────────────────────┐
│ 下一步学习路径 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 初级: 熟练基本操作 │
│ ├── 完成本文的部署练习 │
│ ├── 练习创建/删除存储池 │
│ ├── 练习RBD/CephFS的使用 │
│ └── 模拟OSD故障,观察恢复过程 │
│ │
│ 中级: 深入原理 │
│ ├── 学习CRUSH算法原理 │
│ ├── 学习PG的工作机制 │
│ ├── 学习故障恢复流程 │
│ └── 学习性能调优 │
│ │
│ 高级: 生产部署 │
│ ├── 学习生产环境架构设计 │
│ ├── 学习监控和告警配置 │
│ ├── 学习数据迁移和备份 │
│ └── 学习Kubernetes CSI集成 │
│ │
└─────────────────────────────────────────────────────────────────┘
|
希望这篇教程能帮助你入门Ceph!记住,多动手、多折腾是学习Ceph最好的方式。