分布式存储系统Ceph
一、Ceph 详细讲解
Ceph 是一个分布式存储系统,支持对象存储、块存储和文件存储,具有高可用性、可扩展性和自修复能力。它主要用于云计算、企业存储、数据中心等场景,广泛集成到 OpenStack、Kubernetes 等平台。
1. Ceph 的核心原理
1.1 Ceph 的架构
Ceph 由多个组件组成,核心组件包括:
-
RADOS(Reliable Autonomic Distributed Object Store)
Ceph 底层的分布式对象存储系统,负责数据存储、复制、分布等。 -
OSD(Object Storage Daemon)
负责存储数据,进行数据复制、恢复、回填等操作。每个 OSD 守护进程通常对应一个物理磁盘或存储设备。 -
Monitor(MON)
维护整个 Ceph 集群的状态、认证信息和集群成员关系,提供一致性的集群管理。 -
Manager(MGR)
提供监控、性能统计、Web UI 等增强功能。 -
Metadata Server(MDS)(仅用于 CephFS)
主要用于管理 CephFS(Ceph 文件存储)的元数据,支持 POSIX 兼容的文件系统
1.2 Ceph 的数据存储方式
Ceph 的数据存储方式基于对象存储,不同于传统的块存储和文件存储。数据存储流程如下:
-
数据对象化
-
Ceph 不直接存储文件,而是将数据拆分为多个对象(Object)。
-
-
对象分布管理(CRUSH 算法)
-
采用 CRUSH(Controlled Replication Under Scalable Hashing)算法,根据集群拓扑自动分配对象,而不依赖集中式索引表。
-
-
副本管理
-
每个对象根据配置的副本策略(例如 3 副本)复制到多个 OSD 设备上,确保数据高可用。
-
-
存储池(Pool)
-
Ceph 通过存储池(Pool)对数据进行逻辑分组,每个 Pool 都有独立的 CRUSH 规则。
-
2. Ceph 的作用
Ceph 主要用于三大存储场景:
-
对象存储(Ceph Object Storage)
-
兼容 Amazon S3 和 OpenStack Swift 接口,适用于云存储、大规模非结构化数据存储。
-
-
块存储(Ceph Block Storage)
-
适用于虚拟机磁盘、数据库存储,提供快照、克隆等功能。
-
-
文件存储(CephFS)
-
提供 POSIX 兼容的分布式文件存储系统,适用于高性能计算、企业存储等。
-
3. Ceph 的使用逻辑
3.1 Ceph 的基本操作
1)安装 Ceph
在 Debian/Ubuntu 上:
sudo apt update
sudo apt install ceph -y
在 CentOS/RHEL 上:
sudo yum install -y epel-release
sudo yum install -y ceph
2)部署 Ceph
通常使用 ceph-deploy
或 cephadm
进行部署:
ceph-deploy new mon-node
ceph-deploy install mon-node osd-node
ceph-deploy mon create-initial
3)创建存储池(Pool)
ceph osd pool create mypool 128
4)存储对象
使用 rados
命令存取对象:
echo "Hello Ceph" | rados put obj1 mypool
rados get obj1 mypool -o obj1.txt
5)使用 Ceph 块存储
rbd create myimage --size 10240 --pool mypool
rbd map myimage --pool mypool
mkfs.ext4 /dev/rbd/mypool/myimage
mount /dev/rbd/mypool/myimage /mnt
6)使用 CephFS
ceph fs new myfs myfs_metadata myfs_data
mount -t ceph mon-node:/ /mnt -o name=admin
4. Ceph 的优势
-
高可用性:数据自动复制,故障自动恢复。
-
水平扩展:可以轻松增加 OSD,提高存储容量和性能。
-
无需专用硬件:可以运行在普通服务器和标准磁盘上。
-
自管理:通过 CRUSH 自动分布数据,减少管理工作。
-
多功能支持:同时支持对象存储、块存储、文件存储。
5. Ceph 的不足
-
高资源占用:需要较多 CPU、内存和磁盘 IO,适用于大规模集群,不适合小规模部署。
-
复杂性较高:需要深入理解其架构和配置,部署和维护难度较大。
-
性能调优要求高:在高性能场景(如数据库存储)需要仔细调整参数。
6. Ceph 适用场景
-
大规模云存储(如 OpenStack Swift、AWS S3 兼容存储)
-
企业级分布式存储
-
高可用块存储(如 Kubernetes 持久化存储)
-
HPC(高性能计算)文件存储
-
数据湖、大数据分析存储
7. 总结
Ceph 是一个强大的分布式存储系统,适用于云计算、企业存储、大数据等场景。其核心优势在于高可用性、可扩展性、自动管理,但对硬件资源要求较高,管理复杂度较大。对于大规模存储需求,Ceph 是一个优秀的选择,但在小规模部署时可能需要额外优化。
如果你想在 PVE 或 Kubernetes 上使用 Ceph,可以进一步学习 Ceph 在这些平台上的集成方法,例如:
-
PVE Ceph(Proxmox VE + Ceph)
-
Kubernetes Ceph RBD(K8s 使用 Ceph 作为存储后端)
-
CephFS 高可用存储
二、对象存储、块存储、文件存储的区别、原理与工作方式
在分布式存储系统中,对象存储、块存储和文件存储是三种主要的数据存储方式,它们各有不同的原理和适用场景。
1. 对象存储(Object Storage)
对象存储是一种无层级结构的存储方式,它将数据作为对象存储,并使用**唯一的 ID(哈希值、UUID 等)**进行管理,而不是传统的文件路径或块地址。
1.1 原理
-
数据存储为对象(Object)
每个对象包含:-
数据(文件的实际内容)
-
元数据(用户自定义的键值对,例如创建时间、访问权限等)
-
唯一标识符(Object ID)(用于查询和检索)
-
-
无层级目录结构
-
传统文件存储使用文件夹层级管理数据,而对象存储直接存放在**存储池(Bucket)**中。
-
通过HTTP API 进行访问,而非 POSIX 文件路径。
-
-
CRUSH 或 DHT 哈希分布
-
通过哈希算法(如 CRUSH 或一致性哈希)将对象分布到不同的存储节点上,实现高可扩展性。
-
1.2 工作方式
-
客户端通过 REST API(如 S3、Swift)上传文件。
-
存储系统生成唯一的 Object ID,并存入存储池。
-
访问数据时,客户端通过 API 查询 Object ID 直接获取数据。
1.3 主要特点
✅ 可扩展性极强:适用于 PB 级存储,数据可分布在多个存储节点。
✅ 高可用性:数据自动复制,支持多副本。
✅ 适合非结构化数据:如图片、视频、日志、备份数据等。
❌ 访问延迟较高:不适合高吞吐量的数据库应用。
1.4 典型应用
-
云存储(AWS S3、Ceph Object Storage、MinIO)
-
海量数据存储(日志、视频、照片、备份)
-
CDN 和内容分发
2. 块存储(Block Storage)
块存储是底层存储方式,数据以固定大小的**块(Block)**存储,并通过文件系统或数据库管理这些块。
2.1 原理
-
数据存储为固定大小的块(Block)
-
每个块分配唯一的地址(LBA,逻辑块地址)。
-
不存储元数据,仅存储数据块。
-
-
独立于文件系统
-
需要一个上层文件系统(如 ext4、XFS)来管理数据。
-
-
通过 iSCSI、Fibre Channel、RBD 挂载
-
可被操作系统作为虚拟磁盘使用(如 Linux 的
/dev/sda
)。
-
2.2 工作方式
-
创建块设备(例如
rbd create mydisk --size 10G
)。 -
挂载到服务器,格式化为文件系统(
mkfs.ext4 /dev/rbd0
)。 -
挂载后,应用程序可以像普通磁盘一样读写数据。
2.3 主要特点
✅ 低延迟,高吞吐量:适用于数据库、虚拟机磁盘等。
✅ 持久化存储:即使服务器重启,数据仍然可用。
✅ 支持快照、克隆:如 Ceph RBD 的快照功能。
❌ 扩展性受限:扩容需要重新调整分区或使用 LVM。
2.4 典型应用
-
虚拟机磁盘存储(VMware vSAN、Ceph RBD、OpenStack Cinder)
-
数据库存储(MySQL、PostgreSQL)
-
企业级 SAN 存储(iSCSI、FC 连接)
3. 文件存储(File Storage)
文件存储是一种层级结构的存储方式,类似于操作系统的文件系统,通过目录、文件的方式组织数据。
3.1 原理
-
基于目录层级结构
-
采用标准文件系统(如 ext4、XFS、NTFS)管理数据。
-
需要 文件元数据(如文件名、权限、所有者等)。
-
-
POSIX 兼容
-
适用于应用程序直接访问(如
ls
、cd
、cp
)。
-
-
通过 NFS、SMB 挂载
-
可用于多个客户端共享访问。
-
3.2 工作方式
-
服务器提供文件存储服务(如 NFS 服务器)。
-
客户端通过 NFS、SMB 挂载远程文件系统。
-
用户可像操作本地文件一样读写数据。
3.3 主要特点
✅ 方便访问:用户可以像本地磁盘一样管理数据。
✅ 适合共享存储:适用于团队协作、多用户环境。
✅ 支持权限控制:通过 ACL、POSIX 权限管理访问控制。
❌ 扩展性有限:相比对象存储,可扩展性较弱。
❌ 高并发性能不如对象存储。
3.4 典型应用
-
企业文件共享(NFS、SMB 服务器)
-
HPC 高性能计算(CephFS、Lustre)
-
Web 服务器(共享网页资源)
4. 对象存储 vs 块存储 vs 文件存储:主要区别
特性 | 对象存储(Object Storage) | 块存储(Block Storage) | 文件存储(File Storage) |
---|---|---|---|
数据结构 | 无层级,对象存储 | 块存储,无元数据 | 目录、文件结构 |
访问方式 | API(REST、S3) | 磁盘挂载(LVM、iSCSI) | 通过文件路径 |
协议 | S3、Swift | iSCSI、Fibre Channel | NFS、SMB |
扩展性 | 高(海量存储) | 中(磁盘扩展较复杂) | 低(通常依赖单一服务器) |
性能 | 适用于大规模存储 | 低延迟,高吞吐 | 适用于共享访问 |
典型应用 | 云存储、备份、CDN | 数据库、虚拟机磁盘 | 共享文件存储 |
5. 结论
-
如果你需要云存储、备份、海量非结构化数据(如图片、视频) → 对象存储
-
如果你在运行数据库、虚拟机磁盘、持久化存储(如 Kubernetes PVC) → 块存储
-
如果你需要多人协作、文件共享(如 NFS、SMB) → 文件存储
在 Ceph 中,三种存储方式均可支持:
-
Ceph Object Storage(S3 兼容存储)
-
Ceph RBD(块存储)
-
CephFS(文件存储)
三、PVE Ceph 元数据服务器(MDS)——用途解析
在 Proxmox VE(PVE)集成的 Ceph 分布式存储 中,元数据服务器(MDS,Metadata Server) 主要用于 CephFS(Ceph 文件系统),并不适用于 Ceph 块存储(RBD)或 Ceph 对象存储(RGW)。
1. 什么是元数据服务器(MDS)?
元数据服务器(MDS)是 CephFS(Ceph File System)的核心组件,用于管理 CephFS 的文件和目录的元数据(Metadata),类似于传统文件系统中的inode 表和目录索引。
由于 CephFS 支持 POSIX 兼容的文件系统,需要高效的方式来管理:
-
文件的名称
-
目录结构
-
权限(ACL)
-
文件的所有者、时间戳
-
软链接/硬链接
-
文件访问路径
MDS 负责存储和处理这些元数据,而不存储文件的实际内容。
2. MDS 在 CephFS 中的作用
在 CephFS 中,数据存储在 OSD(对象存储守护进程)中,而MDS 仅管理元数据,其主要作用包括:
1)管理文件目录结构
-
组织文件和目录树结构
-
维护文件系统的层级关系
-
处理
ls
、cd
、find
等操作
2)加速文件访问
-
由于 CephFS 支持 POSIX 语义,必须高效地处理文件打开、读取和修改操作。
-
MDS 维护文件元数据缓存,加速
stat
、open
、readdir
等操作。
3)支持高并发访问
-
CephFS 允许多个客户端同时访问同一文件系统,MDS 负责协调锁定机制,保证文件的并发访问一致性。
-
通过子树划分(Subtree Partitioning),MDS 可以分布式管理元数据,避免单点瓶颈。
4)提供快照支持
-
CephFS 支持快照(Snapshots),MDS 负责管理文件系统的版本信息。
3. CephFS 访问流程
当客户端访问 CephFS 时,数据的读取流程如下:
-
客户端(Client) 向 MDS 请求访问某个文件(例如
cat /mnt/cephfs/myfile.txt
)。 -
MDS 查询元数据,返回该文件的存储位置(即对应的 OSD)。
-
客户端直接与 OSD 通信,获取文件数据(MDS 本身不存储数据)。
-
如果发生写操作,客户端需要先通过 MDS 获取权限,再写入 OSD。
4. 为什么 PVE Ceph 需要 MDS?
Proxmox VE(PVE)集成 Ceph 主要用于两种存储:
-
Ceph RBD(块存储) → 虚拟机磁盘存储(不需要 MDS)
-
CephFS(文件存储) → 存储 ISO、模板、容器数据(需要 MDS)
在 PVE 中,CephFS 可以用来:
-
作为 PVE 的 共享存储(Shared Storage)
-
存放 ISO 映像
-
作为 LXC 容器的存储后端
-
存储 虚拟机备份
对于 PVE 用户来说:
-
如果只使用 Ceph 块存储(RBD),不需要 MDS
-
如果需要 CephFS,必须运行至少 1 个 MDS
5. 如何在 PVE 部署 MDS?
1)创建 MDS
在 Proxmox VE 终端或 Web 界面执行:
ceph fs new cephfs cephfs_metadata cephfs_data
然后创建并启动 MDS:
pveceph mds create
2)检查 MDS 状态
ceph status
ceph fs status
如果 MDS 运行正常,应该能看到 cephfs
的状态。
3)挂载 CephFS
在 PVE 服务器上挂载 CephFS:
mount -t ceph mon1:/ /mnt/cephfs -o name=admin,secret=<key>
或者在 /etc/fstab
添加:
mon1:/ /mnt/cephfs ceph name=admin,secret=<key> 0 0
然后执行:
mount -a
6. 结论
-
MDS 是 CephFS(Ceph 文件系统)的核心组件,负责管理文件和目录的元数据。
-
MDS 仅用于 CephFS,而 Ceph RBD(块存储)和 Ceph RGW(对象存储)不需要 MDS。
-
在 PVE 中,如果你使用 CephFS 作为共享存储(存放 ISO、LXC 等),就需要至少 1 个 MDS。
-
如果 PVE 只用 Ceph 块存储(RBD),可以忽略 MDS。
四、优化 Ceph MDS 以提高性能
Ceph 元数据服务器(MDS)主要影响 CephFS 的性能,优化 MDS 需要从 资源分配、负载均衡、缓存优化、日志管理 等多个方面入手。
1. 增加 MDS 数量(多 MDS 分布负载)
默认情况下,Ceph 只有 1 个活跃 MDS,如果有大量客户端访问,可以部署多个 MDS 以分担元数据负载。
检查当前 MDS 配置
ceph fs status
如果只有 1 个活跃 MDS,建议增加 多活 MDS(Active MDS),允许多个 MDS 服务器并行处理元数据。
启用多活 MDS
ceph fs set cephfs max_mds 2
推荐值:
1~2 个 MDS(小型集群)
2~5 个 MDS(大规模 CephFS)
2. 调整 MDS 资源分配
(1)增加 MDS 内存
默认情况下,MDS 使用 2GB 内存,在大规模文件系统中可以增加:
ceph config set mds mds_cache_memory_limit 8G
推荐值:最少
4G
,建议8G+
视具体负载调整。
(2)提升 MDS CPU 处理能力
-
运行 MDS 的服务器应配置 多核 CPU(推荐 8 核以上)。
-
专门给 MDS 服务器分配 CPU 资源,避免被 OSD 进程抢占。
3. 提高 MDS 缓存性能
MDS 通过缓存元数据加速文件访问,调整缓存参数可以提升性能:
(1)增加 MDS Journal 缓存
ceph config set mds mds_journal_size 10240
默认值:1024
推荐值:8192~16384
(2)调整 MDS Session 超时
客户端长期不活动会占用 MDS 资源,可以降低超时时间:
ceph config set mds mds_session_autoclose 300
默认值:1800(30 分钟)
推荐值:300600(510 分钟)
4. 优化 CephFS 目录分布
当一个目录下有**大量小文件(百万级)**时,MDS 可能会变慢,建议:
(1)启用目录自动分片
ceph fs set cephfs allow_dirfrags true
这样可以自动分割大目录,防止单个 MDS 负载过高。
(2)手动拆分大目录
如果某个目录文件过多(如 log
目录),可以手动拆分:
mkdir /mnt/cephfs/logs/A
mkdir /mnt/cephfs/logs/B
然后将文件分布存储。
5. 关闭或减少 MDS 日志
MDS 默认会写大量日志,占用 CPU 和 IO,可减少日志量:
ceph config set mds debug_mds 0
ceph config set mds debug_mds_balancer 0
ceph config set mds debug_mds_log 0
如果是生产环境,可以关闭调试日志:
ceph config set mds mds_log_skip 1
6. 监控和故障恢复
(1)监控 MDS 状态
定期查看 MDS 的负载:
ceph mds stat
如果发现 MDS 负载过高:
-
考虑增加 MDS 数量
-
检查 MDS 服务器 CPU/内存
-
检查 CephFS 目录是否过载
(2)手动迁移 MDS
如果某个 MDS 负载过高,可以手动让其降级:
ceph mds fail mds.<ID>
然后 Ceph 会自动选举新的 MDS。
7. 结论
🔹 增加 MDS 数量(多活 MDS)
🔹 分配更多内存和 CPU
🔹 调整缓存参数(mds_cache_memory_limit)
🔹 优化日志配置,减少 I/O 压力
🔹 优化目录结构,避免单个目录存储太多文件
优化 MDS 后,CephFS 在 PVE、Kubernetes、NFS 共享存储 中的性能会大幅提升。