腾讯云 CVM 搭建 Ceph 集群部署笔记
Ceph 是一个开源统一分布式存储系统 ,由 Sage Weil 创建,基于 RADOS(Reliable Autonomic Distributed Object Store,可靠自主分布式对象存储)底层存储集群,支持对象存储、块存储、文件存储 三种存储接口,一套集群同时对外提供三类存储服务,是云原生、虚拟化场景主流后端存储方案。当前稳定版本 Reef 为 18.x 系列,可通过
cephadm容器化一键部署运维。
一、基础部署环境规划
本次Ceph集群部署基于腾讯云CVM云服务器搭建,整体环境为测试学习场景,采用稳定版Ceph版本及cephadm官方部署工具,配套容器运行时为Docker,具体基础环境参数如下表所示。
| 项目 | 详情 |
|---|---|
| 操作系统 | Debian 13 (trixie) |
| Ceph 版本 | 18.2.7 (Reef) - stable 稳定版 |
| 部署工具 | cephadm |
| 容器运行时 | Docker (docker.io) |
集群节点规划
本次测试集群共规划3台同规格腾讯云CVM节点,三个节点分别部署于北京六/七/八区,满足Ceph基础集群高可用部署需求,承载监控、管理、初始化部署等核心角色。
| 节点 | 主机名 | 内网IP | 可用区 | 机型 | 规格 | 数据盘 |
|---|---|---|---|---|---|---|
| node-1 | node-1 | 172.21.16.4 | 北京六区 | BF1.LARGE8 | 4核8G | 20G 通用型SSD云硬盘 |
| node-2 | node-2 | 172.21.16.5 | 北京七区 | BF1.LARGE8 | 4核8G | 20G 通用型SSD云硬盘 |
| node-3 | node-3 | 172.21.16.8 | 北京八区 | BF1.LARGE8 | 4核8G | 20G 通用型SSD云硬盘 |
整体架构图

二、部署集群
1、基础环境初始化(所有节点)
bash
# 设置主机名
hostnamectl set-hostname node-1 # node-2 / node-3 同理
# 配置 hosts 解析
cat <<EOF >> /etc/hosts
172.21.16.4 node-1
172.21.16.5 node-2
172.21.16.8 node-3
EOF
# 安装时间同步 (Debian 服务名为 chrony)
apt update && apt install -y chrony
sed -i 's/^server.*/server ntp.tencent.com iburst/' /etc/chrony/chrony.conf
systemctl enable --now chrony
# 验证时间同步
chronyc sources
# 看到 ^* 号表示同步成功
2、安装 Docker(所有节点)
bash
apt update && apt install -y docker.io lvm2 python3 wget
systemctl enable --now docker
docker --version # 验证
3、配置集群 SSH 免密互通(仅在 node-1 执行)
bash
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id node-1
ssh-copy-id node-2
ssh-copy-id node-3
# 验证
ssh node-2 hostname # 应返回 node-2
ssh node-3 hostname # 应返回 node-3
4、安装 cephadm 和 ceph-common(仅在 node-1 执行)
bash
# 添加 Ceph 源(Debian 13 用 bookworm 兼容)
wget -q -O- https://mirrors.aliyun.com/ceph/keys/release.asc \
| gpg --dearmor -o /usr/share/keyrings/ceph-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/ceph-archive-keyring.gpg] https://mirrors.aliyun.com/ceph/debian-reef/ bookworm main" \
| tee /etc/apt/sources.list.d/ceph.list
apt update
# 安装
apt install -y cephadm ceph-common
# 验证
cephadm version
# 输出: cephadm version 18.2.7 (6b0e988...) reef (stable)
5、引导集群(仅在 node-1 执行)
--mon-ip 为node-1节点内网IP地址
cephadm bootstrap --mon-ip 172.21.16.4 \
--allow-fqdn-hostname \
--skip-monitoring-stack
引导完成后输出:
- Dashboard URL:
https://node-1:8443/ - 用户名:
admin - 密码:
9zb5yqalgz

6、添加节点到集群(仅在 node-1 执行)
bash
# 拷贝 cephadm 公钥到其他节点
ceph cephadm get-pub-key > /tmp/ceph.pub
ssh node-2 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < /tmp/ceph.pub
ssh node-3 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < /tmp/ceph.pub
# 添加节点
ceph orch host add node-2 172.21.16.5
ceph orch host add node-3 172.21.16.8
# 验证
ceph orch host ls
这里我们可以查看到集群中已经有三个节点了。
三、添加 OSD 数据盘激活存储能力
先查看三台机器的磁盘,确认数据盘是哪个
bash
lsblk

三台机器的数据盘都是 /dev/vdb,20GB,未挂载!直接添加 OSD:
bash
# 自动发现并添加所有可用裸盘(推荐,省事)
ceph orch apply osd --all-available-devices
# 等待30秒后查看 OSD 状态
ceph osd tree

