三节点 Ceph 学习集群部署——openEuler机器为例

2026-9-14 125 9/14

此为ai辅助生成,经过博主的实践检验,保证适配机器部署成功

 

openEuler  三节点 Ceph 学习集群部署教程

10 GB 磁盘精简版 · 从零到 HEALTH_OK

适用于 Ceph Tentacle 20.2.x + cephadm 容器化部署

 

第 0 章 先看清你的磁盘到底长什么样

关键前提  df -h 只能看到「已经挂载」的文件系统,看不到没分区、没挂载的空盘。你看到根分区 17G,并不代表机器上没有第二块盘。判断有没有可用数据盘,必须看 lsblk,而不是 df。

0.1 第一步:用 lsblk 确认有没有独立的空盘

在三台机器上各执行一次:

 

lsblk -f

 

对照下面的结果决定走哪条线:

lsblk 看到的情况 含义 走哪条线 集群可用容量
除了 sda,还有 sdb 且 FSTYPE 列为空 有独立空盘,只是没格式化所以 df 看不到 第 6 章 A 方案 约 9 GB
只有 sda 一块盘,下面只有 sda1 / sda2 确实只有一块系统盘 第 6 章 B 方案 约 5 – 6 GB

 

 

提醒  后面创建 RBD 镜像时,单个镜像不要超过 2 GB(B 方案)或 5 GB(A 方案),否则写入时会直接把集群撑到只读。

第 1 章 环境规划

1.1 三台机器的角色分配

节点 主机名 IP 地址 角色 数据盘
节点 1 ceph40 192.168.128.40 MON + MGR + OSD /dev/sdb
节点 2 ceph44 192.168.128.44 MON + MGR + OSD /dev/sdb
节点 3 ceph45 192.168.128.45 MON + MGR + OSD /dev/sdb

 

注意  请替换成你实际的 IP,名称等自定义,这里作参考。三台都跑 MON/MGR/OSD,这是三节点小型集群的标准做法。

 

1.2 实际配置与最低要求对照

项目 最低要求 你的实测值 结论
CPU 2 核 需自行确认 nproc 查看,2 核即可运行
内存 4 GB 需自行确认 free -h 查看,4 GB 够用
系统盘 15 GB 17 GB(可用 14 GB) 达标,但需按第 7 章精简
独立数据盘 非必需 待 lsblk 确认 有则走 A 方案,无则走 B 方案

 

内存和 CPU 用下面两条命令确认:

free -h      # 看 Mem 行的 total

nproc        # 看 CPU 核数

 

1.3 为什么选 Ceph Tentacle 20.2.x

版本选错,等于一开始就在用过期的东西。当前(2026 年 9 月)各版本生命周期如下:

版本 状态 生命周期结束 是否推荐
Reef 18.2.x 已 EOL 2026-03-31 不推荐,已停止安全修复
Squid 19.2.x 活跃 2026-09-19 即将到期,不建议新装
Tentacle 20.2.x 活跃 2027-11-18 推荐,新部署首选

 

特别提醒  openEuler 系统自带源里的 ceph 是 18.2.2(Reef),已经 EOL,不要直接用 dnf install ceph 安装。本文用官方 cephadm 脚本部署 v20,容器镜像与工具版本天然一致。

 

第 2 章 系统准备(三台机器都要做)

操作身份  以下全部命令都以 root 执行。你的登录用户是普通用户,请先执行 sudo -i 切换,避免每条命令都加 sudo。

2.1 切换到 root

sudo -i

2.2 设置主机名(各自执行,不要搞混)

三台机器分别执行对应的一条:

# 第 1 台(192.168.128.40)

hostnamectl set-hostname ceph40

 

# 第 2 台(192.168.128.44)

hostnamectl set-hostname ceph44

 

# 第 3 台(192.168.128.45)

hostnamectl set-hostname ceph45

 

虚拟机默认主机名是 localhost.localdomain,cephadm 会直接拒绝启动。改完后执行 exit 再 sudo -i 重新登录,提示符才会变。

 

2.3 配置 hosts(三台都执行,内容完全一样)

cat >> /etc/hosts <<'EOF'

192.168.128.40 ceph40

192.168.128.44 ceph44

192.168.128.45 ceph45

EOF

验证能否互相解析:

ping -c 2 ceph44 && ping -c 2 ceph45

 

2.4 时间同步(必须做)

