Akemi

OSD存储后端BlueStore介绍与生成OSD

2025/07/02

这块知识了解即可,并不是很重要,BlueStore现在替换了FileStore成为了ceph默认的存储后端

存储后端指的是OSD用于在本地磁盘上实际存储和管理数据的底层引擎。它决定了数据如何被写入磁盘、如何管理元数据、如何保证一致性等核心功能。

BlueStore直接将对象存储在原始块设备上,并消除了文件系统层,从而提高了读写操作速度。

BlueStore将对象元数据存储在块数据库block-database中,块数据库将元数据以k/v的形式存储在rocketsDB数据库中

块数据库被放在一个想叫的BlueFS分区上,专门用来保存RocksDB文件

组件 存储内容 推荐设备类型
WAL预写日志 写前日志(Write-Ahead Log) 高速 SSD(如 NVMe)
DB块数据库 元数据(RocksDB 键值数据库) 高速 SSD
Data数据 实际对象数据 HDD/SSD

BlueStore存储后端具有以下特性:
1.允许对数据、块数据库和预写日志(WAL)使用不同的设备。
2.支持使用HDD、SSD和NVMe设备的几乎任何组合。
3.在原始设备或分区上操作,消除了对存储设备的双重写入,提高了元数据效率。
4.用校验和写入所有数据和元数据。在返回到客户端之前,所有读操作都使用相应的校验和进行验证。

默认情况下会将这三个放在同一个设备上,但BlueStore的性能优势主要来源于WAL和DB,可以通过将WAL和DB放在SSD设备上来提高性能

使用服务配置特定文件

可以使用服务配置特定文件来定义WAL、DB和Data的位置,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
service_type: osd
service_id: osd_example
placement:
host_pattern: '*'
data_devices:
paths:
- /dev/vda
db_devices:
paths:
- /dev/nvme0
wal_devices:
paths:
- /dev/nvme1

默认情况下,BlueStore是自调优的,但如果需要,你可以手动调优BlueStore参数

BlueStore数据库分片

BlueStore可以限制存储在RocksDB中的大型omap对象的大小,并将它们分布到多个位置上,这个过程被称为分片(sharding)。在使用分片时,集群将具有相似访问和修改频率的键分组,以提高性能和节省磁盘空间。

分片可以减轻RocksDB压缩的影响。在压缩数据库之前,RocksDB必须达到一定的已用空间,这可能会影响OSD性能。有了分片,这些操作独立于所使用的空间级别,允许更精确的压缩并最小化对OSD性能的影响。

默认情况下分片是启用的

ceph config get osd.1 bluestore_rocksdb_cf

生成BlueStore OSD的方式

可以使用ceph orchestrator在集群中添加或删除OSD
1.设备不能有分区
2.设备不能挂载
3.设备至少有5GB的空间
4.设备不能包含Ceph BlueStore OSD。

ceph orch device ls列出集群中跨主机的设备

ceph orch device zap命令准备设备,该命令会删除所有分区并清除设备中的数据,使其可以被供应,加入force参数,可以确保删除OSD之前创建的任何分区
ceph orch device zap node /dev/vda --force(危险操作)

编排器生成

ceph orch apply osd --all-available-devices
自动检测并部署集群中所有主机上所有可用且符合条件的存储设备作为 OSD 数据盘
这条命令会创建一个叫做osd.all-available-devices的OSD服务并且开启编排服务来管理所有的OSD生成

这个服务会使用ceph orch device zap来准备设备

使用orch守护进程生成(推荐)

通过指定的设备和主机创建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
# ================================================
# OSD 管理命令集 (cephadm Orchestrator)
# 适用版本: Ceph Quincy (v17.2+) 或更高
# ================================================

# 1. 列出所有 OSD 及其状态
ceph orch ps --daemon-type osd # 显示所有 OSD 守护进程状态(主机/容器/状态)
ceph osd tree # 显示 OSD 在 CRUSH 中的层级位置

# 2. 添加 OSD
# 基本格式: ceph orch daemon add osd <节点>:<设备路径>
ceph orch daemon add osd node1:/dev/sdb # 在 node1 上使用 /dev/sdb 创建新 OSD
ceph orch daemon add osd node2:/dev/nvme0n1 # 使用 NVMe 设备

