CephFS存储池详解与命名规范:Rocky 9.6 + Ceph 17.2.9环境实践

CephFS存储池详解与命名规范:Rocky 9.6 + Ceph 17.2.9环境实践

在部署CephFS(Ceph File System)时,正确创建和配置存储池是至关重要的一步。许多初次接触CephFS的用户会对存储池的创建过程感到困惑,尤其是对为什么要创建两个存储池、哪些名称是固定的、哪些是可以自定义的等问题不太清楚。本文将深入解析CephFS存储池的概念,并详细介绍在Rocky Linux 9.6环境下使用Ceph 17.2.9 (Quincy)版本时的最佳实践。

CephFS为什么需要两个存储池

在CephFS的设计中,文件系统的数据被分为两类:

  1. 元数据(Metadata):包括文件名、目录结构、权限、时间戳等文件系统属性信息
  2. 数据(Data):文件的实际内容

这种分离的设计有几个重要原因:

1. 性能优化

  • 元数据操作(如创建文件、查找文件)和数据操作(如读写文件内容)有不同的性能特征
  • 将它们分开存储可以针对不同类型的操作进行专门的优化

2. 可靠性保障

  • 元数据比数据更重要,丢失元数据会导致整个文件系统无法访问
  • 可以为存储元数据的存储池设置更高的副本数或更强的纠错码配置

3. 管理便利

  • 可以独立监控和管理用于存储元数据和数据的存储池
  • 可以根据不同的需求为它们设置不同的存储策略

存储池命名规则详解

在创建CephFS时,我们需要明确哪些名称是固定要求的,哪些是可以自定义的:

固定名称(不可更改)

  1. 存储池类型相关参数
    • 这些实际上是CephFS命令中使用的参数位置,而非强制名称

可自定义名称

  1. 实际存储池名称
    • 用于存储元数据的RADOS存储池名称:可以自定义(如:fs-meta-poolmyfs_meta_pool等)
    • 用于存储数据的RADOS存储池名称:可以自定义(如:fs-data-poolmyfs_data_pool等)
  2. 文件系统名称
    • CephFS文件系统名称:可以自定义(如:k8s-cephfsmyfilesystem等)

存储池创建详细步骤

1. 创建用于存储元数据的RADOS存储池

bash 复制代码
# 基本语法
ceph osd pool create <pool_name> <pg_num> [<pgp_num>] [replicated] [< crush_rule_name >]

# 示例:创建名为fs-meta-pool的RADOS存储池(将用于存储CephFS元数据)
# 注意:对于小型集群(如3个OSD),应使用较小的PG数量以避免超过限制
ceph osd pool create fs-meta-pool 8 8

# 解释各参数:
# fs-meta-pool - 存储池名称(可自定义,这是一个普通的RADOS存储池)
# 8 - PG数量(根据集群规模调整,避免超过mon_max_pg_per_osd限制)
# 8 - PGP数量(通常等于PG数量)

2. 创建用于存储数据的RADOS存储池

bash 复制代码
# 基本语法
ceph osd pool create <pool_name> <pg_num> [<pgp_num>] [replicated] [< crush_rule_name >]

# 示例:创建名为fs-data-pool的RADOS存储池(将用于存储CephFS数据)
# 注意:对于小型集群(如3个OSD),应使用较小的PG数量以避免超过限制
ceph osd pool create fs-data-pool 16 16

# 解释各参数:
# fs-data-pool - 存储池名称(可自定义,这是一个普通的RADOS存储池)
# 16 - PG数量(通常比元数据存储池更大,但仍需考虑限制)
# 16 - PGP数量(通常等于PG数量)

3. PG数量计算建议

PG(Placement Group)数量的选择对性能和管理都有影响。需要注意不要超过每个OSD的最大PG数量限制(默认为250):

bash 复制代码
# PG数量计算公式(近似值):
# PG总数 = (OSD数量 * 100) / 副本数