Ceph 对时钟极其敏感,节点之间时间差过大,MON 会直接拒绝服务。

dnf install -y chrony

systemctl enable --now chronyd

chronyc sources -v

输出中某一行前面带 * 号,说明已经成功同步到时间源。

2.5 关闭 SELinux

 

openEuler 默认开启 SELinux,会拦截容器挂载磁盘,导致 OSD 创建失败。

setenforce 0

sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

getenforce          # 应输出 Permissive

2.6 开放防火墙端口

 

学习环境可以 systemctl disable --now firewalld 一关了之,但建议按下面开端口,顺便记住生产环境该开什么:

firewall-cmd --permanent --add-port=6789/tcp      # MON(v1 协议)

firewall-cmd --permanent --add-port=3300/tcp      # MON(v2 协议)

firewall-cmd --permanent --add-port=6800-7300/tcp # OSD 通信

firewall-cmd --permanent --add-port=8443/tcp      # Dashboard 网页

firewall-cmd --reload

firewall-cmd --list-ports

 

2.7 安装容器运行时与依赖

dnf install -y podman lvm2 python3 chrony

systemctl enable --now podman

podman --version

 

关于磁盘空间  装完立刻清理一次 dnf 缓存,能回收几百 MB,10G 环境下这点空间很宝贵:dnf clean all

 

2.8 确认数据盘

lsblk -f

找到那块没有分区、没有 FSTYPE、没有挂载点的盘。常见名称是 /dev/sdb 或 /dev/vdb。

看到的情况 含义 怎么做
有 /dev/sdb 且无 FSTYPE 干净的裸盘,正是我们要的 记下设备名,第 6 章直接用
/dev/sdb 已有分区或文件系统 之前用过的盘 执行 wipefs -a /dev/sdb 清空
只有系统盘,没有第二块盘 情况 B 关机加一块 10G 盘,或用第 6 章 B 方案的 loop 文件

第 3 章 初始化集群(仅在 ceph40 上执行)

3.1 下载官方 cephadm

cd /root

curl -O https://download.ceph.com/rpm-20.2.4/el9/noarch/cephadm

chmod +x cephadm

./cephadm version

 

如果下载失败  说明 20.2.4 的 rpm 目录尚未同步,把 URL 里的版本号改成 20.2.3 再试一次即可,两者部署流程完全一致。

 

3.2 引导集群(核心命令)

这是整个部署中最重要的一条命令,注意 --skip-monitoring-stack 是 10G 环境的必选项:

./cephadm bootstrap \

--mon-ip 192.168.128.40 \

--initial-dashboard-user admin \

--initial-dashboard-password Admin@123 \

--skip-monitoring-stack

这条命令自动做了什么

  1. 在本机拉起第一个 MON 和 MGR 容器,集群正式成立
  2. 生成集群专属 SSH 密钥,公钥存放在 /etc/ceph/ceph.pub
  3. 生成最小配置文件 /etc/ceph/ceph.conf
  4. 生成管理员密钥 /etc/ceph/ceph.client.admin.keyring(这是集群的命根子)
  5. 给本机打上 _admin 标签,允许执行 ceph 管理命令
  6. 跳过 Prometheus / Grafana / Alertmanager / node-exporter(本教程刻意省略)

 

执行过程约 3–10 分钟,主要取决于拉取容器镜像的速度。看到 Bootstrap complete. 即成功,屏幕上会打印 Dashboard 地址:

Ceph Dashboard is now available at:

URL: https://ceph40:8443/

User: admin

Password: Admin@123

 

3.3 配置 ceph 命令别名

推荐用容器方式调用 ceph 命令,版本永远和集群一致,不会出现客户端与集群版本不匹配的问题:

echo "alias ceph='/root/cephadm shell -- ceph'" >> ~/.bashrc     #注意/root/cephadm为安装的cephadm可执行文件位置,如果更改了位置要注意修改

source ~/.bashrc

ceph -s

 

小提示  第一次执行会拉取镜像并启动容器,稍慢;之后就和普通命令一样快。看到 health: HEALTH_WARN 属正常,因为 OSD 还没加。

 

第 4 章 把另外两台加进集群

以下都在 ceph40 上执行。

 

4.1 分发 SSH 公钥

ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph44

ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph45

每条命令会提示输入对方 root 密码,输入即可。

 

4.2 把主机加入集群

ceph orch host add ceph44 192.168.128.44

ceph orch host add ceph45 192.168.128.45

