阶段五:存储中间件之Ceph基础
任务背景
NAS(Network Attached Storage) 是一种基于 Linux 操作系统构建的网络附属存储系统,它通过网络提供文件共享服务,实现多个设备之间的数据访问与共享。它通常将一台运行 Linux 的服务器变成一个 文件服务器,可供局域网中的电脑、手机、电视等设备访问。
用户通过 Samba(SMB)、NFS、FTP 等协议访问 NAS 中共享的文件夹,无需插 U 盘、硬盘,任何设备只要连上网就能访问里面的文件、照片、视频等。
虽然使用了NAS存储, 但是对于爆炸式的数据增长仍然感觉力不从心。对于大数据与云计算等技术的成熟, 存储也需要跟上步伐. 所以这次我们选用对象存储。
认识Ceph
Ceph是一个能提供的文件存储,块存储和对象存储的分布式存储系统。它提供了一个可无限伸缩的Ceph存储集群。
文件存储、块存储和对象存储:
| 项目 | 文件存储 | 块存储 | 对象存储 |
|---|---|---|---|
| 存储单位 | 文件 | 数据块 | 对象(数据 + 元信息) |
| 访问方式 | 像访问文件夹 | 像访问硬盘 | 像访问网页 |
| 使用场景 | 文件共享、协作 | 虚拟机、数据库 | 云备份、图片视频存储 |
| 协议/接口 | SMB、NFS | iSCSI、FC | S3、HTTP API |
| 是否可挂载 | ✅ 像网络盘一样挂载 | ✅ 像磁盘一样挂载 | ❌ 不挂载,用 API 访问 |
| 特点 | 简单易用 | 性能高、灵活 | 可扩展、适合大文件 |
| 举例 | 群晖NAS、公司文件服务器 | 云硬盘、虚拟磁盘 | 阿里云OSS、AWS S3、minio |
阿里云OSS,对象存储 => Python/Java/Go/PHP 通过API接口 => 实现文件上传下载
ceph架构
参考官档: https://docs.ceph.com/docs/master/

RADOS: Ceph的高可靠,高可拓展,高性能,高自动化都是由这一层来提供的, 用户数据的存储最终也都是通过这一层来进行存储的。
可以说RADOS就是ceph底层原生的数据引擎, 但实际应用时却不直接使用它,而是分为如下4种方式来使用:
- LIBRADOS是一个库, 它允许应用程序通过访问该库来与RADOS系统进行交互,支持多种编程语言。如Python,C,C++等. 简单来说,就是给开发人员使用的接口。
- CEPH FS通过Linux内核客户端和FUSE来提供文件系统。(文件存储)
- RBD通过Linux内核客户端和QEMU/KVM驱动来提供一个分布式的块设备。(块存储)
- RADOSGW是一套基于当前流行的RESTFUL协议的网关,并且兼容S3和Swift。(对象存储)
拓展名词
RESTFUL: RESTFUL是一种架构风格,提供了一组设计原则和约束条件,http就属于这种风格的典型应用。REST最大的几个特点为:资源、统一接口、URI和无状态。
- 资源: 网络上一个具体的信息: 一个文件,一张图片,一段视频都算是一种资源。
- 统一接口: 数据的元操作,即CRUD(create, read, update和delete)操作,分别对应于HTTP方法
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。
- PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据)。
- DELETE(DELETE):从服务器删除资源。
- URI(统一资源定位符): 每个URI都对应一个特定的资源。要获取这个资源,访问它的URI就可以。最典型的URI即URL
- 无状态: 一个资源的定位与其它资源无关,不受其它资源的影响。
S3 (Simple Storage Service 简单存储服务): 可以把S3看作是一个超大的硬盘, 里面存放数据资源(文件,图片,视频等),这些资源统称为对象。这些对象存放在存储桶里,在S3叫做bucket.
和硬盘做类比, 存储桶(bucket)就相当于目录,对象就相当于文件。
硬盘路径类似/root/file1.txt
S3的URI类似s3://bucket_name/object_name
Ceph集群
集群组件
Ceph集群包括Ceph OSD,Ceph Monitor,Ceph Manager两种守护进程。
Ceph OSD(Object Storage Device): 功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD守护进程的心跳来向Ceph Monitors提供一些监控信息。 Ceph Monitor: 集群的权威状态管理节点,通过 Paxos 一致性协议在多个 Monitor 之间保持状态同步,为整个集群提供唯一可信的状态视图。
Ceph Manager: 负责汇总集群运行状态、输出监控指标,并通过插件模块机制提供可视化管理(Dashboard)、自动化运维编排(cephadm)和调度优化能力
Ceph存储集群至少需要一个Ceph Monitor一个Ceph Manager和三个 OSD 守护进程。
Monitor守护进程推荐为奇数个,建议3个及以上。因为Ceph底层判断OSD节点故障,需要过半原则。
集群环境准备