# 例如:3个OSD,副本数为3
# PG总数 ≈ (3 * 100) / 3 = 100
# 但需要考虑mon_max_pg_per_osd限制(默认250)

# 实际应用中,可以根据以下规则选择:
# 1-5个OSD:8-32个PG(元数据池),16-64个PG(数据池)
# 5-10个OSD:32-128个PG
# 10-50个OSD:128-512个PG

# 注意:每个OSD上的累积PG数不能超过mon_max_pg_per_osd限制
# 可以通过以下命令查看当前限制:
ceph config show mon.* mon_max_pg_per_osd

4. PG数量规划建议

复制代码
# 根据集群规模选择合适的PG数量,同时考虑mon_max_pg_per_osd限制
# 小规模集群(1-5个OSD)
ceph osd pool create fs-meta-pool 8 8
ceph osd pool create fs-data-pool 16 16

# 中等规模集群(5-10个OSD)
ceph osd pool create fs-meta-pool 32 32
ceph osd pool create fs-data-pool 64 64

# 大规模集群(10个以上OSD)
ceph osd pool create fs-meta-pool 128 128
ceph osd pool create fs-data-pool 256 256

# 检查当前mon_max_pg_per_osd限制
ceph config show mon.* mon_max_pg_per_osd

# 如需调整限制(谨慎使用)
ceph config set mon mon_max_pg_per_osd 300

5. 设置存储池副本数

复制代码
# 设置元数据存储池副本数(建议为3以确保高可用)
ceph osd pool set fs-meta-pool size 3

# 设置数据存储池副本数(可根据需求调整)
ceph osd pool set fs-data-pool size 3

# 设置最小副本数(确保即使部分OSD失效也能正常工作)
ceph osd pool set fs-meta-pool min_size 2
ceph osd pool set fs-data-pool min_size 2

创建CephFS文件系统

有了存储池之后,就可以创建CephFS文件系统了:

复制代码
# 基本语法
ceph fs new <fs_name> <metadata_pool> <data_pool>

# 示例:创建名为k8s-cephfs的文件系统
ceph fs new k8s-cephfs fs-meta-pool fs-data-pool

# 解释各参数:
# k8s-cephfs - 文件系统名称(可自定义)
# fs-meta-pool - 元数据存储池名称(必须与之前创建的存储池名称一致)
#                注意:这里的"元数据存储池"是由它在命令中的位置决定的,
#                而不是由它的名称决定的。任何普通RADOS存储池都可以用作元数据存储池,
#                只要把它放在第二个参数位置。
# fs-data-pool - 数据存储池名称(必须与之前创建的存储池名称一致)
#                同样,这里的"数据存储池"也是由它在命令中的位置决定的,
#                而不是由它的名称决定的。

部署MDS(Metadata Server)

创建存储池和文件系统后,还需要部署MDS组件来提供CephFS服务:

1. 使用cephadm/orchestrator部署MDS

复制代码
# 部署MDS服务
ceph orch apply mds k8s-cephfs --placement="3 ceph1 ceph2 ceph3"

# 查看MDS状态
ceph mds stat

# 查看MDS详细信息
ceph mds dump

2. MDS高可用配置

为了确保MDS的高可用性,建议部署多个MDS实例:

复制代码
# 配置活跃MDS数量(根据需要调整)
ceph fs set k8s-cephfs max_mds 2

# 允许备用MDS replay模式提高故障切换速度
ceph fs set k8s-cephfs allow_standby_replay true

3. 验证MDS状态

复制代码
# 查看MDS集群状态
ceph mds stat
# 输出示例:
# k8s-cephfs-1/1/1 up  {0=k8s-cephfs.ceph1.afgzyy=up:active}

# 查看详细MDS信息
ceph mds dump

实际案例演示

让我们通过一个完整的示例来演示整个过程:

复制代码
# 1. 创建元数据存储池(注意:这是一个普通的RADOS存储池,
#     只是我们在后续创建文件系统时将其指定为元数据存储池)
#     对于小型集群,使用较小的PG数量避免超过限制
ceph osd pool create fs-meta-pool 8 8
# 输出:pool 'fs-meta-pool' created