ceph orch host ls

 

4.3 给新节点打 _admin 标签

只有带这个标签的机器才会被下发 ceph.conf 和 admin keyring,否则在那两台机器上敲 ceph 命令会连不上:

ceph orch host label add ceph44 _admin

ceph orch host label add ceph45 _admin

 

第 5 章 部署 MON / MGR 高可用

这一步是三节点相对两节点最大的价值:3 个 MON 构成 quorum,任意一台宕机,集群照常读写。

ceph orch apply mon --placement="ceph40,ceph44,ceph45"

ceph orch apply mgr --placement="ceph40,ceph44,ceph45"

等待 1–2 分钟让容器起来,然后确认:

ceph -s

ceph mon stat

ceph orch ps

 

期望结果  ceph -s 的输出里应出现 3 mons 和 2-3 mgrs。MON 数量必须是奇数,这是 quorum 选举的要求。

 

第 6 章 添加 OSD(真正存数据的盘)

6.1 A 方案:有独立空盘(lsblk 能看到 sdb)

在 ceph40 上执行,三台分别添加:

ceph orch daemon add osd ceph40:/dev/sdb

ceph orch daemon add osd ceph44:/dev/sdb

ceph orch daemon add osd ceph45:/dev/sdb

 

设备名不一致怎么办  如果三台的数据盘设备名不同(比如一台是 /dev/sdb、另一台是 /dev/vdb),分别用各自的设备名即可,不要求统一。

 

6.2 B 方案:只有系统盘,用稀疏文件模拟磁盘

确认只有一块系统盘时,在每台机器上造一个稀疏文件当“假磁盘”。

为什么用 truncate 而不是 dd  dd 会立刻写满 6 GB 真实数据块,让你的可用空间从 14 GB 直接掉到 8 GB;truncate 创建的是稀疏文件,初始几乎不占空间,OSD 写入多少才占多少,对 17 GB 的盘友好得多。

三台机器各自执行:

# 创建一个名义 6 GB、实际几乎不占空间的稀疏文件

truncate -s 6G /var/lib/ceph-osd.img

 

# 挂成 loop 设备(指定 loop0,方便后面设置开机自启)

losetup /dev/loop0 /var/lib/ceph-osd.img

 

# 确认挂载成功

losetup -a

lsblk -f | grep loop0

然后回到 ceph40 添加 OSD,设备名换成 loop 设备:

ceph orch daemon add osd ceph40:/dev/loop0

ceph orch daemon add osd ceph44:/dev/loop0

ceph orch daemon add osd ceph45:/dev/loop0

 

重启后 loop 设备会丢  这是 B 方案最大的坑:机器重启后 /dev/loop0 消失,OSD 起不来。配置一个开机自启服务即可解决,三台机器各自执行一次:

cat > /etc/systemd/system/ceph-osd-loop.service <<'EOF'

[Unit]

Description=Setup loop device for Ceph OSD

DefaultDependencies=no

Before=local-fs.target

 

[Service]

Type=oneshot

ExecStart=/usr/sbin/losetup /dev/loop0 /var/lib/ceph-osd.img

RemainAfterExit=yes

 

[Install]

WantedBy=multi-user.target

EOF

 

systemctl daemon-reload

systemctl enable ceph-osd-loop.service

 

B 方案的取舍  性能比真实磁盘差,且占用根分区空间,仅适合学习练手。但集群行为、所有管理命令、扩容与故障恢复流程都与真实磁盘完全一致,作为入门环境完全够用。

 

6.3 确认 OSD 创建成功

ceph osd tree

ceph osd df

ceph -s

 

ceph osd tree 应该看到 3 个 OSD(osd.0 / osd.1 / osd.2),分别挂在 ceph40 / ceph44 / ceph45 三个 HOST 下面。

 

第 7 章 小盘环境必做的 6 项精简调参

这一章是 17 GB 小盘环境能不能跑稳的关键。生产环境通常不需要改这些,但小机器上每一项都有实际意义。

调优 1:降低 OSD 内存占用(最重要)

Ceph 默认给每个 OSD 预留 4 GB 内存,小机器上会和 MON、MGR 抢内存,严重时触发 OOM。

# 内存 8 GB 的机器:每个 OSD 给 2 GB

ceph config set osd osd_memory_target 2147483648

 

# 内存只有 4 GB 的机器:压到 1 GB

ceph config set osd osd_memory_target 1073741824

