Ceph 分布式存储
一、Ceph 概述
1. 核心特性
- 开源、分布式、软件定义存储,支持对象、块、文件三种存储模式
- 高可用、高扩展、易用性强,可部署在 x86/ARM 混合架构服务器
- 采用 RADOS 核心架构,去中心化设计,通过 CRUSH 算法实现数据自主存储
- 支持 PB/EB 级存储容量,数千客户端并发访问
2. 应用场景
- 高性能计算、日志留存、智慧城市、虚拟化/云环境
- 数据库存储、资源池化、海量数据挖掘
二、用户角色与权限
1. 核心角色
| 角色 | 核心职责 |
|---|---|
| 存储管理员 | 集群安装配置、维护、培训、灾难恢复、自动化集成 |
| 存储操作员 | 日常运维、集群监控、故障设备更换(依赖 Dashboard) |
| 应用架构师 | 集群架构设计、资源规划、延迟优化 |
| 云操作员 | 云资源管理(OpenStack/OpenShift)、集群协作维护 |
2. 角色配置差异
- 云服务提供商:侧重云操作员、存储操作员(不维护存储)
- 金融机构:全角色内部配备,存储管理员作为服务核心
- 小型机构/高校:技术支持人员兼任多角色
三、集群架构
1. 核心组件
- RADOS:可靠自主分布式对象存储,Ceph 核心
- MON(监控器):维护集群状态映射,奇数部署(需超过半数正常运行)
- OSD(对象存储设备):存储数据、处理复制/恢复/重平衡,每磁盘对应一个 OSD 进程
- MGR(管理器):集群指标监控、提供 Dashboard/REST API
- MDS(元数据服务器):管理 CephFS 元数据,支持 POSIX 命令
2. 访问接口
- librados:原生 API,支持多语言(C/C++/Java/Python 等),性能最优
- RBD:块设备接口,支持 KVM/QEMU/OpenStack Cinder
- RADOSGW:对象网关,支持 S3/Swift API,适用于备份/文件共享
- CephFS:并行文件系统,支持快照、POSIX 兼容
3. 集群映射(Cluster Map)
包含 5 类核心映射,通过 ceph mon dump/ceph osd dump 等命令查看:
- 监视器映射:集群 ID、MON 地址端口
- OSD 映射:池列表、复本大小、OSD 状态
- 放置组映射:PG 状态、数据使用统计
- CRUSH 映射:存储设备层级、数据放置规则
- MDS 映射:元数据服务器状态
四、集群部署(cephadm 方式)
1. 环境准备
Bash
# 1. 配置主机名解析
cat >> /etc/hosts << EOF
192.168.108.10 client.laogao.cloud client
192.168.108.11 ceph1.laogao.cloud ceph1
192.168.108.12 ceph2.laogao.cloud ceph2
192.168.108.13 ceph3.laogao.cloud ceph3
192.168.108.14 ceph4.laogao.cloud ceph4
192.168.108.15 ceph5.laogao.cloud ceph5
192.168.108.16 ceph6.laogao.cloud ceph6
EOF
# 2. 关闭 SELinux 和防火墙
sed -ri 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
systemctl disable firewalld --now
# 3. 配置 YUM 仓库
cat << 'EOF' > /etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/storage/x86_64/ceph-pacific
enabled=1
gpgcheck=0
EOF
# 4. 安装依赖包
dnf install -y bash-completion vim chrony cephadm podman
# 5. 时间同步
systemctl enable chronyd --now
# 6. 下载镜像
podman pull quay.io/ceph/ceph:v16
podman pull quay.io/ceph/ceph-grafana:8.3.5
podman pull quay.io/prometheus/node-exporter:v1.3.1
2. 集群初始化
Bash
# 引导集群(ceph1 作为引导节点)
cephadm bootstrap --mon-ip 192.168.108.11 \
--allow-fqdn-hostname \
--initial-dashboard-user admin \
--initial-dashboard-password laogao@123 \
--dashboard-password-noupdate
# 安装客户端工具
dnf install -y ceph-common
# 验证集群状态
ceph status
3. 添加集群节点
Bash
# 获取集群公钥
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
# 添加节点到集群
ceph orch host add ceph2.laogao.cloud
ceph orch host add ceph3.laogao.cloud
# 验证节点状态
ceph orch host ls
4. 部署核心组件
Bash
# 部署 MON(指定 admin 标签节点)
ceph orch host label add ceph2.laogao.cloud _admin
ceph orch host label add ceph3.laogao.cloud _admin
ceph orch apply mon --placement="label:_admin"
# 部署 MGR
ceph orch apply mgr --placement="label:_admin"
# 部署 OSD(使用所有可用设备)
ceph orch apply osd --all-available-devices
# 验证组件状态
ceph orch ls
ceph osd tree
五、核心功能操作
1. 池管理
Bash
# 创建复本池
ceph osd pool create pool_web 32 32 replicated
# 创建纠删码池
ceph osd pool create pool_era 32 32 erasure
# 设置池配额(最大 10G/10 万对象)
ceph osd pool set-quota pool_web max_bytes 10G
ceph osd pool set-quota pool_web max_objects 100000
# 重命名池
ceph osd pool rename pool_web pool_apache
# 删除池(需先开启删除权限)
ceph config set mon mon_allow_pool_delete true
ceph osd pool rm pool_apache pool_apache --yes-i-really-really-mean-it
2. 对象管理(rados 命令)
Bash
# 上传对象
echo "test data" > testfile
rados -p pool_web put testobj testfile
# 查看对象
rados -p pool_web ls
rados -p pool_web stat testobj
# 下载对象
rados -p pool_web get testobj downloadfile
# 删除对象
rados -p pool_web rm testobj
# 创建池快照
ceph osd pool mksnap pool_web snap1
# 恢复快照对象
rados -p pool_web -s snap1 rollback testobj
3. 块存储管理(RBD)
Bash
# 创建 RBD 池并初始化
ceph osd pool create rbd_pool 32
rbd pool init rbd_pool
# 创建 RBD 镜像(10G)
rbd create rbd_pool/webapp --size 10G
# 映射镜像到本地
rbd map rbd_pool/webapp
# 格式化并挂载
mkfs.xfs /dev/rbd0
mkdir /mnt/rbd_webapp
mount /dev/rbd0 /mnt/rbd_webapp
# 创建快照
rbd snap create rbd_pool/webapp@snap1
# 克隆快照
rbd snap protect rbd_pool/webapp@snap1
rbd clone rbd_pool/webapp@snap1 rbd_pool/webapp_clone
# 卸载并取消映射
umount /mnt/rbd_webapp
rbd unmap /dev/rbd0
4. 对象存储管理(RGW)
Bash
# 创建对象存储域/区域组/区域
radosgw-admin realm create --rgw-realm=webapp --default
radosgw-admin zonegroup create --rgw-realm=webapp --rgw-zonegroup=video --master --default
radosgw-admin zone create --rgw-realm=webapp --rgw-zonegroup=video --rgw-zone=storage --master --default
radosgw-admin period update --rgw-realm=webapp --commit
# 部署 RGW 服务
ceph orch apply rgw webapp --placement="3 ceph1 ceph2 ceph3" --realm=webapp --zone=storage --port=8080
# 创建 RGW 用户
radosgw-admin user create --uid="s3user" --display-name="S3 User"
# AWS CLI 配置
aws configure set aws_access_key_id <access_key>
aws configure set aws_secret_access_key <secret_key>
# 创建存储桶并上传文件
aws --endpoint=http://ceph1:8080 s3 mb s3://mybucket
aws --endpoint=http://ceph1:8080 s3 cp testfile s3://mybucket
5. 文件系统管理(CephFS)
Bash
# 创建 CephFS(卷方式)
ceph fs volume create cephfs --placement="3 ceph1 ceph2 ceph3"
# 授权用户
ceph fs authorize cephfs client.cephfs_user / rwps > /etc/ceph/ceph.client.cephfs_user.keyring
# Kernel 挂载
mkdir /mnt/cephfs
mount.ceph ceph1.laogao.cloud:/ /mnt/cephfs -o name=cephfs_user,fs=cephfs
# FUSE 挂载(需安装 ceph-fuse)
dnf install -y ceph-fuse
ceph-fuse -n client.cephfs_user /mnt/cephfs_fuse
# 创建快照
mkdir /mnt/cephfs/.snap/snap1
# 卸载
umount /mnt/cephfs
umount /mnt/cephfs_fuse
6. 认证与授权
Bash
# 创建用户
ceph auth add client.test mon 'allow r' osd 'allow rw pool=pool_web'
# 导出用户密钥
ceph auth get client.test -o /etc/ceph/ceph.client.test.keyring
# 修改权限
ceph auth caps client.test mon 'allow rw' osd 'allow *'
# 删除用户
ceph auth rm client.test
六、集群配置与维护
1. 配置管理
Bash
# 查看配置
ceph config ls
ceph config get mon public_network
# 修改配置
ceph config set mon public_network 192.168.108.0/24
ceph config set osd osd_pool_default_size 3
# 运行时修改配置
ceph tell mon.* config set mon_allow_pool_delete true
# 查看配置历史
ceph config log
2. 集群监控
Bash
# 查看集群状态
ceph -s
ceph health detail
# 查看 OSD 状态
ceph osd status
ceph osd tree
# 查看 MON 仲裁状态
ceph mon stat
ceph quorum_status -f json-pretty
# Dashboard 访问
# URL: https://ceph1.laogao.cloud:8443
# 用户名: admin,密码: laogao@123
3. 故障处理
Bash
# 替换故障 OSD
ceph osd out osd.0
ceph orch daemon rm osd.0 --force
ceph osd crush rm osd.0
ceph osd rm 0
ceph orch device zap ceph1 /dev/sdb --force
# 重启组件
ceph orch daemon restart mon.ceph1
ceph orch restart osd.all-available-devices
# 修复 PG 不一致
ceph pg repair <pg_id>
七、多站点部署
1. RBD 镜像同步(单向)
Bash
# 主集群创建池和镜像
ceph osd pool create rbd 32
rbd pool init rbd
rbd create rbd/image1 --size 1024 --image-feature=layering,exclusive-lock,journaling
rbd mirror pool enable rbd pool
# 生成引导令牌
rbd mirror pool peer bootstrap create --site-name prod rbd > bootstrap_token
# 备集群导入令牌并部署 rbd-mirror
scp bootstrap_token root@ceph4:
ceph orch apply rbd-mirror --placement=ceph4
rbd mirror pool peer bootstrap import --site-name backup --direction rx-only rbd bootstrap_token
2. CephFS 镜像同步
Bash
# 源集群部署 mirror 守护进程
ceph orch apply cephfs-mirror ceph1
# 目标集群创建用户
ceph fs authorize cephfs client.cephfs-mirror / rwps
# 目标集群生成引导令牌
ceph fs snapshot mirror peer_bootstrap create cephfs client.cephfs-mirror backup
# 源集群导入令牌
ceph fs snapshot mirror peer_bootstrap import cephfs <token>
# 添加同步目录
ceph fs snapshot mirror add cephfs /webapp