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