调优 2:限制系统日志体积

Ceph 容器日志默认全部进 journald,长时间运行会悄悄吃掉几 GB。

mkdir -p /etc/systemd/journald.conf.d

cat > /etc/systemd/journald.conf.d/99-ceph.conf <<'EOF'

[Journal]

SystemMaxUse=200M

RuntimeMaxUse=100M

EOF

systemctl restart systemd-journald

三台机器都要执行。

调优 3:清理 dnf 缓存

dnf clean all

rm -rf /var/cache/dnf

df -h /                     # 看看回收了多少

调优 4:关闭遥测上报

Ceph 默认会向社区上报匿名使用数据,学习环境关掉,既省带宽也避免后台任务:

ceph telemetry off

调优 5:允许删除存储池

Ceph 默认禁止删 pool,练习时很不方便。打开这个开关(仅学习环境):

ceph config set mon mon_allow_pool_delete true

调优 6:存储池 PG 数量取小值

PG(归置组)太多会白白消耗内存和 CPU。3 个 OSD 的小集群,每个 pool 给 32 个 PG 就足够:

# 后面创建存储池时直接指定 PG 数,见第 10 章

ceph osd pool create rbdpool 32 32

7.1 容量水位提醒

Ceph 默认的容量告警线:

水位 阈值 触发后表现
NEARFULL(近满) 85% HEALTH_WARN 告警,仍可读写
BACKFILLFULL 90% 停止数据迁移与恢复
FULL(满) 95% 集群转为只读,无法写入

 

容量红线  走 B 方案时总可用约 5.6 GB,实际写入请控制在 4 GB 以内;走 A 方案时可用约 9 GB,控制在 6 GB 以内。根分区剩余空间也别低于 2 GB,否则系统会出问题——用 df -h / 随时检查。

 

第 8 章 验收清单

逐条执行,对照期望结果:

命令 期望结果
ceph -s health: HEALTH_OK;3 mons、3 osds up and in
ceph osd tree 3 个 OSD,分别分布在 ceph40 / ceph44 / ceph45
ceph osd df 能看到每个 OSD 约 10 GB 的容量
ceph df 显示总容量约 30 GB,可用约 9 GB
ceph orch host ls 3 台主机,均带 _admin 标签
ceph orch ps mon / mgr / osd / crash 容器状态均为 running

8.1 打开 Dashboard 看一眼

浏览器访问(注意是 https):

https://192.168.128.40:8443

账号 admin,密码 Admin@123。首次登录会提示改密码,可以选跳过。

 

关于图表空白  因为我们跳过了监控栈,Dashboard 里依赖 Prometheus 的性能曲线图会是空的,但集群状态、OSD 分布、容量这些核心信息都正常显示。等以后磁盘空间充裕了,可用 ceph orch apply prometheus 补装监控栈。

 

第 9 章 高可用演练(三节点最有价值的一课)

这一步两节点集群根本做不了,是三节点部署最值得体验的部分:模拟一台机器宕机,看集群如何自愈。

9.1 模拟节点故障

在 ceph45 上执行(或者直接在虚拟机软件里把它关机,效果更真实):

shutdown -h now

9.2 观察集群反应

回到 ceph40 上观察:

ceph -s

watch -n 2 'ceph -s'     # 想看动态变化用这个,Ctrl+C 退出

 

你会看到:集群状态变成 HEALTH_WARN,提示有 OSD down、MON 数量减少,但依然可以正常读写数据——这就是高可用的含义。3 个 MON 挂掉 1 个,剩下 2 个仍能构成 quorum。

9.3 恢复节点并观察数据自愈

把 ceph45 重新开机,等它起来后观察:

ceph -s

输出中会出现 recovery(恢复)进度,形如:

progress:

Rebalancing after osd.2 marked in (3s)

[=====.....................]  30%

等这个进度跑完,集群会重新回到 HEALTH_OK。整个过程数据是自动补齐的,不需要人工干预。

 

第 10 章 创建第一个块存储(RBD)

到目前为止集群只是“能跑”,这一章让它真正存点东西。以下在 ceph40 上执行。

10.1 创建存储池和镜像

# 创建存储池,PG 数 32(小集群取小值)

ceph osd pool create rbdpool 32 32

 

# 初始化为 RBD 用途

rbd pool init rbdpool

 

# 创建一个 2 GB 的块设备镜像(B 方案环境不要超过 2 GB)

