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的设计中,文件系统的数据被分为两类:
- 元数据(Metadata):包括文件名、目录结构、权限、时间戳等文件系统属性信息
- 数据(Data):文件的实际内容
这种分离的设计有几个重要原因:
1. 性能优化
- 元数据操作(如创建文件、查找文件)和数据操作(如读写文件内容)有不同的性能特征
- 将它们分开存储可以针对不同类型的操作进行专门的优化
2. 可靠性保障
- 元数据比数据更重要,丢失元数据会导致整个文件系统无法访问
- 可以为存储元数据的存储池设置更高的副本数或更强的纠错码配置
3. 管理便利
- 可以独立监控和管理用于存储元数据和数据的存储池
- 可以根据不同的需求为它们设置不同的存储策略
存储池命名规则详解
在创建CephFS时,我们需要明确哪些名称是固定要求的,哪些是可以自定义的:
固定名称(不可更改)
- 存储池类型相关参数:
- 这些实际上是CephFS命令中使用的参数位置,而非强制名称
可自定义名称
- 实际存储池名称:
- 用于存储元数据的RADOS存储池名称:可以自定义(如:
fs-meta-pool、myfs_meta_pool等) - 用于存储数据的RADOS存储池名称:可以自定义(如:
fs-data-pool、myfs_data_pool等)
- 用于存储元数据的RADOS存储池名称:可以自定义(如:
- 文件系统名称:
- CephFS文件系统名称:可以自定义(如:
k8s-cephfs、myfilesystem等)
- CephFS文件系统名称:可以自定义(如:
存储池创建详细步骤
1. 创建用于存储元数据的RADOS存储池
# 基本语法
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存储池
# 基本语法
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):
# 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. 命名规范建议
# 推荐的命名模式:<用途>_<文件系统类型>_<数据类型>
# 例如:
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存储池创建的核心要点:
- 理解原理:明白了为什么CephFS需要两个存储池以及它们各自的作用
- 掌握命名规则:清楚了哪些名称是固定的,哪些是可以自定义的
- 学会创建方法:掌握了存储池和文件系统的创建步骤
- 了解最佳实践:知道了如何根据集群规模选择合适的配置参数
需要注意的重要一点是:所谓"元数据存储池"和"数据存储池"只是普通RADOS存储池的不同用途称呼,它们的具体用途是由其在ceph fs new命令中的参数位置决定的,而不是由存储池名称决定的。这也是为什么我们强调存储池名称可以任意选择的原因。
此外,部署CephFS不仅需要创建存储池和文件系统,还需要部署MDS(Metadata Server)服务来处理文件系统的元数据操作。MDS是CephFS正常工作的关键组件,通常也需要配置高可用性以确保服务的连续性。
在实际部署中,请根据您的具体环境和需求选择合适的存储池名称和配置参数,确保CephFS能够稳定高效地为您的应用提供文件存储服务。
评论区