精读笔记(RHCA 英文教材)· CL260 Chapter 4 Creating Object Storage Cluster Components
精读笔记(RHCA 英文教材)· CL260 Chapter 4 Creating Object Storage Cluster Components
教材原文:RHCA 官方英文教材(PDF 第 115~166 页)(OCR 整书版已从本站移除,本页为章节精读) 关联知识:Ch1 架构(PG/CRUSH)、Ch2 部署(OSD spec)、Ch5 存储地图;
00-RHCA教材精读-导航与学习法.md
Chapter Goal / Objectives(原文+译)
- GOAL: Create the object storage cluster components: BlueStore OSDs, pools, and clients with Ceph authentication.(创建对象存储组件:BlueStore OSD、存储池、带认证的客户端)
- OBJECTIVES: ① 用逻辑卷创建 BlueStore OSD;② 创建并配置副本/纠删码池;③ 描述 cephx 并配置客户端用户认证授权。
- 结构:三个 Section + 各自 Guided Exercise + 章末 Lab
Creating Object Storage Cluster Components。
4.1 Creating BlueStore OSDs Using Logical Volumes
BlueStore 设计(相对 FileStore 的优势)
- FileStore 双写(journal→块设备)有性能惩罚;BlueStore 直接写块设备,同时用独立数据流把事务写进 write-ahead log(WAL),同负载下写性能约 2×。
- BlueStore OSD 内部分件:数据(data,对象数据)、block.db(RocksDB 元数据,跑在 BlueFS 分区)、WAL(日志);默认三者同盘,若把 db/WAL 放到更快的盘(HDD 数据 + SSD db + NVMe WAL)可显著提速。
- 特性:支持 data/db/wal 分离设备;HDD/SSD/NVMe 任意组合;基于裸设备/分区(无双写、元数据效率高);全部数据与元数据带校验和,读回前先校验。
- RHCS 5 新 OSD 默认开启 sharding(分片:让压缩/回收等操作不随用量增长卡顿,更精确的 compaction)。
- 用服务规格文件声明 data/db/wal 设备:
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] }编排式建 OSD(本节课主流做法)
ceph orch device ls # 看每台主机可用盘
ceph orch daemon add osd serverc:/dev/vde # ① 指定 主机:盘
ceph orch apply osd --all-available-devices # ② 自动用所有可用盘(建 osd.all-available-devices 服务)
ceph orch ls # 服务清单(含 osd.all-available-devices / osd.default_drive_group / osd.unmanaged)
ceph orch ps | grep osd.9 # 确认 daemon 运行
ceph df # RAW STORAGE 容量视图
ceph osd tree # OSD 树:root default > host > osd.N(CLASS hdd)- 手工/LVM 路径(背景知识):cephadm 底层用
ceph-volume;ceph-volume lvm list查 OSD 与 fsid,ceph-volume lvm activate激活 systemd 单元使其开机自启。
移除与重装 OSD(实验核心流程)
ceph device ls | grep 'servere.lab.example.com:vde' # 由 设备→OSD 映射拿到 osd.ID
ceph orch daemon stop osd.ID # 停 daemon
ceph orch daemon rm osd.ID --force # 移除编排记录
ceph osd rm ID # 从 osdmap 删除
ceph orch osd rm status # 等到 "No osd remove/replace operations reported"
ceph orch device zap servere:/dev/vde --force # 抹盘(擦掉 OSD 元数据/分区)
sleep 60 && ceph orch device ls | grep servere # Available=Yes;all-available-devices 服务会自动重建 OSD--unmanaged=true(如ceph orch apply osd --all-available-devices --unmanaged=true)让服务只管“声明”,不自动增删 daemon,适合精细运维。
实验要点 · Guided Exercise(lab: component-osd)
device ls 看盘 → ceph orch daemon add osd serverc:/dev/vde(+vdf)→ ceph orch ps/ceph osd tree 验证 → ceph orch apply osd --all-available-devices 自动铺开 → 移除 servere 上某 OSD 并 zap 该盘 → 验证编排服务自动补回 → ceph orch ls 查看 all-available-devices 服务的 unmanaged 标志设置 → lab finish component-osd。
4.2 Creating and Configuring Pools
池概念回顾
- Pool=对象的逻辑分区;属性含 PG 数、CRUSH rule、保护类型(replicated/erasure)。默认 PG 数由
osd_pool_default_pg_num/pgp_num控制。 - 副本池写流程:primary 依 CRUSH 故障域选定,按当前 replica size 计算 secondary 一起写;写齐后 primary 才向客户端 ack。默认
size由osd_pool_default_size决定;min_size=能接受 I/O 的最少副本数(默认 2)。 - 纠删码池:对象切成 k 个数据块,算出 m 个编码块(与数据块同尺寸),共 k+m 块放不同 OSD;任一 OSD 挂掉可由编码块重建。EC 池不能用 object map 特性(RBD 的 resize/export/flatten 加速依赖它)。
建池命令
ceph osd pool create POOL pg_num pgp_num replicated CRUSH_RULE
ceph osd pool create POOL pg_num pgp_num erasure EC_PROFILE CRUSH_RULE
ceph osd pool set my_pool pg_num 32 # 事后调 PG 数(自动连带 pgp_num,触发 PG 迁移)
ceph osd pool set POOL size 3 # 改副本数
ceph config get mon osd_pool_default_size- 说明:
pgp_num是“生效的 PG 数”,通常等于pg_num;replicated 为默认类型;不写 crush-rule 用默认 rule(osd_pool_default_crush_replicated_ruleset)。
PG 自动缩放(Autoscaling,RHCS5 默认开)
- 每池
pg_autoscale_mode:on(自动调 PG 数)/off/warn(该调不调、只把集群置 HEALTH_WARN)。
ceph mgr module enable pg_autoscaler
ceph osd pool set POOL pg_autoscale_mode onErasure Code Profile(EC 参数)
- 用 profile 定义 k/m、插件与算法;建池引用。常用参数:
- k=数据块数(默认 2);m=可容忍丢失/编码块数(默认 1);
directory=插件库路径(/usr/lib64/ceph/erasure-code);plugin=算法插件(如 jerasure/lrc);crush-failure-domain=分块跨什么故障域放置,默认 host(块分散到不同主机);设 osd 则同一主机可放多块(主机故障即全丢,不推荐);crush-device-class=只选 hdd/ssd/nvme 类设备;crush-root=CRUSH 根;key=value/technique=插件专属。
- ⚠️ 已建池的 EC profile 不能改(只能删池重建);profile 可 ls/get/rm:
ceph osd erasure-code-profile ls
ceph osd erasure-code-profile get default- 典型:
k=8,m=4,crush-failure-domain=rack=8 数据块 +4 编码块、容忍 4 块丢失、块跨机架放置(Lab 里建 labpool2 用 64 PG)。
池运维与 Namespace
ceph osd pool rename OLD NEW # 重命名不影响数据;但客户端用户 caps 里的池名要同步改
ceph osd pool delete POOL # 删除不可逆;需先 mon_allow_pool_delete=true
rados -p POOL -N NS put obj file # 写进命名空间
rados -p POOL -N NS ls # 列命名空间对象
rados -p POOL --all ls # 列池内全部命名空间对象(--format=json-pretty 出 JSON)- Namespace 只能给直接走 librados 的应用用;RBD、RGW 客户端当前不支持。默认命名空间为空。
实验要点 · Guided Exercise(lab: component-pools)
ceph osd lspools → 建 replicated 池(CRUSH rule 0)→ 建 EC profile(如 k=8 m=4 rack 故障域)与 EC 池 → 用 Dashboard 建池 → rados 写入/读取对象验证 → 清理并 finish。
4.3 Managing Ceph Authentication(Cephx)
cephx 协议
- 基于共享密钥;客户端向 MON **申请票据(ticket)**再拿它认证到各 daemon,机制类似 Kerberos;安装默认开启,所有客户端都要认证授权。
- 账号三类用途:① daemon 内部互信(
osd.1、mgr.serverc,安装时自动建);② librados 客户端(client.前缀,如 OpenStack 的client.openstack、RGW 的client.rgw.<host>、自研应用专属账号);③ 管理员(超级用户client.admin,ceph/rados默认用它)。 - Ceph 视角下“客户端”是应用本身;终端用户由应用自己的机制认证。
用户与 keyring
ceph --id operator3 osd lspools # 以 client.operator3 身份(--id 不带前缀)
ceph --name client.operator3 … # 或 --name 带前缀
export CEPH_ARGS="--id cephuser" # 环境变量统一携带
ceph auth list # 列出全部账号与 caps
ceph auth get client.admin # 单账号详情(key + caps)
ceph auth print-key client.admin # 只打印密钥
ceph auth export client.operator1 > operator1.export && ceph auth import -i operator1.export- keyring 默认路径
/etc/ceph/ceph.client.<id>.keyring;cephadm shell 自动挂载/etc/ceph;keyring 文件要复制到每个使用该账号的客户端。
Capabilities(授权)
- 按 daemon 类型授权(mon/osd/mgr/mds):
r读(每账号至少 mon r 才能拿 CRUSH map);w写(OSD 存/改对象;MGR 上=启停模块);x执行扩展对象类(如rados lock、列 RBD 镜像);allow *全权。另有预置 profile(如 rbd profile)与 mon 命令白名单(allow command …)限制管理员。 - 示例:
# 全池读写
ceph auth get-or-create client.formyapp1 mon 'allow r' osd 'allow rw'
# 只限某池读写
ceph auth get-or-create client.formyapp2 mon 'allow r' osd 'allow rw pool=myapp'
# 限池+命名空间(GE:client.docget 先读 repl1/docs,后加写与 docarchive 池)
ceph auth get-or-create client.docget mon 'allow r' osd 'allow r pool=repl1 namespace=docs'
ceph auth caps client.docget mon 'allow r' osd 'allow rw pool=repl1 namespace=docs' osd 'allow rw pool=docarchive'
# 把 key 存到标准位置
ceph auth get-or-create client.app1 mon 'allow r' osd 'allow rw' -o /etc/ceph/ceph.client.app1.keyring- ⚠️
ceph auth caps是整组覆盖:必须一次性给出所有 daemon 的完整 caps;空串删除该 daemon 类权限(ceph auth caps client.app1 osd '')。删账号ceph auth del client.app1后记得删 keyring。
实验要点 · Guided Exercise + Lab
GE:给应用建只读/读写受限账号(pool+namespace 级),用 rados --id <user> -p <pool> put/get 验证权限边界与 keyring 分发。Lab:建 k8m4(k=8,m=4,rack)EC profile → labpool2 64 PG EC 池 → rwpool/rpool 用户 put/get /etc/profile 对象验证(rados --id rwpool -p labpool1 put my_profile /etc/profile)→ 评分收尾。
命令速查表(本章)
| 命令 | 作用 | | ceph orch device ls | 主机磁盘清单与可用性 | | ceph orch daemon add osd HOST:/dev/sdX | 指定盘建 OSD | | ceph orch apply osd --all-available-devices [--unmanaged=true] | 全可用盘自动建/声明 OSD 服务 | | ceph orch daemon stop|rm osd.ID [--force] | 停/删 OSD daemon | | ceph osd rm ID | 从 osdmap 移除 OSD | | ceph orch osd rm status | 查看/确认 OSD 移除完成 | | ceph orch device zap HOST /dev/sdX [--force] | 抹盘重加 | | ceph osd pool create P pgnum pgpnum [replicated|erasure] … | 建池 | | ceph osd pool set P size N / pg_num N / pg_autoscale_mode on | 池参数 | | ceph osd erasure-code-profile set|ls|get|rm NAME | EC profile 管理 | | rados -p P [-N NS] put|get|ls obj [file] | 对象读写(可指定命名空间/账号) | | ceph auth get-or-create client.X mon '…' osd '…' [-o file] | 建账号 | | ceph auth caps client.X mon '…' osd '…' | 改 caps(整组覆盖) | | ceph auth list|get|del|export|import|print-key | 账号管理 | | ceph df / ceph osd tree / ceph orch ls | 容量 / OSD 拓扑 / 服务状态 |
词汇表(本章)
| 英文术语 | 中文 | 一句话速记 |
|---|---|---|
| BlueStore | 蓝店后端 | 直写裸盘+WAL 日志的新一代 OSD 后端 |
| FileStore | 旧文件系统后端 | journal 双写,已弃用 |
| RocksDB / BlueFS | 键值库/文件系统 | 存 OSD 元数据(block.db) |
| WAL / write-ahead log | 预写日志 | 事务日志,放快盘可提速 |
| block.db | 元数据盘 | 放 RocksDB;可分离到 SSD |
| sharding | 分片 | 元数据分片化,控制压缩/回收成本 |
| ceph-volume | OSD 卷工具 | LVM 方式建/激活/查 OSD(fsid) |
| zap | 抹盘 | 清空磁盘上的 OSD 元数据后可重加 |
| replicated pool | 副本池 | 每对象多副本(size/min_size) |
| erasure coded pool | 纠删码池 | k+m 分块,重建不靠整对象拷贝 |
| k / m | 数据块/编码块 | m=可同时丢失块数 |
| pg_autoscaler | PG 自动缩放 | on/off/warn 三种模式(默认 on) |
| namespace | 命名空间 | 池内逻辑分区(仅 librados 直连支持) |
| min_size | 最小可用副本 | 低于它停止接受 I/O(默认 2) |
| object map | 对象映射 | RBD 加速特性,EC 池不支持 |
| cephx | Ceph 认证 | 共享密钥+MON 票据,类 Kerberos |
| capability (caps) | 权限能力 | mon/osd/mgr/mds 上的 r/w/x 授权 |
| profile | 授权模板 | 如 rbd profile、mon profile osd |
| keyring | 密钥环 | 账号密钥文件(/etc/ceph/ceph.client.X.keyring) |
自测
- BlueStore 相比 FileStore 消除了什么开销?data/db/wal 三件套如何放最能提速?
- 把 /dev/nvme0 当 db 盘、/dev/nvme1 当 wal 盘,服务规格文件怎么写?
- 列举建 OSD 的三种方式与对应命令;移除 OSD 的完整顺序(stop→rm→osd rm→zap→自动重建)?
pg_num与pgp_num的区别;调 pg_num 会发生什么?- EC 池写一个对象要写几份?(k+m 分块)它与副本池在容错与空间上的取舍?为什么 EC 池禁用 object map?
- EC profile 中 k/m/crush-failure-domain 的含义;为什么 failure domain 设 osd 不够稳妥?
- PG autoscaling 三种模式;warn 模式何时把集群置为 HEALTH_WARN?
- cephx 里
--id operator3与--name client.operator3的区别?keyring 默认放哪? - 给“只能读写 myapp 池”的用户写完整 caps;为什么
ceph auth caps要一次写全? - namespace 适合谁用、谁不支持?命令怎么写(rados -N)?