rbd create rbdpool/disk1 --size 2G

 

# 查看

rbd ls rbdpool

rbd info rbdpool/disk1

10.2 映射到本地并挂载

# 映射成本地块设备

rbd map rbdpool/disk1

 

# 查看映射结果,通常会得到 /dev/rbd0

rbd device list

 

# 格式化

mkfs.xfs /dev/rbd0

 

# 挂载使用

mkdir -p /mnt/ceph-rbd

mount /dev/rbd0 /mnt/ceph-rbd

df -h /mnt/ceph-rbd

 

如果 rbd map 失败  通常是缺少内核 rbd 模块或 xfsprogs,执行 modprobe rbd 与 dnf install -y xfsprogs 后重试。若仍不行,可改用 rbd-nbd map rbdpool/disk1(需安装 ceph-common 中的 rbd-nbd)。

10.3 写入测试

echo 'hello ceph' > /mnt/ceph-rbd/test.txt

cat /mnt/ceph-rbd/test.txt

ceph df                          # 观察 USED 容量变化

10.4 清理(练习完想删掉)

umount /mnt/ceph-rbd

rbd unmap /dev/rbd0

rbd rm rbdpool/disk1

ceph osd pool delete rbdpool rbdpool --yes-i-really-really-mean-it

 

第 11 章 常见故障排查

现象 原因 解决办法
bootstrap 报错主机名 localhost 虚拟机默认主机名不合法 hostnamectl set-hostname ceph40,重新登录 shell
bootstrap 长时间卡在拉镜像 quay.io 国内访问慢 提前执行 podman pull quay.io/ceph/ceph:v20,或换网络重试
orch host add 提示要密码 SSH 公钥没分发成功 重跑 ssh-copy-id -f -i /etc/ceph/ceph.pub root@目标主机
ceph44 上敲 ceph 命令连不上 该主机缺少 _admin 标签 ceph orch host label add ceph44 _admin
OSD 加不进去,提示设备不可用 磁盘有残留分区或文件系统 在对应机器上执行 wipefs -a /dev/sdb 后再添加
ceph -s 一直是 HEALTH_WARN OSD 数量不足或 MON 未形成 quorum ceph health detail 查看具体原因,按提示处理
部署中途提示磁盘空间不足 系统盘太小 执行 dnf clean all、清 journald,或把系统盘扩到 20 GB 以上
集群变成只读 容量达到 95% FULL 水位 删除部分数据,或扩容 OSD 容量

11.1 查看日志的正确姿势

ceph health detail               # 先看健康检查详情,最有用

ceph orch ps                     # 看哪个容器没起来

cephadm logs --name mon.ceph40   # 看某个守护进程的日志

journalctl -u ceph-$(ceph fsid)@mon.ceph40 -f

 

第 12 章 推倒重来

学习阶段装坏了很正常,重来比抢救更快。在每台机器上执行:

# 1. 删除集群(每条命令会要求确认,加 --force 跳过)

cephadm rm-cluster --force --fsid $(ceph fsid)

 

# 2. 清空数据盘

wipefs -a /dev/sdb

 

# 3. 清理残留配置

rm -rf /etc/ceph/* /var/lib/ceph/* /var/lib/containers/*

 

注意  第 3 步会连同容器镜像一起删除,重装时需要重新拉取。如果只想重置集群而保留镜像,跳过最后一条的 /var/lib/containers/*。

 

 

附录  常用命令速查

命令 作用
ceph -s 集群总览,最常用的一条
ceph health detail 查看告警的具体原因
ceph osd tree OSD 拓扑,看数据分布在哪台机器
ceph osd df 每个 OSD 的容量使用情况
ceph df 集群整体容量
ceph orch host ls 集群中的主机列表
ceph orch ps 所有守护进程运行状态
ceph orch device ls 列出各主机可用磁盘
ceph config dump 查看所有已修改的配置项
ceph osd pool ls 列出所有存储池
cephadm shell 进入带 ceph 命令的容器环境
ceph orch apply mon --placement="h1,h2,h3" 指定 MON 部署位置

 

 

部署口诀:改主机名 → 装 podman → bootstrap 加 --skip-monitoring-stack → ssh-copy-id + host add → 部署 mon/mgr → daemon add osd → 精简调参。全程约 30–40 分钟可出 HEALTH_OK。

- THE END -

sanoplluser

9月28日20:45

最后修改:2026年9月28日
0

共有 0 条评论