# 2. 创建数据存储池(注意:这也是一个普通的RADOS存储池,
#     只是我们在后续创建文件系统时将其指定为数据存储池)
#     对于小型集群,使用较小的PG数量避免超过限制
ceph osd pool create fs-data-pool 16 16
# 输出:pool 'fs-data-pool' created

# 3. 设置存储池副本数
ceph osd pool set fs-meta-pool size 3
ceph osd pool set fs-data-pool size 3

# 4. 创建CephFS文件系统
#    注意:参数的位置决定了存储池的用途,而不是存储池的名称
#    第二个参数位置的存储池将成为元数据存储池
#    第三个参数位置的存储池将成为数据存储池
ceph fs new myfilesystem fs-meta-pool fs-data-pool
# 输出:ceph filesystem 'myfilesystem' created

# 5. 部署MDS服务
ceph orch apply mds myfilesystem --placement="3 ceph1 ceph2 ceph3"

# 6. 验证创建结果
ceph fs ls
# 输出:name: myfilesystem, metadata pool: fs-meta-pool, data pools: [fs-data-pool ]

# 7. 查看MDS状态
ceph mds stat

# 8. 查看文件系统状态
ceph fs status myfilesystem

命名规范总结

必须严格匹配的名称(固定要求)

名称类型 说明
存储池创建命令中的存储池名称 必须与后续创建文件系统时引用的名称完全一致
CephFS创建命令中的存储池参数 必须与已创建的存储池名称完全一致

可以自定义的名称

名称类型 默认示例 可选示例 说明
元数据存储池名称 fs-metadata-pool myfs_meta、k8s_fs_metadata 可根据项目或用途自定义,但这些都是普通的RADOS存储池名称,用途由其在ceph fs new命令中的位置决定
数据存储池名称 fs-data-pool myfs_data、k8s_fs_data 可根据项目或用途自定义,但这些都是普通的RADOS存储池名称,用途由其在ceph fs new命令中的位置决定
CephFS文件系统名称 cephfs myfilesystem、k8s-cephfs 可根据用途自定义

最佳实践建议

1. 命名规范建议

bash 复制代码
# 推荐的命名模式:<用途>_<文件系统类型>_<数据类型>
# 例如:
ceph osd pool create k8s_cephfs_metadata_pool 32 32
ceph osd pool create k8s_cephfs_data_pool 64 64
ceph fs new k8s-cephfs k8s_cephfs_metadata_pool k8s_cephfs_data_pool

2. PG数量规划建议

复制代码
# 根据集群规模选择合适的PG数量
# 小规模集群(1-5个OSD)
ceph osd pool create fs-meta-pool 128 128
ceph osd pool create fs-data-pool 128 128

# 中等规模集群(5-10个OSD)
ceph osd pool create fs-meta-pool 256 256
ceph osd pool create fs-data-pool 512 512

# 大规模集群(10个以上OSD)
ceph osd pool create fs-meta-pool 512 512
ceph osd pool create fs-data-pool 1024 1024

3. 性能调优建议

复制代码
# 为元数据存储池设置更高的优先级
ceph osd pool set fs-meta-pool recovery_priority 5
ceph osd pool set fs-meta-pool compression_mode none

# 为数据存储池启用压缩(视数据类型而定)
ceph osd pool set fs-data-pool compression_mode aggressive

验证和监控

创建完存储池和文件系统后,需要进行验证:

复制代码
# 1. 查看存储池状态
ceph osd pool ls detail

# 2. 查看文件系统列表
ceph fs ls

# 3. 查看文件系统详细状态
ceph fs status k8s-cephfs

# 4. 查看存储使用情况
ceph df

# 5. 检查集群健康状态
ceph health detail

# 6. 查看MDS状态
ceph mds stat
ceph mds dump

常见问题解答

Q1: 存储池名称可以包含特殊字符吗?