# 批量添加(所有可用设备)
ceph orch apply osd --all-available-devices # 在所有主机上添加未使用的磁盘

# 3. 安全移除 OSD 流程(必须按顺序执行)
# 步骤 1: 停止 OSD 守护进程
ceph orch daemon stop osd.12 # 安全停止 osd.12 服务

# 步骤 2: 检查是否可安全移除
ceph osd safe-to-destroy osd.12 # 确认 PG 已迁移完成(必须返回 safe to destroy)

# 步骤 3: 移除守护进程
ceph orch daemon rm osd.12 # 删除守护进程(清理 systemd 服务和容器)

# 步骤 4: 从集群删除记录
ceph osd purge 12 --yes-i-really-mean-it # 从集群元数据彻底删除 OSD (推荐)
# 或传统两步法:
# ceph osd rm 12 # 删除 OSD ID
# ceph auth del osd.12 # 删除认证密钥

# 步骤 5: 清理磁盘数据 (可选)
ssh node1 ceph-volume lvm zap /dev/sdb --destroy # 擦除磁盘数据

# 4. 替换 OSD(保留相同 ID)
ceph orch osd rm 12 --replace # 安全移除并自动用新磁盘重建相同 OSD ID

# 5. OSD 配置管理
ceph orch daemon reconfig osd.12 # 重新加载 OSD.12 的配置(无需重启)
ceph orch redeploy osd.12 # 强制重建 OSD 容器(修复损坏的守护进程)

# 6. 批量操作
ceph orch osd rm 12 13 14 # 批量移除多个 OSD
ceph orch device zap node1 /dev/sdb /dev/sdc --force # 擦除多个磁盘

# 7. 高级部署
# 使用特定设备类型(SSG/HDD)部署
ceph orch apply osd --all-available-devices \
--filter='vendor=INTEL model=SSD' # 仅使用 Intel SSD 创建 OSD

# 8. 查看设备清单
ceph orch device ls # 列出所有节点上的可用设备
ceph orch device ls --host node1 # 查看特定节点的设备

# 9. OSD 服务状态操作
ceph orch daemon start osd.12 # 启动已停止的 OSD
ceph orch daemon restart osd.12 # 重启 OSD 守护进程

# ================================================
# 关键注意事项:
# 1. 移除 OSD 前必须确认 safe-to-destroy
# 2. 生产环境操作前建议先 --dry-run 测试
# 3. 磁盘操作需要物理权限(尤其 SSD/NVMe)
# ================================================

服务规范文件生成(推荐)

通过服务规范文件来描述OSD服务的集群布局

一个osd_size_and_model类型的服务,一个osd_host_and_path类型的服务

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
service_type: osd
service_id: osd_size_and_model
placement:
host_pattern: '*'
data_devices:
size: '100G:'
db_devices:
model: My-Disk
wal_devices:
size: '10G:20G'
unmanaged: true
---
service_type: osd
service_id: osd_host_and_path
placement:
host_pattern: 'node[6-10]'
data_devices:
paths:
- /dev/sdb
db_devices:
paths:
- /dev/sdc
wal_devices:
paths:
- /dev/sdd
encrypted: true

ceph orch apply -i service_spec.yaml

通过ceph-volume命令行生成(传统方式)

ceph-volume是Ceph中专门用于管理 OSD 物理设备的命令行工具,取代了旧的ceph-disk工具

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# ======================================================
# 🛠️ OSD 创建与部署
# ======================================================

# 创建基础 OSD (使用单个设备)
ceph-volume lvm create --data /dev/sdb # 在 /dev/sdb 上创建 BlueStore OSD

# 创建高级 OSD (分离 WAL/DB 设备)
ceph-volume lvm create --data /dev/sdd \ # 主数据设备
--block.wal /dev/nvme0n1p1 \ # WAL 设备 (高性能日志)
--block.db /dev/nvme0n1p2 # DB 设备 (元数据存储)

# 创建加密 OSD
ceph-volume lvm create --data /dev/sdb --dmcrypt # 使用 dm-crypt 加密设备

