当前位置: 首页 > news >正文

分布式存储系统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 的数据存储方式基于对象存储,不同于传统的块存储和文件存储。数据存储流程如下:

  1. 数据对象化

    • Ceph 不直接存储文件,而是将数据拆分为多个对象(Object)

  2. 对象分布管理(CRUSH 算法)

    • 采用 CRUSH(Controlled Replication Under Scalable Hashing)算法,根据集群拓扑自动分配对象,而不依赖集中式索引表。

  3. 副本管理

    • 每个对象根据配置的副本策略(例如 3 副本)复制到多个 OSD 设备上,确保数据高可用。

  4. 存储池(Pool)

    • Ceph 通过存储池(Pool)对数据进行逻辑分组,每个 Pool 都有独立的 CRUSH 规则。

2. Ceph 的作用

Ceph 主要用于三大存储场景:

  1. 对象存储(Ceph Object Storage)

    • 兼容 Amazon S3 和 OpenStack Swift 接口,适用于云存储、大规模非结构化数据存储。

  2. 块存储(Ceph Block Storage)

    • 适用于虚拟机磁盘、数据库存储,提供快照、克隆等功能。

  3. 文件存储(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-deploycephadm 进行部署:

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 的优势

  1. 高可用性:数据自动复制,故障自动恢复。

  2. 水平扩展:可以轻松增加 OSD,提高存储容量和性能。

  3. 无需专用硬件:可以运行在普通服务器和标准磁盘上。

  4. 自管理:通过 CRUSH 自动分布数据,减少管理工作。

  5. 多功能支持:同时支持对象存储、块存储、文件存储。

5. Ceph 的不足

  1. 高资源占用:需要较多 CPU、内存和磁盘 IO,适用于大规模集群,不适合小规模部署。

  2. 复杂性较高:需要深入理解其架构和配置,部署和维护难度较大。

  3. 性能调优要求高:在高性能场景(如数据库存储)需要仔细调整参数。 

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)
    每个对象包含:

    1. 数据(文件的实际内容)

    2. 元数据(用户自定义的键值对,例如创建时间、访问权限等)

    3. 唯一标识符(Object ID)(用于查询和检索)

  • 无层级目录结构

    • 传统文件存储使用文件夹层级管理数据,而对象存储直接存放在**存储池(Bucket)**中。

    • 通过HTTP API 进行访问,而非 POSIX 文件路径。

  • CRUSH 或 DHT 哈希分布

    • 通过哈希算法(如 CRUSH 或一致性哈希)将对象分布到不同的存储节点上,实现高可扩展性。

1.2 工作方式

  1. 客户端通过 REST API(如 S3、Swift)上传文件。

  2. 存储系统生成唯一的 Object ID,并存入存储池。

  3. 访问数据时,客户端通过 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 工作方式

  1. 创建块设备(例如 rbd create mydisk --size 10G)。

  2. 挂载到服务器,格式化为文件系统(mkfs.ext4 /dev/rbd0)。

  3. 挂载后,应用程序可以像普通磁盘一样读写数据。

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 兼容

    • 适用于应用程序直接访问(如 lscdcp)。

  • 通过 NFS、SMB 挂载

    • 可用于多个客户端共享访问。

3.2 工作方式

  1. 服务器提供文件存储服务(如 NFS 服务器)。

  2. 客户端通过 NFS、SMB 挂载远程文件系统。

  3. 用户可像操作本地文件一样读写数据。

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、SwiftiSCSI、Fibre ChannelNFS、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)管理文件目录结构

  • 组织文件和目录树结构

  • 维护文件系统的层级关系

  • 处理 lscdfind 等操作

2)加速文件访问

  • 由于 CephFS 支持 POSIX 语义,必须高效地处理文件打开、读取和修改操作。

  • MDS 维护文件元数据缓存,加速 statopenreaddir 等操作。

3)支持高并发访问

  • CephFS 允许多个客户端同时访问同一文件系统,MDS 负责协调锁定机制,保证文件的并发访问一致性。

  • 通过子树划分(Subtree Partitioning),MDS 可以分布式管理元数据,避免单点瓶颈。

4)提供快照支持

  • CephFS 支持快照(Snapshots),MDS 负责管理文件系统的版本信息。 

3. CephFS 访问流程

当客户端访问 CephFS 时,数据的读取流程如下:

  1. 客户端(Client)MDS 请求访问某个文件(例如 cat /mnt/cephfs/myfile.txt)。

  2. MDS 查询元数据,返回该文件的存储位置(即对应的 OSD)。

  3. 客户端直接与 OSD 通信,获取文件数据(MDS 本身不存储数据)。

  4. 如果发生写操作,客户端需要先通过 MDS 获取权限,再写入 OSD。 

4. 为什么 PVE Ceph 需要 MDS?

Proxmox VE(PVE)集成 Ceph 主要用于两种存储:

  1. Ceph RBD(块存储)虚拟机磁盘存储不需要 MDS

  2. 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 共享存储 中的性能会大幅提升。

http://www.dtcms.com/a/122248.html

相关文章:

  • 微信小程序:动态表格实现,表头单元格数据完全从data中获取,宽度自定义,自定义文本框,行勾选,样式效果,横向滚动表格(解决背景色不足的问题)等
  • TCP重传率高与传输延迟问题
  • 【scikit-learn基础】--『数据加载』之外部数据集
  • pip install pytrec_eval失败的解决方案
  • 自动变为 VIP 文章
  • python基础语法11-文件读写
  • 程序代码篇---时间复杂度空间复杂度
  • 初识Linux:常见指令与权限的理解,以及相关衍生知识
  • Jetpack Compose 状态保存机制全面解析:让UI状态持久化
  • JavaWeb遇到的问题汇总
  • 2025 销售困局:AI 强势入局,传统模式如何突围?
  • 解决 ECharts 图表无数据显示问题
  • 网工毕业设计项目选题推荐
  • Redis Java 客户端 之 SpringDataRedis
  • Diffusion Policy Visuomotor Policy Learning via Action Diffusion官方项目解读(二)(5)
  • HTTPS和HTTP有哪些区别?
  • 虚拟列表react-virtualized使用(npm install react-virtualized)
  • 大模型Prompt提示词越狱相关知识
  • 一种替代DOORS在WORD中进行需求管理的方法 (二)
  • Vue:路由切换表格塌陷
  • SpringBoot 整合 MCP
  • 树莓派非桌面版无法ssh或vnc远程连接问题解决办法
  • 通过HTTP协议实现Git免密操作的解决方案
  • telophoto源码查看记录 三
  • 【回眸】Linux 内核 (十五) 之 多线程编程 上
  • 4月9日笔记
  • 2021-10-26 C++繁忙通信兵
  • Java 设计模式:原型模式详解
  • 使用雪花算法生成分布式唯一ID
  • Android 回答视频边播放边下载的问题