集群环境规划
| 节点名称 | 系统 | IP地址 | ceph角色 | 硬盘 |
|---|---|---|---|---|
| node1 | CentOS Stream 9 | 192.168.88.101 | mon,mgr,服务器端,管理节点 | /dev/sda,/dev/sdb,/dev/sdc/ |
| node2 | CentOS Stream 9 | 192.168.88.102 | mon,mgr | /dev/sda,/dev/sdb,/dev/sdc/ |
| node3 | CentOS Stream 9 | 192.168.88.103 | mon,mgr | /dev/sdb,/dev/sdb,/dev/sdc/ |
| node4 | CentOS Stream 9 | 192.168.88.104 | 客户端,管理节点 |
准备工作:
准备四台服务器,需要能上外网,IP静态固定 (除node4外每台最少加3个磁盘,最小20G,不用分区)
如果启动后,lsblk查看不到新磁盘,可以使用如下命令:
for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done
-----------------------------------------------------------------------------------------------------
注意:如果磁盘是非空的,可以使用如下方式擦除,必须保证磁盘是干净的。
# Step 1:停用 LVM 卷组
vgremove -f $(vgdisplay | grep 'VG Name' | awk '{print $3}') 2>/dev/null
# Step 2:移除 PV
pvremove -ff /dev/sda /dev/sdb /dev/sdc
# Step 3:清除文件系统签名
wipefs -a /dev/sda
wipefs -a /dev/sdb
wipefs -a /dev/sdc
# Step 4:清除 GPT 分区表
sgdisk --zap-all /dev/sda
sgdisk --zap-all /dev/sdb
sgdisk --zap-all /dev/sdc
# Step 5(可选):物理清空块设备(可能失败,但推荐尝试)
blkdiscard /dev/sda || echo "blkdiscard /dev/sda 跳过"
blkdiscard /dev/sdb || echo "blkdiscard /dev/sdb 跳过"
blkdiscard /dev/sdc || echo "blkdiscard /dev/sdc 跳过"
# Step 6:刷新内核缓存
partprobe
udevadm settle1, 配置主机名和主机名绑定(所有节点都要绑定)
(注意:这里都全改成短主机名,方便后面实验。如果你坚持用类似vm1.cluster.com这种主机名,或者加别名的话,ceph会在后面截取你的主机名vm1.cluster.com为vm1,造成不一致导致出错)
# hostnamectl set-hostname --static node1
# hostnamectl set-hostname --static node2
# hostnamectl set-hostname --static node3
# hostnamectl set-hostname --static node4
# vim /etc/hosts
192.168.88.101 node1
192.168.88.102 node2
192.168.88.103 node3
192.168.88.104 node4命令作用:
- 这条命令用于打开并编辑文件。进入编辑器后需要保存退出,修改才会写回文件。
执行结果:
- 编辑器会打开目标文件;保存并退出后文件内容才会改变。
关键参数:
注意事项:
关键参数:
注意事项:
cluster:
services:
把集群公钥复制到将成为集群成员的节点
注:如果操作错了给node1、node4打上管理员标签,拷贝ceph配置文件和keyring到node4(忽略操作)
**注意事项:**
作用:用来安装、配置、管理和监控Ceph集群,运行ceph命令、dashboard、集群编排等管理操作。
特点:通常是你登录运维操作的节点,可以与其他服务节点共用(如mon、mgr),也可以单独设立。
作用:负责维护集群的健康状态、监控集群各节点服务,并保存集群的元数据(如集群成员、认证信息、服务状态等),是Ceph集群的大脑。
特点:至少需要1个(生产建议3个奇数个),所有客户端、OSD、MGR等组件都要和MON通信,保障集群一致性和高可用。
有坑:不同的VMware版本,可能添加磁盘时,产生的磁盘名称不一致
第一块盘:sdb
第二块盘:sdc
第三块盘:sdd
第一块盘:sda
第二块盘:sdb
第三块盘:sdc
具体添加盘对应是设备名称,可以通过`lsblk`来进行查看!!!
或者:如果磁盘无法添加,报错,提示磁盘非空,可以考虑使用如下脚本清理所有磁盘:disk_clean.sh
#!/bin/bash
**注意事项:**注意事项:
cluster:
services:
data:
恢复老师发的node1、node2、node3、node4,如果异常,可以快速恢复:
#!/bin/bash
注意事项:
1,获取fsid
---------------------------------------------- cluster: ...
--keep-logs:保留日志文件。
还可以通过:
#!/bin/bash
**注意事项:**
假设再加一个新的集群节点node4
注意事项:
注意:
注意事项:
假设要从ceph集群中移除node3
2,从ceph集群移除osd
删除osd
删除osd秘钥删除crush
删除逻辑卷
删除卷组删除物理卷
清理磁盘要实现数据存取需要创建一个pool,创建pool要先分配PG。

答案是通过CRUSH算法。

CRUSH算法
---
生活中的案例类比:
假设你要存一个包裹
选定仓库(Pool): 我要把这批货物存到‘服装仓库。
分配到某个分区(PG): 仓库有很多分区(比如128个),仓库管理员(Ceph)用CRUSH算法决定,这个包裹应该归到2区。
分区决定包裹交给哪些保管员/货架(OSD): 2区有三个保管员在负责(副本数为3),包裹分别存给A、B、C三个保管员,每人一份副本(这样即使A出问题,B和C还能找回)。
真正落地到保管员(OSD)手里: 保管员把货物放到自己的货架上,负责任何时候都能找出来。
---
小结:
创建test_pool,指定pg数为128
---
---
在部署节点node1上增加参数允许ceph删除pool
本文由飞书云文档同步生成。涉及命令、SQL、配置示例时,请以飞书源文档和实际环境执行结果为准。