A1: 存储池名称应遵循常规命名规则,建议只使用字母、数字和下划线,避免使用特殊字符。

Q2: 如果存储池名称写错了怎么办?

A2: 如果只是创建时名称拼写错误,可以删除重新创建;如果已经被文件系统引用,则需要先删除文件系统再重新创建。

Q3: 为什么我的PG数量建议值与实际不符?

A3: PG数量计算只是一个参考值,实际应用中还需考虑数据增长预期、性能要求以及mon_max_pg_per_osd限制等因素。

Q4: 可以在创建后修改存储池名称吗?

A4: Ceph不支持直接修改存储池名称,只能通过创建新存储池、迁移数据、删除旧存储池的方式来实现。

Q5: 创建存储池时出现"exceeds the mon_max_pg_per_osd value"错误怎么办?

A5: 这个错误表示您设置的PG数量过多,超过了每个OSD允许的最大PG数量(默认250)。解决方法:

  1. 减少PG数量,根据集群规模选择合适的值

  2. (不推荐)增加mon_max_pg_per_osd限制值

对于小型集群(如3个OSD),建议元数据池使用8个PG,数据池使用16个PG。

总结

通过本文的学习,您应该已经掌握了CephFS存储池创建的核心要点:

  1. 理解原理:明白了为什么CephFS需要两个存储池以及它们各自的作用
  2. 掌握命名规则:清楚了哪些名称是固定的,哪些是可以自定义的
  3. 学会创建方法:掌握了存储池和文件系统的创建步骤
  4. 了解最佳实践:知道了如何根据集群规模选择合适的配置参数

需要注意的重要一点是:所谓"元数据存储池"和"数据存储池"只是普通RADOS存储池的不同用途称呼,它们的具体用途是由其在ceph fs new命令中的参数位置决定的,而不是由存储池名称决定的。这也是为什么我们强调存储池名称可以任意选择的原因。

此外,部署CephFS不仅需要创建存储池和文件系统,还需要部署MDS(Metadata Server)服务来处理文件系统的元数据操作。MDS是CephFS正常工作的关键组件,通常也需要配置高可用性以确保服务的连续性。

在实际部署中,请根据您的具体环境和需求选择合适的存储池名称和配置参数,确保CephFS能够稳定高效地为您的应用提供文件存储服务。

参考文档

  1. Ceph官方文档 - CephFS
  2. Ceph官方文档 - 存储池管理
  3. Ceph存储池PG数量计算指南
  4. Ceph Quincy版本发布说明

温馨提示

由于网络环境或文件存储等因素,若相关文件或图片链接暂时无法访问,您也可以通过访问张师傅的好来斯技术博客获取更多相关资源和最新信息。

本篇文章原始链接:

复制代码
https://www.howlaisi.com/categories/ceph/cephfscun-chu-chi-xiang-jie-yu-ming-ming-gui-fan-rocky-9.6-ceph-17.2.9huan-jing-shi-jian
相关推荐
老wang你好8 小时前
Ceph存储全攻略:RBD、CephFS与RGW详解
ceph
珂玥c3 天前
Ceph集群新增osd
ceph
老wang你好4 天前
Ceph分布式存储系统全解析
ceph
一个行走的民17 天前
分布式系统中 Map 增量(Delta)是否需要持久化
ceph
一个行走的民18 天前
BlueStore 核心原理与关键机制
ceph
奋斗的小青年I20 天前
Proxmox VE Ceph 超融合集群落地实战
windows·ceph·vmware·pve·超融合·proxmox
一个行走的民21 天前
深度剖析 Ceph PG 分裂机制:原理、底层、实操、影响、线上避坑(最全完整版)
ceph·算法
一个行走的民21 天前
Ceph 核心概念精讲:彻底搞懂 PG、PGP、pg_num、pgp_num
ceph
Mr.王8351 个月前
Kubernetes宿主机本地盘池化管理
ceph·云原生·容器·kubernetes
一个行走的民1 个月前
CEPH OSD心跳机制
ceph