Ceph分布式存储核心知识点与实验总结
Ceph分布式存储核心知识点与实验总结
一、文档概述
本文档是一本完整的Ceph分布式存储教材,涵盖了从基础概念、架构原理、部署实施到高级特性(块存储、对象存储、文件系统)的全栈知识。Ceph作为开源的软件定义存储(SDS)解决方案,提供统一存储能力(对象、块、文件),具有去中心化、高扩展性、自修复等特点。文档重点介绍了Cephadm容器化部署方式、集群管理、存储池配置、RBD镜像管理、RADOS网关对象存储以及CephFS文件系统等内容。
二、核心知识点总结
1. Ceph架构组件
| 组件 | 功能 |
|---|---|
| MON | 维护集群状态映射(Cluster Map),通过Paxos算法保证一致性,奇数个节点构成仲裁 |
| OSD | 对象存储设备,实际存储数据,处理数据复制、恢复和再平衡 |
| MGR | 提供集群监控、Dashboard Web界面和REST API |
| MDS | 元数据服务器,仅为CephFS服务,管理文件名、目录、权限等元数据 |
| RADOS | 可靠自主分布式对象存储核心,实现CRUSH算法进行数据分布 |
2. 核心原理
- CRUSH算法:客户端直接计算对象存储位置,无需中心查表,实现线性扩展。
- PG(Placement Group):对象→PG→OSD的映射中间层,聚合对象以减少管理开销。
- 数据访问流程:客户端先连接MON获取Cluster Map → CRUSH计算PG及主OSD → 直接与主OSD通信读写。
- 数据保护模式:
- 复本池(Replicated):默认size=3,高读性能,空间利用率低。
- 纠删码池(Erasure Code):k+m模式,空间利用率高,需消耗CPU计算。
3. 部署方式
- Cephadm(推荐):容器化部署,使用Podman/Docker,通过SSH管理节点,支持Pacific及更新版本。
- Rook:Kubernetes原生部署。
- 其他:ceph-ansible、手动部署(已不推荐)。
4. 访问接口
| 接口 | 说明 | 典型应用 |
|---|---|---|
| librados | 原生C/C++ API,最高性能 | 直接开发应用 |
| RBD | 块设备,支持精简配置、快照、克隆 | OpenStack Cinder、KVM虚拟机 |
| RGW | 对象网关,兼容S3和Swift API | 备份、图片存储、云存储服务 |
| CephFS | POSIX兼容的文件系统 | 共享存储、HPC、容器持久化 |
5. 高可用与容灾
- RBD Mirroring:两个Ceph集群间异步复制RBD镜像,支持主动-被动和主动-主动模式。
- CephFS Mirror:基于快照的异步文件系统镜像,用于灾难恢复。
- RADOS Gateway多站点:跨区域对象数据同步,通过Realm、Zonegroup、Zone实现。
6. 认证与授权
- Cephx:共享密钥认证协议,所有访问需认证。
- 用户类型:
client.<name>用于外部客户端,守护进程(如osd.0)内置账户。 - 能力(Capabilities):
allow r(读)、allow w(写)、allow x(执行类方法)、allow *(全部)。
7. 配置管理
- 集中配置数据库:存储在MON节点,使用
ceph config set命令持久化修改,优先级高于本地ceph.conf。 - 运行时覆盖:
ceph tell <daemon> injectargs临时生效,重启后恢复。
三、关键实验及注释代码
以下实验基于Ceph Pacific(v16)和CentOS Stream 8环境,使用cephadm部署。
实验1:使用Cephadm引导单节点集群
# 步骤1:安装cephadm(需要网络访问yum源)
dnf install -y cephadm
# 步骤2:引导集群,指定Monitor IP和Dashboard密码
cephadm bootstrap \
--mon-ip 192.168.108.11 \ # Monitor所在的IP地址
--allow-fqdn-hostname \ # 允许使用完全限定域名
--initial-dashboard-user admin \ # Dashboard登录用户名
--initial-dashboard-password laogao@123 \ # 初始密码
--dashboard-password-noupdate # 禁止后续自动更新密码
# 引导成功后输出重要信息:
# - Dashboard访问URL: https://ceph1.laogao.cloud:8443/
# - 管理员密钥环文件: /etc/ceph/ceph.client.admin.keyring
# - 集群FSID: 自动生成的UUID
说明:bootstrap命令会在当前节点创建一个最小集群(1个MON+1个MGR),并自动生成SSH密钥、配置文件、密钥环文件,同时部署监控组件(Prometheus、Grafana、Alertmanager等)。
实验2:添加新节点并部署OSD
# 在ceph1节点(已引导)上操作
# 1. 获取集群公钥并分发到其他节点
ceph cephadm get-pub-key > ~/ceph.pub
ssh-copy-id -f -i ~/ceph.pub root@ceph2.laogao.cloud
ssh-copy-id -f -i ~/ceph.pub root@ceph3.laogao.cloud
# 2. 将主机添加到集群
ceph orch host add ceph2.laogao.cloud 192.168.108.12
ceph orch host add ceph3.laogao.cloud 192.168.108.13
# 3. 查看主机列表
ceph orch host ls
# 输出示例:
# HOST ADDR LABELS STATUS
# ceph1.laogao.cloud 192.168.108.11 _admin
# ceph2.laogao.cloud 192.168.108.12
# ceph3.laogao.cloud 192.168.108.13
# 4. 自动将所有空闲磁盘部署为OSD
ceph orch apply osd --all-available-devices
# 5. 查看OSD状态
ceph osd tree
# 输出显示每个主机的OSD及其权重、状态(up/in)
说明:cephadm的编排器会自动在新主机上部署MON、MGR、OSD等守护进程(容器化)。--all-available-devices会将所有未使用的磁盘(无分区、无文件系统)直接作为OSD使用,默认使用bluestore后端。
实验3:创建存储池并管理对象
# 1. 创建复本池(默认size=3)
ceph osd pool create mypool 32 32 replicated
# 参数:池名称,PG数量,PGP数量(通常等于PG数),类型
# 2. 查看池列表
ceph osd pool ls detail
# 输出包含池ID、副本数、CRUSH规则、应用类型等
# 3. 为池指定应用类型(RBD、RGW、CephFS)
ceph osd pool application enable mypool rbd
# 4. 上传对象到池中
rados -p mypool put myobject /etc/hosts
# rados命令:-p指定池,put表示上传,myobject为对象名,后跟本地文件
# 5. 列出池中所有对象
rados -p mypool ls
# 6. 查看对象位置(映射到哪个OSD)
ceph osd map mypool myobject
# 输出:对象 -> PG -> up([主OSD, 从OSD...]) -> acting([主OSD, 从OSD...])
# 7. 获取对象到本地
rados -p mypool get myobject ./downloaded_hosts
# 8. 删除对象
rados -p mypool rm myobject
说明:PG的数量计算经验公式:(OSD数 * 100) / 副本数,结果向上取整到2的幂。生产环境建议单个OSD对应100~200个PG。
实验4:RBD块设备操作
# 1. 创建RBD专用池并初始化
ceph osd pool create rbd_pool 64 64
rbd pool init rbd_pool
# 这等同于执行:ceph osd pool application enable rbd_pool rbd
# 2. 创建1GB大小的RBD镜像
rbd create --size 1G rbd_pool/webimage
# 或者:rbd create rbd_pool/webimage --size 1G
# 3. 查看镜像信息
rbd info rbd_pool/webimage
# 输出关键字段:size, order(对象大小4M), features( layering, exclusive-lock等)
# 4. 将RBD镜像映射到内核块设备(需要root权限)
rbd device map rbd_pool/webimage
# 默认映射为 /dev/rbd0
# 5. 格式化并挂载
mkfs.xfs /dev/rbd0
mkdir /mnt/rbd
mount /dev/rbd0 /mnt/rbd
# 6. 写入测试数据
echo "Hello RBD" > /mnt/rbd/test.txt
# 7. 创建快照(先卸载或冻结文件系统)
umount /mnt/rbd
rbd snap create rbd_pool/webimage@snap1
# 8. 列出快照
rbd snap ls rbd_pool/webimage
# 9. 回滚快照(会覆盖当前数据)
rbd snap rollback rbd_pool/webimage@snap1
# 10. 保护快照(防止误删,支持克隆)
rbd snap protect rbd_pool/webimage@snap1
# 11. 从快照克隆出新的可写镜像
rbd clone rbd_pool/webimage@snap1 rbd_pool/webimage_clone
# 12. 扁平化克隆(脱离父快照依赖)
rbd flatten rbd_pool/webimage_clone
# 13. 删除快照(需先解除保护)
rbd snap unprotect rbd_pool/webimage@snap1
rbd snap rm rbd_pool/webimage@snap1
# 14. 删除镜像(放入垃圾箱再彻底删除)
rbd trash mv rbd_pool/webimage
rbd trash ls rbd_pool # 获取镜像ID
rbd trash rm rbd_pool <image-id>
说明:RBD默认开启layering、exclusive-lock、object-map、fast-diff、deep-flatten等特性。其中exclusive-lock保证同一时刻只有一个客户端写入,防止数据损坏;object-map加速快照差异计算。
实验5:RADOS网关(RGW)部署与S3访问
# 1. 创建Realm(全局命名空间)
radosgw-admin realm create --rgw-realm=myrealm --default
# 2. 创建Zonegroup(区域组)
radosgw-admin zonegroup create --rgw-realm=myrealm --rgw-zonegroup=mygroup --master --default
# 3. 创建Zone(区域)
radosgw-admin zone create --rgw-realm=myrealm --rgw-zonegroup=mygroup --rgw-zone=myzone --master --default
# 4. 提交配置周期
radosgw-admin period update --commit
# 5. 使用编排器部署RGW服务(3个实例,端口8080)
ceph orch apply rgw myrealm --placement="3 ceph1 ceph2 ceph3" --realm=myrealm --zone=myzone --port=8080
# 6. 创建S3用户(自动生成access_key和secret_key)
radosgw-admin user create --uid=s3user --display-name="S3 User" --email=s3@example.com
# 7. 在客户端安装awscli并配置
pip3 install awscli
aws configure
# 输入Access Key, Secret Key, 区域留空
# 8. 创建存储桶(bucket)
aws --endpoint-url=http://ceph1.laogao.cloud:8080 s3 mb s3://mybucket
# 9. 上传文件
aws --endpoint-url=http://ceph1.laogao.cloud:8080 s3 cp ./localfile s3://mybucket/
# 10. 列出桶内对象
aws --endpoint-url=http://ceph1.laogao.cloud:8080 s3 ls s3://mybucket/
# 11. 下载对象
aws --endpoint-url=http://ceph1.laogao.cloud:8080 s3 cp s3://mybucket/localfile ./downloaded
# 12. 删除桶(需先清空)
aws --endpoint-url=http://ceph1.laogao.cloud:8080 s3 rm s3://mybucket/localfile
aws --endpoint-url=http://ceph1.laogao.cloud:8080 s3 rb s3://mybucket
说明:RGW默认使用端口80(HTTP)或443(HTTPS),本例改为8080。多站点配置需在两个集群间建立对等关系,通过radosgw-admin realm pull同步配置。
实验6:CephFS文件系统挂载
# 1. 创建CephFS所需的两个池(元数据池和数据池)
ceph osd pool create cephfs_metadata 32 32
ceph osd pool create cephfs_data 128 32
# 2. 为元数据池增加副本数(保证元数据可靠性)
ceph osd pool set cephfs_metadata size 3
# 3. 创建文件系统
ceph fs new mycephfs cephfs_metadata cephfs_data
# 4. 部署MDS(至少一个active,可选standby)
ceph orch apply mds mycephfs --placement="2 ceph1 ceph2"
# 5. 查看文件系统状态
ceph fs status mycephfs
# 6. 在客户端安装ceph-common并复制配置和密钥
# 服务端操作:
ceph auth get-or-create client.myuser mon 'allow r' mds 'allow rw' osd 'allow rw pool=cephfs_data' -o /etc/ceph/ceph.client.myuser.keyring
scp /etc/ceph/ceph.conf root@client:/etc/ceph/
scp /etc/ceph/ceph.client.myuser.keyring root@client:/etc/ceph/
# 7. 客户端使用内核驱动挂载(需内核支持)
mount -t ceph ceph1.laogao.cloud:6789,ceph2.laogao.cloud:6789:/ /mnt/cephfs \
-o name=myuser,secretfile=/etc/ceph/ceph.client.myuser.keyring
# 8. 或者使用FUSE挂载(支持配额和ACL)
ceph-fuse -n client.myuser /mnt/cephfs
# 9. 测试文件读写
echo "CephFS test" > /mnt/cephfs/test.txt
ls -l /mnt/cephfs/
# 10. 创建快照(在.snap目录下创建子目录)
mkdir /mnt/cephfs/.snap/snapshot1
# 恢复文件:从.snap/snapshot1中拷贝
cp /mnt/cephfs/.snap/snapshot1/test.txt /restore/
# 11. 设置目录配额(限制5GB)
setfattr -n ceph.quota.max_bytes -v 5000000000 /mnt/cephfs/my_dir
说明:CephFS支持多个active MDS以提高元数据性能(需设置max_mds>1)。快照功能默认启用,创建快照实质是在.snap目录下创建空目录,Ceph自动记录该时间点所有元数据和数据。
实验7:配置管理(集中配置数据库)
# 1. 查看所有可配置项
ceph config ls
# 2. 获取某个守护进程的完整运行时配置(含默认值)
ceph config show-with-defaults mon.ceph1
# 3. 获取特定配置项的值
ceph config get mon.ceph1 mon_allow_pool_delete
# 输出:false
# 4. 修改配置(永久生效,自动同步到所有相关守护进程)
ceph config set mon mon_allow_pool_delete true
# 5. 临时覆盖某个守护进程的配置(重启后丢失)
ceph tell mon.ceph1 injectargs --mon_allow_pool_delete=false
# 6. 查看配置修改历史
ceph config log 5
# 7. 回滚到指定历史版本
ceph config reset 12 # 12为日志中的条目序号
说明:集中配置数据库优先级高于本地ceph.conf,建议使用ceph config set进行永久配置。临时修改用于调试,使用injectargs。
四、总结与最佳实践
-
部署规划:
- MON节点奇数个(3/5/7),独立于OSD节点以降低故障半径。
- 网络分离:public_network(客户端访问)和cluster_network(OSD心跳和复制)。
- 磁盘规划:OSD推荐使用SSD作WAL/DB分区,HDD作数据盘;日志独立SSD可显著提升性能。
-
性能调优:
- PG数量:单个OSD 100~200个PG,过多消耗内存,过少导致再平衡缓慢。
- RBD缓存:启用
rbd_cache = true,写策略writearound适合顺序读写,writeback适合随机写。 - OSD内存:默认4GB,可通过
osd_memory_target动态调整。
-
高可用配置:
- 关键池副本数至少3,min_size设为2,防止脑裂。
- 部署至少2个MGR实现主备。
- 跨地域灾备使用RBD Mirroring或RGW多站点。
-
安全加固:
- 启用Cephx认证,禁用匿名访问。
- 使用防火墙限制端口(6789, 3300, 6800-7300, 8443等)。
- 定期轮换client.admin密钥。
-
监控与运维:
- 内置Dashboard提供图形化管理(URL: https://:8443)。
- 使用Prometheus + Grafana导出集群指标。
- 定期执行
ceph health detail排查告警。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)