3 个 OSD 全部上线,存储能力激活成功
四、扩展高可用组件(Mon / Mgr 到三节点)
当前只有 node-1 上有 Mon 和 Mgr,需要扩展到三台,提高集群高可用性
bash
# 1. 扩展 Monitor 到 3 个节点
ceph orch apply mon 3
# 2. 扩展 Manager 到 3 个节点
ceph orch apply mgr 3
# 3. 查看服务状态,等待所有守护进程启动
ceph orch ps --daemon-type mon
ceph orch ps --daemon-type mgr
# 4. 确认集群健康状态
ceph -s

五、创建RBD块存储
块存储 (RBD):相当于插了一块"裸硬盘"。一般给虚拟机或容器用,一个盘通常只能被一个系统独占。
1、先创建一个存储池rbd_pool
bash
# 创建一个名为 rbd_pool 的存储池,128 个 PG
ceph osd pool create rbd_pool 128
# 初始化池为 RBD 类型
rbd pool init rbd_pool
2、创建一个 RBD 块设备
bash
# 创建一个 5GB 的块设备
rbd create rbd_pool/volume-01 --size 5G --image-feature layering
# 查看创建的块设备:可以查看到创建的volume-01
rbd ls rbd_pool
3、在本地(node-1)映射并挂载使用
bash
# 映射块设备到本地
rbd map rbd_pool/volume-01 --name client.admin
# 查看映射结果
rbd showmapped
# 格式化(ext4 更通用,XFS 也可以)
mkfs.ext4 /dev/rbd0
# 挂载到本地
mkdir -p /data/ceph-rbd
mount /dev/rbd0 /data/ceph-rbd
# 写入文件测试
echo "Hello Ceph! 这是测试数据" > /data/ceph-rbd/test.txt
cat /data/ceph-rbd/test.txt
# 查看磁盘使用情况
df -h /data/ceph-rbd
这里我们就成功创建并使用了RBD块存储。
六、创建CephFS文件存储
文件系统 (CephFS):相当于一个"共享大文件夹"。允许多台电脑、服务器同时连进来,一起看文件、读写数据。
1、创建两个存储池
bash
ceph osd pool create cephfs_data 64 #数据池
ceph osd pool create cephfs_metadata 32 #元数据池
cephfs_data存储池:用于存放 CephFS 的实际文件数据(你上传的文件内容)
cephfs_metadata存储池:用于存放 CephFS 的文件目录结构、文件名、权限等元数据为什么要两个池:元数据访问频繁但量小,数据量大但访问频率低,分开可以分别优化性能
2、创建文件系统
bash
ceph fs new demo_fs cephfs_metadata cephfs_data
ceph fs new:创建一个新的 Ceph 文件系统
demo_fs:文件系统的名字,就像你给硬盘取个名字
cephfs_metadata:指定上面那个元数据池
cephfs_data:指定上面那个数据池作用:把两个池绑定成一个文件系统,这样 Ceph 就知道"文件名去 metadata 池查,文件内容去 data 池取"
3、部署 MDS 元数据服务器
MDS 全称 Metadata Server(元数据服务器),每个文件系统需要一个MDS,CephFS 文件系统必须有它才能工作。
bash
# 直接部署 MDS(cephadm 会自动拉取容器镜像)
ceph orch apply mds demo_fs --placement="3 node-1 node-2 node-3"
#查看MDS状态
ceph orch ps --daemon-type mds

4、查看状态
bash
ceph fs ls #列出当前集群中所有文件系统,看是否创建成功
ceph fs status #查看文件系统的详细状态,比如是否有 MDS(元数据服务器)在运行

5、安装挂载工具并挂载
ceph-fuse:Ceph 文件系统的客户端挂载工具,让 Linux 能把 CephFS 当成一个普通文件夹来用
bash
#安装ceph-fuse
apt install -y ceph-fuse
#创建挂载目录
mkdir -p /data/cephfs
#挂载
mount -t ceph 172.21.16.4:6789:/ /data/cephfs \
-o name=admin,secret=$(cat /etc/ceph/ceph.client.admin.keyring | grep key | awk '{print $3}')
#测试
echo "CephFS 多机共享测试 - 来自 node-1" > /data/cephfs/shared.txt
cat /data/cephfs/shared.txt
df -h /data/cephfs

