腾讯云 CVM 搭建 Ceph 集群部署笔记

腾讯云 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.datadefault.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_logsrgw_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_keysecret_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:

可以可视化查看集群健康状态、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_restoredvol01

⑧获取恢复子卷路径
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 -sceph 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> 查看指定崩溃事件的详细信息
相关推荐
爱莉希雅&&&1 小时前
Kubernetes Service 完整学习笔记
笔记·学习·kubernetes
xieliyu.1 小时前
UPD协议结构以及开发中注意事项
java·开发语言·笔记·java-ee
海兰1 小时前
【AI工具】腾讯云开源自研 AI 助手 Octop介绍及安装使用指南
人工智能·云计算·腾讯云
卡布叻_星星1 小时前
后端架构笔记之Maven多模块与微服务
笔记·架构
PC2005-cloud13 小时前
DeepSeek Harness 创建 skill 指南:结构、安装、使用
笔记·学习
库玛西15 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
后季暖19 小时前
langgraph笔记(2)&& fastapi笔记
笔记
谷哥的小弟19 小时前
腾讯云服务器安装Redis Stack图文教程
服务器·redis·腾讯云·redis stack
小小筱筱19 小时前
LabVIEW笔记:解决周立功CAN卡驱动缺失导致的启动报错问题
笔记·labview