本文最后更新于0 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
Ceph 集群部署与存储池、块设备基础
一、核心概念
1. Ceph 三种存储类型
类型 底层接口 访问方式 适用场景 RBD (块存储)librbd 块设备(类磁盘) 云盘、数据库盘、虚拟机 CephFS (文件系统)librados POSIX 文件系统 共享文件系统、NFS 替代 RGW (对象存储)librados S3/Swift HTTP API 云存储、备份归档
底层都是 RADOS 集群 ,三者都是对 RADOS 的不同抽象。
2. Ceph 核心组件
组件 进程名 作用 高可用 MON (监视器)ceph-mon 维护集群元数据映射(OSD/PG/CRUSH 等) ≥3 台 OSD (对象存储)ceph-osd 真正存储数据,处理副本/恢复/心跳 ≥3 个 MGR (管理器)ceph-mgr 跟踪运行时指标,提供 RestAPI 和 WebUI ≥2 台 MDS (元数据服务器)ceph-mds CephFS 元数据管理(非块/对象存储用) 可选
3. BlueStore 存储引擎
自 Luminous(v12.2) 起默认使用 BlueStore 替代 FileStore
优势 :避免两次写入,小型随机写性能更好,接近满盘时无性能陡降,内置 RocksDB 管理元数据
4. CRUSH 算法(三次映射)
File → Object(切片/分块,固定 4MB) → PG(Hash 到归置组) → OSD(CRUSH 计算)
去中心化 :客户端直接计算存储位置,无需查元数据表
故障域隔离 :可配置 Host/Rack/Room 等层级,避免单点故障
高性能 :O(1) 复杂度直接算出位置
二、关键命令
1. cephadm 快速部署
# 下载 cephadm(推荐 20.2.x 稳定版) curl --silent --remote-name --location https://download.ceph.com/rpm-20.2.1/el9/noarch/cephadm mv cephadm-* /usr/local/bin/cephadm && chmod +x /usr/local/bin/cephadm # 初始化集群(第一个 mon 节点上执行) cephadm bootstrap --mon-ip <IP> --cluster-network <CIDR> --allow-fqdn-hostname --skip-pull # 安装 ceph-common(所有节点) cephadm add-repo --release tentacle apt update && apt -y install ceph-common # 添加主机 ceph orch host add <hostname> <IP> ssh-copy-id -f -i /etc/ceph/ceph.pub <hostname> # 添加 OSD ceph orch daemon add osd <hostname>:/dev/<device> # 查看集群状态 ceph -s
2. 存储池管理
# 创建副本池 ceph osd pool create <pool> <pg_num> <pgp_num> --size <replicas> # 创建纠删码池 ceph osd pool create <pool> <pg_num> <pgp_num> erasure # 基础操作 ceph osd pool ls ceph osd pool ls detail ceph osd pool rename <old> <new> ceph osd pool get <pool> pg_num ceph osd pool set <pool> pg_num <n> ceph osd pool set <pool> size <n> # 配额 ceph osd pool set-quota <pool> max_objects <num> ceph osd pool set-quota <pool> max_bytes <bytes> # 删除池(需开启允许删除) ceph tell mon.* injectargs --mon-allow-pool-delete=true ceph osd pool delete <pool> <pool> --yes-i-really-really-mean-it # RADOS 对象操作 rados df rados ls -p <pool> rados put <obj> <file> -p <pool> rados get <obj> <file> -p <pool>
3. RBD 块设备管理
# 创建块设备 rbd create -s <size> <pool>/<image> rbd ls -p <pool> rbd ls -p <pool> -l rbd info <pool>/<image> # 扩容/缩容 rbd resize -s <size> <pool>/<image> rbd resize -s <size> <pool>/<image> --allow-shrink # 客户端映射 rbd map <pool>/<image> rbd showmapped mkfs.ext4 /dev/rbd0 && mount /dev/rbd0 /mnt umount /mnt && rbd unmap /dev/rbd0 # 启用 RBD 应用 rbd pool init <pool> ceph osd pool application enable <pool> rbd
三、面试常考点
Ceph 有哪些组件?各自作用? → MON/OSD/MGR/MDS 各司其职
CRUSH 算法原理和优势? → 三次映射、去中心化、无单点、O(1) 高性能
BlueStore vs FileStore? → BlueStore 避免两次写入,接近满盘无性能陡降
RBD/CephFS/RGW 的区别? → 块/文件/对象三种存储类型,底层都基于 RADOS
cephadm 部署流程? → bootstrap → add host → add osd
RBD 进阶、用户认证、CephFS
一、核心概念
1. RBD 快照与克隆
概念 说明 快照(Snap) 某一时刻的数据只读副本 克隆(Clone) 基于快照的写时复制(COW)子镜像,性能更快 保护(Protect) 快照保护后无法删除,才能被克隆 Flatten 解除父子镜像关联,使子镜像独立
克隆比回滚快 :克隆直接指向快照数据,无需拷贝。
2. RBD 特性(Features)
特性 作用 layering 分层克隆机制 exclusive-lock 排他锁,多客户端禁止同时写入 object-map 对象位图,加速导入导出和容量统计 fast-diff 快速快照对比 deep-flatten 深度解除父子镜像依赖 journaling 日志机制,支持异地备份
3. Ceph 用户认证体系
用户格式 :TYPEID.USERID,如 client.admin、osd.0、mon.ceph141
TYPEID 类型 :client / osd / mon / mds / rgw / mgr
Cephx 协议 :双向认证,无需明文密码传输
Keyring 路径 :/etc/ceph/ceph.client.<user>.keyring
权限 含义 r 读 w 写 x 执行(调用方法 + auth 命令) * rwx profile osd OSD 身份权限 profile mds MDS 身份权限
4. CephFS 架构
MDS (元数据服务器):只管理元数据索引,不存储真实数据
cephfs_metadata 池 :存储元数据
cephfs_data 池 :存储实际文件数据
适用场景:多客户端共享读写(RBD 单客户端独占)
二、关键命令
1. RBD 快照管理
# 创建/查看快照 rbd snap create <pool>/<image>@<snapname> rbd snap ls <pool>/<image> # 回滚快照 rbd snap rollback <pool>/<image>@<snapname> # 快照保护/取消保护 rbd snap protect <pool>/<image>@<snapname> rbd snap unprotect <pool>/<image>@<snapname> # 克隆快照 rbd clone <pool>/<image>@<snapname> <pool>/<new_image> # 查看子镜像 rbd children <pool>/<image>@<snapname> # Flatten(解除父子关联) rbd flatten <pool>/<new_image> # 快照限制 rbd snap limit set <pool>/<image> --limit <num> rbd snap limit clear <pool>/<image> # 批量删除 rbd snap purge <pool>/<image>
2. RBD 回收站
rbd trash move <pool>/<image> rbd trash ls -p <pool> rbd trash restore -p <pool> --image <name> --image-id <id>
3. Ceph 用户管理
# 查看用户 ceph auth list ceph auth get <user> # 创建用户 ceph auth add <user> mon 'allow r' osd 'allow rwx pool=<pool>' ceph auth get-or-create <user> mon 'allow r' osd 'allow rwx' # 获取 Key ceph auth print-key <user> # 修改权限 ceph auth caps <user> mon 'allow rx' osd 'allow r pool=<pool>' # 删除/导出导入 ceph auth del <user> ceph auth get <user> -o <file> ceph auth import -i <file>
4. CephFS 部署
# 创建池 ceph osd pool create cephfs_data <pg> <pgp> ceph osd pool create cephfs_metadata <pg> <pgp> # 创建文件系统 ceph fs new <fs_name> cephfs_metadata cephfs_data # 部署 MDS ceph orch apply mds <fs_name> # 状态查看 ceph fs ls ceph mds stat ceph fs status <fs_name> # 客户端挂载 mount -t ceph <mon_ip>:6789,/ <mountpoint> -o name=<user>,secret=<key> ceph-fuse -n client.<user> -m <mon_ip>:6789 /<mountpoint>
三、面试常考点
快照克隆 vs 回滚? → 克隆快(指向数据),回滚慢(需拷贝数据)
RBD 能多节点同时挂载吗? → 不行,同一时间只能单客户端独占(有 exclusive-lock 特性限制)
快照保护的作用? → 防止误删,保护后才能克隆
CephFS 的 MDS 作用? → 管理元数据索引,不存真实数据
Cephx 认证原理? → 双向对称密钥认证,无需明文传输
RGW 对象存储、集群维护、监控、CRUSH 自定义
一、核心概念
1. RGW 对象存储网关
项目 说明 RGW Rados Gateway,基于 librados,提供 S3/Swift HTTP 接口 底层引擎 自 Firefly(0.80) 起默认 Civetweb(无需 Apache) 默认端口 Reef(18.x) 用 80 ,Nautilus(14.x) 用 7480用户体系 S3(user/bucket/object),Swift(account/subuser/container/object) 存储桶命名 唯一,3~63 字符,小写字母/数字/. / -,不可为 IP
部署后自动创建的 4 个池 :
.rgw.root → 全局元数据(桶/用户)
default.rgw.log → 日志池
default.rgw.control → 控制消息池
default.rgw.meta → 元数据池
2. OSD 四种状态
组合 状态 含义 up + in 正常 运行中且在集群内 down + in 进程故障 进程挂了但还在集群 up + out 手动驱逐 已迁出但进程未停 down + out 完全离线 进程停且已不在集群
3. PG(归置组)状态
状态 含义 active+clean 正常,所有副本就位 inactive PG 等待 OSD 同步 degraded 降级,副本数未达标 unclean 副本数不足,应在恢复中 stale 主副本长时间未汇报
PG 总数公式 :PG总数 ≤ OSD数 × 100 / 副本数,建议上限 6666(实际 2^13=8192)
4. CRUSH Map 结构
devices → 定义所有 OSD 设备
buckets → 逻辑拓扑(host/root/自定义层级)
rules → 数据分布规则(选哪个 root、选几个副本、故障域类型)
二、关键命令
1. RGW 部署与使用
# 部署 RGW
ceph orch apply rgw <service_id>
ceph orch daemon add rgw <svc> <host>
# 创建 S3 账号
radosgw-admin user create --uid '<user>' --display-name '<name>'
# 返回 access_key + secret_key 即为 S3 凭证
# 创建 Swift 子用户
radosgw-admin subuser create --uid=<user> --subuser=<user>:swift --access=full
2. s3cmd 使用
# 安装
apt -y install s3cmd
# 交互式配置
s3cmd --configure
# 依次填:Access Key → Secret Key → rgw地址 → rgw地址/%%(bucket) → 回车跳过加密 → 回车跳过GPG → N(不用HTTPS) → 回车
# 基础操作
s3cmd mb s3://<bucket>/
s3cmd ls
s3cmd ls s3://<bucket>/
s3cmd put <file> s3://<bucket>/
s3cmd get s3://<bucket>/<obj> /tmp/
s3cmd del s3://<bucket>/<obj>
s3cmd rb s3://<bucket>/ -r
3. Bucket 匿名访问策略
# 编写策略(允许公开下载)
cat > policy.json <<'POLICYEOF'
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"AWS": ["*"]},
"Action": "s3:GetObject",
"Resource": ["arn:aws:s3:::<bucket-name>/*"]
}]
}
POLICYEOF
s3cmd setpolicy policy.json s3://<bucket>/
s3cmd delpolicy s3://<bucket>/
4. Swift API
pip install python-swiftclient==4.6.0
swift -A http://<rgw-ip>/auth -U <user>:swift -K <key> list
swift -A http://<rgw-ip>/auth -U <user>:swift -K <key> post <容器>
swift -A http://<rgw-ip>/auth -U <user>:swift -K <key> upload <容器> /etc/hosts
5. OSD 维护
# 查看
ceph osd tree
ceph osd df
ceph osd ls
ceph osd stat
# 下线(完整五步)
ceph osd out <osd-id>
ceph -s
ceph orch daemon stop osd.<osd-id>
ceph osd tree | grep <osd-id>
# 重新上线
ceph osd in <osd-id>
ceph orch daemon start osd.<osd-id>
# 暂停/恢复写入
ceph osd pause
ceph osd unpause
6. PG 管理
ceph pg stat
ceph pg ls-by-pool <pool> | awk '{print $1,$2,$16}'
ceph pg <pgid> query
ceph pg dump_stuck
ceph osd map <pool> <obj>
7. 自定义 CRUSH 规则(五步)
# ① 获取 CRUSH Map
ceph osd getcrushmap -o crushmap.bin
# ② 编译为可读文件
crushtool -d crushmap.bin -o crushmap.txt
# ③ 编辑 crushmap.txt
# 新增 bucket:
# host ceph143-node1 { id -3 alg straw2 hash 0 item osd.0 weight 0.293 }
# 新增 root:
# root oldboyedu { id -11 alg straw2 hash 0 item ceph143-node1 weight 0.293 }
# 新增规则:
# rule linux102 { id 102 type replicated step take oldboyedu step chooseleaf firstn 0 type host step emit }
# ④ 编译回二进制
crushtool -c crushmap.txt -o new_crushmap.bin
# ⑤ 注入集群
ceph osd setcrushmap -i new_crushmap.bin
# ⑥ 创建池指定规则
ceph osd pool create <pool-name> <pg> <pgp> replicated <规则名>
8. 集群监控(cephadm 自带组件)
组件 端口 作用 Prometheus 9095 时序数据库,采集 Ceph 指标 Grafana 3000 可视化仪表盘 node-exporter 9100 服务器硬件指标 Alertmanager 9093 告警处理 Ceph-dashboard 8443 Web 管理界面
# 守护进程管理
ceph orch ps
ceph orch ls
ceph orch host ls
ceph orch daemon restart <daemon>
ceph orch daemon stop/start <daemon>
# mgr 模块
ceph mgr module ls
ceph mgr module enable/disable <module>
三、面试常考点
RGW 自动创建哪些池? → .rgw.root / default.rgw.log / default.rgw.control / default.rgw.meta
OSD 四种状态? → up/down/in/out 及其组合场景
PG 正常状态是什么? → active+clean;异常有 inactive/degraded/unclean/stale
PG 总数公式? → OSD × 100 / 副本数,上限 6666
CRUSH 算法优势? → 去中心化、无单点、O(1) 高性能、故障域隔离
自定义 CRUSH 规则流程? → getcrushmap → crushtool -d → 修改 txt → crushtool -c → setcrushmap → 创建池指定规则
cephadm 自带哪些监控? → Prometheus/Grafana/Alertmanager/node-exporter/ceph-exporter
Bucket Policy 匿名下载? → s3cmd setpolicy,核心权限 s3:GetObject
附录:高频命令速查
命令 用途 ceph -s集群总览 ceph osd treeOSD 树(高频) ceph osd dfOSD 使用率(高频) ceph orch ps所有守护进程(高频) ceph pg statPG 状态(高频) ceph pg ls-by-pool <pool> | awk ...PG→OSD 映射(高频) ceph osd map <pool> <obj>对象存储位置(高频) ceph osd getcrushmap / setcrushmap获取/注入 CRUSH Map ceph orch apply rgw <svc>部署 RGW radosgw-admin user create创建 S3 用户 s3cmd mb/ls/put/get/delS3 基础操作 s3cmd setpolicy <file> s3://<bucket>/Bucket 策略 rbd snap create <pool>/<img>@<snap>创建快照 rbd snap protect / rbd clone快照保护与克隆 ceph auth add <user> mon 'allow r' osd 'allow rwx'创建认证用户 ceph fs new <fs> <meta_pool> <data_pool>创建 CephFS cephadm bootstrap --mon-ip <IP>初始化集群 ceph orch daemon add osd <host>:/dev/<dev>添加 OSD