6、多机共享
多机共享正是CephFS 的核心优势,在 node-2 和 node-3 上都可以挂载同一个 CephFS。
bash
# 在其他节点上创建挂在目录
ssh node-2 "mkdir -p /data/cephfs"
ssh node-3 "mkdir -p /data/cephfs"
# 获取密钥并传给 node-2 和 node-3
SECRET=$(cat /etc/ceph/ceph.client.admin.keyring | grep key | awk '{print $3}')
ssh node-2 "mount -t ceph 172.21.16.4:6789:/ /data/cephfs -o name=admin,secret=$SECRET"
ssh node-3 "mount -t ceph 172.21.16.4:6789:/ /data/cephfs -o name=admin,secret=$SECRET"
# 验证------在 node-2 上查看 node-1 创建的文件
ssh node-2 cat /data/cephfs/shared.txt
# 在 node-3 上写入文件,然后回 node-1 查看
ssh node-3 "echo '来自 node-3 的写入' > /data/cephfs/from-node3.txt"
cat /data/cephfs/from-node3.txt
七、RGW 对象存储(S3 兼容)
RGW 是 Ceph 的对象存储网关 ,它提供 S3 兼容的 API ,可以上传文件 → 存储到 Ceph 集群 → 通过 HTTP 下载
1、部署RGW服务
执行以下指令cephadm 在三台节点上拉取容器镜像,启动 3 个 rgw 容器,监听 7480 端口,并且自动创建 RGW 需要的存储池(如 default.rgw.buckets.data、default.rgw.meta 等)
bash
ceph orch apply rgw default --placement="3 node-1 node-2 node-3" --port 7480
| 参数 | 含义 |
|---|---|
ceph orch apply |
告诉 Ceph 编排器:启动一个服务 |
rgw |
服务类型:RADOS Gateway(对象存储网关) |
default |
实例名称,可以起多个名字区分不同业务(如 rgw_logs、rgw_images) |
--placement="3 node-1 node-2 node-3" |
部署 3 个副本,分别跑在三台机器上,实现高可用 |
--port 7480 |
监听端口 7480(S3 默认 7480,你也可以改成 80 或 443) |
2、创建对象存储用户
RGW 使用自己的用户系统,不是 Linux 系统用户,而是 S3 协议的用户。
bash
radosgw-admin user create --uid="hyz" --display-name="hyz"
| 参数 | 含义 |
|---|---|
radosgw-admin |
RGW 的管理命令工具 |
user create |
创建一个新用户 |
--uid="hyz" |
用户 ID,唯一标识,相当于用户名 |
--display-name="hyz" |
显示名称,给人看的,可以重复 |
执行后会输出一段 JSON,包含:
json
{
"user_id": "hyz",
"display_name": "hyz",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "hyz",
"access_key": "RQ0AYHD4TR56C1JFI3Y4",
"secret_key": "ur2vCIQavVmmbdXmfpGZTqbCCbjI9hLAKtnJfwAB"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
我们需要记录其中的access_key和secret_key
3、安装s3cmd并配置
**s3cmd **是一个命令行工具,用来操作 S3 兼容的对象存储,相当于腾讯云 COS 的 coscli 或 AWS 的 aws s3,支持上传、下载、删除、创建桶等操作。
bash
# 1. 安装 s3cmd
apt install -y s3cmd
# 2. 配置
s3cmd --configure
进入交互式配置,按以下填写:
bash
Access Key: RQ0AYHD4TR56C1JFI3Y4 #填上面的access_key
Secret Key: ur2vCIQavVmmbdXmfpGZTqbCCbjI9hLAKtnJfwAB #填上面的secret_key
Default Region: us-east-1 #S3 协议要求指定一个区域,可随意填写
S3 Endpoint: 172.21.16.4:7480 #172.21.16.4 是 node-1 的内网IP,7480 是 RGW 的监听端口
DNS-style bucket: 172.21.16.4:7480 #路径式访问
Encryption password: hyz123#s3cmd 上传文件时,用这个密码对文件本地加密后再上传。下载时用这个密码解密
Use HTTPS protocol: False #是否用 HTTPS 加密传输。
HTTP Proxy server name: (空) #如果你公司网络需要代理才能访问外网,就填代理地址。
Test access: Y
4、测试
bash
# 1. 创建桶
s3cmd mb s3://demo-bucket
# 2. 上传文件
echo "Hello Ceph RGW 对象存储!" > /tmp/test.txt
s3cmd put /tmp/test.txt s3://demo-bucket/
# 3. 列出文件
s3cmd ls s3://demo-bucket/
# 4. 下载并验证
s3cmd get s3://demo-bucket/test.txt /tmp/downloaded.txt
cat /tmp/downloaded.txt
# 5. 查看容量
s3cmd du -H s3://demo-bucket/
八、访问Ceph Dashboard
浏览器打开,用你的 node-1 公网IP:
-
用户名:
admin -
密码:
9zb5yqalgz(首次登录修改密码)
可以可视化查看集群健康状态、OSD、Pool、磁盘使用情况。

九、备份与恢复
Ceph 内部三副本只是高可用,不是备份;集群整体故障、误删、勒索病毒,三副本救不了,必须做独立备份。
1、集群备份策略总览
| 数据类型 | 备份方式 | 频率 | 保留周期 |
|---|---|---|---|
| Ceph 配置 | 手动/脚本备份 | 每次变更后 | 永久 |
| RBD 块存储 | 快照 + 导出 | 每日/每周 | 7-30天 |
| CephFS 文件 | 快照 + rsync | 每日 | 7-30天 |
| RGW 对象 | 跨区域同步/定期导出 | 实时/每日 | 30天 |
| Monitor 数据 | 自动(多副本) | - | - |
2、Ceph 配置备份与恢复
- 备份配置
bash
# 创建备份目录
mkdir -p /data/ceph-bak
# 备份配置文件
cp /etc/ceph/ceph.conf /data/ceph-bak
cp /etc/ceph/ceph.client.admin.keyring /data/ceph-bak
# 查看备份内容
ls -la /data/ceph-bak
cat /data/ceph-bak/ceph.conf | head -10
- 模拟配置丢失
bash
# 备份原文件
mv /etc/ceph/ceph.conf /etc/ceph/ceph.conf.bak
# 模拟丢失
rm /etc/ceph/ceph.conf
# 尝试执行 ceph 命令(会报错)
ceph -s
# 报错:Error initializing cluster client: ObjectNotFound('RADOS object not found (error calling conf_read_file)')
- 恢复配置
bash
# 从备份恢复
cp /data/ceph-bak/ceph.conf /etc/ceph/
# 验证
ceph -s
# 正常显示集群状态
2、RBD 块存储快照备份与恢复
- 准备测试数据
bash
# 写入测试文件到 RBD 挂载点
echo "RBD 快照测试 - $(date)" > /data/ceph-rbd/snapshot-test.txt
cat /data/ceph-rbd/snapshot-test.txt
ls -la /data/ceph-rbd/
- 创建快照
bash
# 创建快照
rbd snap create rbd_pool/volume-01@snap-test
# 查看快照
rbd snap ls rbd_pool/volume-01
- 模拟数据损坏
bash
# 删除测试文件
rm -f /data/ceph-rbd/snapshot-test.txt
# 确认已删除
ls /data/ceph-rbd/
- 从快照恢复
bash
# 卸载
umount /data/ceph-rbd
# 回滚到快照
rbd snap rollback rbd_pool/volume-01@snap-test
# 重新挂载
mount /dev/rbd0 /data/ceph-rbd
# 验证恢复
ls /data/ceph-rbd/
cat /data/ceph-rbd/snapshot-test.txt
3、CephFS 快照备份与恢复
先明确三种概念
| 类型 | 操作方式 | 快照范围 |
|---|---|---|
| 目录级快照 | 在目标目录下的 .snap 文件夹中,使用 mkdir 创建快照目录 |
仅包含该目录及其所有子目录和文件 |
| 文件系统级快照 | 在 CephFS 根目录下的 .snap 文件夹中,使用 mkdir 创建快照目录 |
整个 CephFS 文件系统的所有数据 |
| 子卷快照 | 使用 Ceph 管理命令 ceph fs subvolume snapshot create |
仅包含指定的子卷(Subvolume)数据 |
(1)目录级快照
上面我们已经把CephFS文件系统挂载到了/data/cephfs/,我们现在假设要对目录 /data/cephfs/project-a 做快照。
①创建测试目录和文件
bash
mkdir -p /data/cephfs/project-a
mkdir -p /data/cephfs/project-a/config
echo "项目A重要数据" > /data/cephfs/project-a/file.txt
echo "version=1" > /data/cephfs/project-a/config/app.conf
②创建目录快照
bash
mkdir /data/cephfs/project-a/.snap/project-a-bak20260806
.snap:CephFS 保留的快照特殊目录
project-a-bak20260806:快照名称
③查看快照
bash
ls -la /data/cephfs/project-a/.snap/
④模拟数据误删
bash
rm -f /data/cephfs/project-a/file.txt
rm -f /data/cephfs/project-a/config/app.conf
⑤验证快照没有被当前目录修改影响
bash
find /data/cephfs/project-a/.snap/project-a-bak20260806 \
-type f -print
可以查到误删前的文件
⑥从目录快照恢复文件
恢复被删除的file.txt
bash
cp -a \
/data/cephfs/project-a/.snap/project-a-bak-20260806/file.txt \
/data/cephfs/project-a/
恢复子目录中的文件
bash
#先确保目录存在
mkdir -p /data/cephfs/project-a/config
#恢复app.conf
cp -a \
/data/cephfs/project-a/.snap/project-a-bak-20260806/config/app.conf \
/data/cephfs/project-a/config/
⑦验证恢复结果
bash
find /data/cephfs/project-a \
-path '/data/cephfs/project-a/.snap' -prune \
-o -type f -print
可以看到误删的文件都恢复
(2)文件系统级快照
刚才完成的是目录级快照,这次对整个 demo_fs 文件系统做快照。在当前 Ceph 18.2.8 中,文件系统级快照使用挂载点下的 .snap 目录,不使用 ceph fs snapshot create 命令。
①CephFS 根目录创建测试数据
bash
mkdir -p /data/cephfs/fs-test/config
echo "文件系统级快照测试" > /data/cephfs/fs-test/data.txt
echo "version=1" > /data/cephfs/fs-test/config/app.conf
find /data/cephfs/fs-test -type f -print
②创建整个文件系统快照
CephFS 的文件系统级快照,本质上是对 CephFS 根目录 / 创建快照。当前挂载点对应为 /data/cephfs/.snap/快照名。
bash
mkdir /data/cephfs/.snap/fs-backup-20260806
#确认创建成功
ls -la /data/cephfs/.snap/
③模拟数据删除
下面我们进行一次破坏性操作,只删除测试目录
bash
rm -rf /data/cephfs/fs-test
④恢复
生产环境不建议直接将整个快照覆盖到正式目录,先恢复到临时目录进行检查:
bash
mkdir -p /data/fs-restore-test
rsync -a \
/data/cephfs/.snap/fs-backup-20260806/fs-test/ \
/data/fs-restore-test/fs-test/
确认无误后,再恢复到正式目录
bash
mkdir -p /data/cephfs/fs-test
rsync -avh /data/fs-restore-test/fs-test/ /data/cephfs/fs-test/
⑤验证
bash
find /data/cephfs/fs-test -type f -print
ceph -s
(3)子卷快照
①确认子卷存在
bash
ceph fs subvolume ls demo_fs
应看到:
json
[
{
"name": "vol01"
}
]
如果没有 vol01,再创建:
bash
ceph fs subvolume create demo_fs vol01 --size 1073741824
②获取子卷实际路径
bash
ceph fs subvolume getpath demo_fs vol01
输出:/volumes/_nogroup/vol01
保存路径变量
bash
VOL_PATH=$(ceph fs subvolume getpath demo_fs vol01)
echo "$VOL_PATH"
③挂载子卷
bash
mkdir -p /vol01
#获取密钥
SECRET=$(awk '/key =/ {print $3}' /etc/ceph/ceph.client.admin.keyring)
#挂载
mount -t ceph 172.21.16.4:6789:"$VOL_PATH" /vol01 \
-o name=admin,secret="$SECRET"
验证挂载:
bash
df -h /vol01
findmnt /vol01
④写入测试数据
mkdir -p /vol01/config
echo "子卷快照原始数据" > /vol01/important.txt
echo "version=1" > /vol01/config/app.conf
⑤创建子卷快照
bash
#创建子卷快照
ceph fs subvolume snapshot create demo_fs vol01 vol01-backup-20260806
#查看快照
ceph fs subvolume snapshot ls demo_fs vol01
应该看到vol01-backup-20260806,此时,vol01 的快照已经创建完成。
⑥模拟数据损坏
只删除当前子卷中的测试文件:
bash
rm -f /vol01/important.txt
rm -f /vol01/config/app.conf
⑦从快照克隆恢复新子卷
使用快照克隆一个新的恢复子卷:
bash
ceph fs subvolume snapshot clone \
demo_fs \
vol01 \
"vol01-backup-20260806" \
vol01_restored
查看子卷列表
bash
ceph fs subvolume ls demo_fs
可以看到现在有了 vol01_restored和vol01
⑧获取恢复子卷路径
bash
ceph fs subvolume getpath demo_fs vol01_restored

⑨挂载恢复后的子卷
bash
#创建新目录
mkdir -p /vol01_restored
#挂在新恢复子卷
mount -t ceph 172.21.16.4:6789:"/volumes/_nogroup/vol01_restored/fecfc09c-fe26-49ab-af38-22380f5b97a5" /vol01_restored \
-o name=admin,secret="$SECRET"
⑩验证恢复子卷
bash
find /vol01_restored -type f -print
cat /vol01_restored/important.txt
cat /vol01_restored/config/app.conf
⑪将数据恢复回原来的 /vol01
bash
#先预览恢复操作:这里的 -n 是预览模式,不会真正修改文件。
rsync -avhn --delete \
/vol01_restored/ \
/vol01/
#确认输出没有问题后,再执行:
rsync -avh --delete \
/vol01_restored/ \
/vol01/
参数含义:
-a:递归复制并保留权限、时间等属性;
-v:显示复制过程;
-h:使用易读的容量单位;
--delete:删除原/vol01中恢复源没有的文件,使原卷与快照内容一致。生产环境执行
--delete前必须先执行-n预览,并确认业务已经停止写入。
⑫验证
bash
find /vol01 -type f -print
cat /vol01/important.txt
cat /vol01/config/app.conf
确认原目录恢复成功后,清理临时恢复子卷:
bash
umount /vol01_restored
ceph fs subvolume rm demo_fs vol01_restored --force
4、RGW备份
通过 s3cmd 将 Ceph RGW 中的对象同步到本地,再使用 coscmd 上传到腾讯云 COS,实现异地备份。需要恢复时,从 COS 下载备份并重新同步回 RGW。该方式简单实用,可避免 Ceph 集群故障导致备份同时丢失。
先安装coscmd
bash
apt install -y python3-pip
pip3 install coscmd
配置cos信息,需要准备以下信息
- COS SecretId
- COS SecretKey
- COS Bucket 名称
- COS Region
配置(替换下面的占位符):
coscmd config \
-a '<COS_SECRET_ID>' \
-s '<COS_SECRET_KEY>' \
-b '<COS_BUCKET_NAME>' \
-r '<COS_REGION>'
备份恢复
bash
# RGW 备份到本地
mkdir -p /data/rgw-backup/demo-bucket
s3cmd sync s3://demo-bucket/ /data/rgw-backup/demo-bucket/
# 上传备份到 COS
coscmd upload -r \
/data/rgw-backup/demo-bucket/ \
/ceph-backup/demo-bucket/
# 从 COS 下载恢复文件
mkdir -p /data/rgw-restore
coscmd download -r \
/ceph-backup/demo-bucket/ \
/data/rgw-restore/
# 恢复回 RGW
s3cmd sync /data/rgw-restore/ s3://demo-bucket/
生产环境建议将 COS Bucket 设置为私有,并为备份账号配置最小权限。
十、扩容与缩容
生产环境中,扩容通常是安全操作;缩容属于高风险操作,必须先迁移数据、确认副本健康,再移除 OSD 或节点。不能直接删除 CVM 或直接 rm -rf 数据盘。
1、扩容方式介绍
常见扩容方式:
| 扩容方式 | 操作内容 | 主要作用 |
|---|---|---|
| 增加已有节点的数据盘 | 给现有 CVM 挂载新的 CBS,并创建 OSD | 增加存储容量和部分 I/O 能力 |
| 增加新的 OSD 节点 | 新增 CVM、数据盘,加入集群并创建 OSD | 同时增加容量、计算资源、网络资源和故障域 |
| 扩大现有 OSD 容量 | 更换更大数据盘或新增 CBS | 增加可用存储容量 |
(1)方式一:增加已有节点的数据盘
这种方式操作简单、成本较低,可以增加容量和 OSD 数量,适合小规模扩容和测试环境。但同一节点上的多个 OSD 共享 CPU、内存、网络和故障域。
目标:在node-1 新增一块数据盘,新数据盘创建为新的 OSD,集群从 3 个 OSD 扩展到 4 个 OSD
①扩容前检查集群状态
bash
ceph -s
ceph osd tree
ceph df
扩容前应确认:
health: HEALTH_OK
现有 OSD 全部 up/in
PG 全部 active+clean
②在腾讯云控制台挂载 CBS 云硬盘
在腾讯云控制台给 node-1 挂载一块新的CBS 云硬盘进行测试。

这里我们挂载了一块新的20G高性能云硬盘,挂载完成后,在 node-1查看磁盘:
bash
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL,SERIAL

成功识别到新盘 vdc 20G,并且是裸盘(没有分区、没有文件系统、没有挂载点、没有被其他程序使用)
③查看 Ceph 是否发现新盘
由于在【第三章】配置了:ceph orch apply osd --all-available-devices,因此将新的裸 CBS 磁盘挂载到 node-1 后,cephadm 会自动发现该磁盘并创建 OSD。执行以下命令进行检查:
bash
ceph -s
ceph osd tree
ceph osd stat
ceph df
ceph orch ps --daemon-type osd
ceph orch device ls --wide
扩容成功的判断标准:
- OSD 数量从 3 个增加到 4 个
- 新 OSD 状态为 up/in
- 集群状态为 HEALTH_OK
- PG 状态为 active+clean
- RAW STORAGE 容量增加
- 新磁盘已被 Ceph LVM 接管
- 新磁盘不再显示 AVAILABLE Yes
(2)方式二:增加新的 OSD 节点
目标:新增一台 Ceph 节点 node-4,为其挂载一块独立数据盘,将节点加入现有 Ceph 集群,并使用该数据盘创建新的 OSD。
①创建node-4 CVM
在腾讯云控制台创建一台新的 CVM,与现有 Ceph 节点位于同一 VPC,分配一块独立 CBS 数据盘

② node-4 设置主机名
bash
hostnamectl set-hostname node-4
③配置主机名解析
四台节点都要配置 /etc/hosts:
bash
172.21.16.4 node-1
172.21.16.5 node-2
172.21.16.8 node-3
172.21.32.11 node-4
④配置免密SSH(node-1执行)
bash
#配置免密
ssh-copy-id node-4
#验证返回node-4
ssh node-4 hostname
⑤准备 node-4 基础环境
bash
apt update
apt install -y docker.io lvm2 python3 chrony
#启动服务
systemctl enable --now docker
systemctl enable --now chrony
#检查时间同步
chronyc sources
timedatectl
⑥准备cephadm SSH 公钥
在 node-1 执行:
bash
ceph cephadm get-pub-key > /tmp/ceph.pub
ssh node-4 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < /tmp/ceph.pub
⑦将 node-4 加入集群
bash
ceph orch host add node-4 172.21.32.11
⑧查看集群主机
bash
ceph orch host ls
#预计返回
HOST ADDR LABELS STATUS
node-1 172.21.16.4 _admin
node-2 172.21.16.5
node-3 172.21.16.8
node-4 172.21.32.11
4 hosts in cluster
⑨检查 Ceph 是否发现 node-4 的数据盘
在 node-1 执行:
bash
ceph orch device ls --wide
如果新数据盘还没有被使用,预期看到:
bash
node-4 /dev/vdb hdd 20.0G Yes
由于前面已经配置过:ceph orch apply osd --all-available-devices,cephadm 会自动发现裸盘,并自动创建 OSD。因此,在执行 ceph orch device ls 时,可能已经看不到 AVAILABLE Yes,而是显示:
bash
node-4 /dev/sr0 hdd QEMU_DVD-ROM_QM00003 18.9M N/A N/A No 2m ago Has a FileSystem, In sufficient space (<5GB), read-only
node-4 /dev/vdb hdd disk-pbex3d1d 20.0G N/A N/A No 2m ago Has a FileSystem, In sufficient space (<10 extents) on vgs, LVM detected
这表示该磁盘已经被 Ceph 初始化并接管。
⑩检查 OSD
bash
ceph orch ps --daemon-type osd
ceph osd tree
ceph osd stat

osd.4已经存在,说明扩容已经完成。
(3)方式三:扩大现有 OSD 容量
扩大现有 OSD 容量,是指在不新增 OSD ID 的情况下,扩展 OSD 所使用的 CBS 云硬盘容量。
①检查集群状态
bash
ceph -s
ceph health detail
ceph osd tree
ceph df
#理想状态:
HEALTH_OK
所有 OSD 为 up/in
所有 PG 为 active+clean
②确认OSD与磁盘的对应关系
我们是通过 cephadm 容器部署ceph,可以通过ceph容器执行以下指令:
bash
cephadm shell -- ceph-volume lvm list

可以查到 node-1:/dev/vdb 对应 osd.2
③在腾讯云控制台扩容 CBS
在腾讯云控制台找到 node-1 的 /dev/vdb 对应 CBS 云硬盘,将容量从20 GiB 扩展到 30 GiB

④确认Linux识别新容量
bash
lsblk /dev/vdb
⑤ 扩展 LVM PV
bash
pvresize /dev/vdb
pvs
vgs
#预计返回以下:说明新增的 10G 已进入 Ceph VG,但尚未分配给 OSD LV。
dev/vdb <30.00g 10.00g
⑥扩展 BlueStore LV
先查看OSD 对应的 LV
cephadm shell -- ceph-volume lvm list

进行拓展:填上面的block device
bash
lvextend -l +100%FREE \
/dev/ceph-6703e2df-23b6-4252-95a7-d4196ecf1580/osd-block-18cf9464-faac-4a9c-94eb-1a23c9506b80
检查:
bash
lvs -o lv_name,vg_name,lv_path,lv_size
lsblk /dev/vdb

⑦让 OSD 重新读取容量
重新部署对应 OSD:
bash
ceph orch daemon redeploy osd.2
查看状态:
bash
ceph orch ps --hostname node-1
ceph osd tree

⑧验证 BlueStore 容量
bash
ceph osd metadata 2

⑨ 更新 CRUSH 权重
扩容后,OSD 实际容量变大,但 CRUSH 权重可能仍保持原来的 20G 权重。
我们先查看数值
bash
ceph osd df tree

如果实际 SIZE 已变大,但 WEIGHT 仍是旧值(0.01949),需要根据新容量调整:
bash
ceph osd crush reweight osd.2 <新权重>
新权重计算方式: 权重 ≈ 容量 GiB / 1024
例如:
20 GiB / 1024 ≈ 0.01949
30 GiB / 1024 ≈ 0.02930
⑩验证总容量
输入以下指令可以看到增加了10G
bash
ceph df

2、缩容方式介绍
常见缩容方式:
| 缩容方式 | 操作内容 | 主要作用 |
|---|---|---|
| 移除单个 OSD | 迁移数据后删除指定 OSD | 减少一个数据盘或更换磁盘 |
| 移除整个 OSD 节点、下线整台 CVM | 移除节点上的全部 OSD 后下线节点、先移除 OSD 和服务,再删除云主机 | 减少服务器数量、回收云资源 |
(1)移除单个OSD
移除单个 OSD 适用于:更换故障数据盘;减少一块数据盘;调整 OSD 数量;下线某个 OSD,但保留所在 CVM。
移除前检查集群状态
bash
ceph -s #HEALTH_OK
查看 OSD 分布:
bash
ceph osd tree
ceph osd df tree
ceph orch ps --daemon-type osd
本次移除的 OSD:OSD:osd.3,对应关系通过以下命令确认:
bash
ceph osd metadata 3

确认osd.3 对应 node-1:/dev/vdc
执行OSD移除任务
bash
ceph orch osd rm 3
查看移除进度
bash
ceph orch osd rm status

draining 表示 Ceph 正在迁移该 OSD 上的数据。
确认移除并检查集群状态
bash
ceph orch osd rm status #确认移除状态:No OSD remove/replace operations reported
ceph osd tree #检查OSD树:osd.3 不再出现
ceph osd stat #查看剩余OSD:3 osds: 3 up, 3 in
ceph pg stat #查看PG:active+clean
ceph -s #检查集群状态
(2)移除整个 OSD 节点、下线整台 CVM
目标:将 node-4 从 Ceph 集群和腾讯云环境中完整下线
①下线前检查(node-1执行)
bash
ceph -s
ceph health detail
ceph orch ps --hostname node-4
ceph osd tree
ceph orch osd rm status
确认 node-4 上主要是:osd.4
②移除node-4上的OSD
node-4 上的 OSD 是:osd.4
bash
ceph orch osd rm 4
#确认清理已完成:提示No OSD remove/replace operations reported
ceph orch osd rm status
③调整 Mon 和 Mgr 部署位置
移除 OSD 后,node-4 可能仍然运行 Mon、Mgr 等服务。
bash
#查看服务
ceph orch ps --hostname node-4
#例如输出以下
crash.node-4
mgr.node-4
mon.node-4
将 Mon 限制到剩余节点:
bash
ceph orch apply mon \
--placement="3 node-1 node-2 node-3"
将 Mgr 限制到剩余节点:
bash
ceph orch apply mgr \
--placement="3 node-1 node-2 node-3"
确认调整完成
bash
#确认 Mon 只运行在剩余节点
ceph orch ps --daemon-type mon
#确认 mgr 只运行在剩余节点
ceph orch ps --daemon-type mgr
④调整 Crash 服务部署范围
如果 crash 服务仍使用默认的所有主机部署:手动删除 crash.node-4 后,它可能会被自动重新创建。
正确做法是先修改 Crash 服务的 placement:
bash
ceph orch apply crash \
--placement="3 node-1 node-2 node-3"
#确认:预期返回crash 3/3 node-1;node-2;node-3;count:3
ceph orch ls
然后查看 node-4:
bash
ceph orch ps --hostname node-4
如果仍有残留的 Crash 守护进程,执行:
ceph orch daemon rm crash.node-4
⑤从 Ceph 编排器移除 node-4
bash
#确认 node-4 上没有任何守护进程:
ceph orch ps --hostname node-4
#确认 node-4 已无 OSD:
ceph osd tree
#移除node-4
ceph orch host rm node-4
#检查主机列表:预期只剩node123
ceph orch host ls
⑥清理 CRUSH 中的空主机桶
移除主机后,如果 ceph osd tree 仍显示:host node-4。但其下没有任何 OSD,说明这是 CRUSH 中的空主机桶,不代表 node-4 仍在运行。可以进行删除。
bash
ceph osd crush remove node-4
⑦腾讯云中销毁CVM资源
前往腾讯云控制台,销毁 node-4 CVM
十一、运维常用命令
以下命令主要在 node-1 管理节点执行。命令按用途分类,便于日常巡检和故障排查。
**📊**集群状态与监控
| 命令 | 功能说明 |
|---|---|
ceph -s 或 ceph status |
查看集群的整体健康状态和简要信息(最常用) |
ceph health detail |
查看集群健康状态的详细告警信息 |
ceph -w |
实时监控集群的实时更改和操作动作 |
ceph df |
查看集群存储空间的使用情况 |
ceph versions |
查看集群各组件的版本信息 |
**💾**OSD(对象存储守护进程)管理
| 命令 | 功能说明 |
|---|---|
ceph osd tree |
以树形结构查看 OSD 的层级关系和状态 |
ceph osd df |
详细列出集群每块磁盘(OSD)的使用情况 |
ceph osd stat |
查看 OSD 的简要状态信息 |
ceph osd out <osd-id> |
将指定的 OSD 踢出集群(触发数据迁移) |
ceph osd in <osd-id> |
将之前踢出的 OSD 重新加入集群 |
ceph osd down <osd-id> |
将指定的 OSD 设置为 down 状态 |
ceph osd rm <osd-id> |
从集群中删除一个 OSD |
🖥️MON(监视器)管理
| 命令 | 功能说明 |
|---|---|
ceph mon stat |
查看 MON 的状态信息(如选举状态、节点数) |
ceph mon dump |
输出 MON 的映射信息 |
ceph quorum_status |
查看 MON 的仲裁状态和详细信息 |
ceph mon add <mon-id> <ip> |
添加一个新的 MON 节点 |
ceph mon remove <mon-id> |
从集群中删除指定的 MON 节点 |
**📂**Pool(存储池)与 PG 管理
| 命令 | 功能说明 |
|---|---|
ceph osd pool ls |
列出集群中的所有存储池 |
ceph osd pool create <pool-name> |
创建一个新的存储池 |
ceph osd pool delete <pool-name> |
删除指定的存储池 |
ceph pg stat |
查看集群中所有 PG(Placement Group)的状态 |
ceph pg map <pg-id> |
查看指定 PG 的副本分布在哪些 OSD 上 |
ceph pg repair <pg-id> |
尝试修复指定的 PG |
🛠️集群服务与节点管理 (cephadm/orch)
| 命令 | 功能说明 |
|---|---|
ceph orch ls |
列出 Ceph 集群中运行的所有服务 |
ceph orch ps |
查看集群所有守护进程(容器)的运行状态 |
ceph orch host ls |
列出与集群关联的所有主机 |
ceph orch host add <hostname> <ip> |
将新主机添加到 Ceph 集群中 |
ceph orch apply osd --all-available-device |
自动绑定所有可用状态的硬盘为 OSD |
**🔍**故障排查与日志
| 命令 | 功能说明 |
|---|---|
journalctl -u ceph-osd@<id> -f |
实时查看指定 OSD 的系统日志 |
ceph osd find <osd-id> |
定位指定 OSD 所在的节点 IP 和主机名 |
ceph crash ls-new |
列出集群中最近发生的崩溃事件 |
ceph crash info <crash-id> |
查看指定崩溃事件的详细信息 |