# 批量创建 OSD (脚本示例)
for disk in /dev/sd{b,c,d}; do
ceph-volume lvm create --data $disk
done

# ======================================================
# 🔍 OSD 发现与信息查询
# ======================================================

# 列出所有基于 LVM 的 OSD
ceph-volume lvm list # 显示所有 OSD 及其关联设备

# 列出特定主机上的设备
ceph-volume inventory --hostname node1 # 显示 node1 上的所有存储设备

# 检查单个设备详细信息
ceph-volume inventory --device /dev/sdb # 查看 /dev/sdb 的详细规格和可用性

# 列出所有 OSD FSID
ceph-volume lvm list --format json | jq '.[] | .[0].tags."ceph.osd_fsid"' # 提取所有 OSD 的 FSID

# ======================================================
# ⚙️ OSD 激活与启动管理
# ======================================================

# 激活单个 OSD
ceph-volume lvm activate 0 abc123-456-789 # 激活 osd.0 (需提供 OSD ID 和 FSID)

# 激活所有检测到的 OSD
ceph-volume lvm activate --all # 激活所有未运行的 OSD

# 生成 systemd 服务文件但不激活
ceph-volume lvm activate 0 abc123-456-789 --no-start # 仅生成服务文件

# ======================================================
# 🗑️ OSD 销毁与清理
# ======================================================

# 安全销毁 OSD (保留日志)
ceph-volume lvm destroy --osd-id 0 # 销毁 osd.0 但保留设备结构

# 完全清理设备 (危险!)
ceph-volume lvm zap /dev/sdb --destroy # 彻底擦除设备并移除所有 Ceph 痕迹

# 批量清理多个设备
ceph-volume lvm zap /dev/sdb /dev/sdc /dev/sdd # 同时清理多个设备

# ======================================================
# 🔄 迁移与调整
# ======================================================

# 迁移 OSD 到新设备
ceph-volume lvm migrate --osd-id 0 --from /dev/sdb --to /dev/sdc # 将 osd.0 从 sdb 迁移到 sdc

# 调整 BlueStore 大小
ceph-volume lvm bluefs-bdev-expand --osd-id 0 # 扩展 osd.0 的 BlueFS 空间

# ======================================================
# 🛡️ 加密管理
# ======================================================

# 准备加密设备但不创建 OSD
ceph-volume lvm prepare --data /dev/sdb --dmcrypt # 仅准备加密设备

# 激活加密 OSD
ceph-volume lvm activate --dmcrypt 0 abc123-456-789 # 激活加密的 osd.0

# ======================================================
# 🔧 故障排查与调试
# ======================================================

# 详细日志输出
ceph-volume --log-level debug lvm list # 开启调试级别日志

# 模拟执行 (dry-run)
ceph-volume lvm create --data /dev/sdb --dry-run # 显示操作步骤但不实际执行

# 检查 LVM 元数据
vgdisplay -v ceph-$(ceph-volume lvm list --format json | jq -r '.[0][0].tags."ceph.vg_uuid"') # 检查 OSD 的 LVM 卷组

# ======================================================
# 📊 设备报告与信息提取
# ======================================================

# JSON 格式输出
ceph-volume lvm list --format json # 机器可读的输出格式

# 仅显示设备路径
ceph-volume inventory | jq -r '.[] | select(.available) | .path' # 列出所有可用设备路径

# 检查设备是否被 Ceph 使用
ceph-volume inventory --device /dev/sdb | jq '.[].ceph_device' # 返回 true/false

原文作者:王盛

原文链接:https://akemi.zj.cn/2025/07/02/Ceph-OSD/

发表日期:July 2nd 2025, 7:12:24 pm

更新日期:July 2nd 2025, 7:18:42 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. 使用服务配置特定文件
  2. 2. BlueStore数据库分片
  3. 3. 生成BlueStore OSD的方式
    1. 3.1. 编排器生成
    2. 3.2. 使用orch守护进程生成(推荐)
    3. 3.3. 服务规范文件生成(推荐)
    4. 3.4. 通过ceph-volume命令行生成(传统方式)