CephFS (Ceph Filesystem) 是 Ceph 分布式存储系统的文件系统层,提供了一个高可用、可扩展、并且具有强大容错能力的 POSIX 兼容的分布式文件系统。它允许用户像使用本地文件系统一样,通过挂载点直接访问分布在 Ceph 集群中的数据。
一、 关键组件
Ceph Metadata Server (MDS):
CephFS 的关键组件,管理文件系统的元数据。元数据包括文件和目录的名称、路径、权限等信息。MDS 的存在使得 CephFS 可以高效地支持 POSIX 文件系统操作。多个 MDS 可以协同工作以分担元数据管理的负载。
二、 概念
1. 元数据池(Metadata Pool)
作用和功能
-
元数据存储:元数据池用于存储 CephFS 文件系统的元数据。元数据包括文件和目录的名称、层次结构、权限、所有者、时间戳等信息,而不是文件的实际内容。
-
目录结构管理:元数据池保存了文件系统中的目录树结构,帮助 CephFS 高效地管理和查询文件及目录。例如,当用户查询或修改文件路径时,元数据池中的信息会被频繁访问。
-
快速检索:因为元数据操作(如文件打开、关闭、重命名等)频繁且对性能要求高,因此 CephFS 通常将元数据存储在专门的高性能池中,往往是使用 SSD 这样的高速存储设备。
元数据池的实现
-
使用专门的池:在 CephFS 中,元数据池通常使用独立的存储池(如 SSD 池)来提高性能。用户可以在创建 CephFS 文件系统时指定哪个存储池用于存储元数据。
-
Metadata Server (MDS):元数据池由 Ceph 的 Metadata Server (MDS) 负责管理。MDS 从元数据池中读取和写入数据,并处理所有与文件系统元数据相关的操作。
2. 数据池(Data Pool)
作用和功能
-
数据存储:数据池用于存储 CephFS 文件系统中的实际数据内容。文件的实际数据块存储在数据池中,与元数据池中的元数据相对应。
-
分布式存储:CephFS 将文件数据分块存储,每个块被称为对象(Object),这些对象分布在整个 Ceph 集群的多个 OSD(Object Storage Daemon)上,以实现高可用性和容错能力。
-
副本和容错:数据池支持配置副本策略(如 3 副本),以确保数据的持久性和容错能力。当一个 OSD 失效时,数据可以从其他副本中恢复。
数据池的实现
-
多数据池支持:CephFS 支持多个数据池,可以根据不同的使用场景和性能需求,创建多个数据池,并将不同类型的数据存储在不同的池中。例如,热数据可以存储在性能较高的 SSD 池中,而冷数据则存储在大容量的 HDD 池中。
-
文件布局:通过调整 CephFS 的文件布局属性,可以将特定文件或目录的数据存储在指定的数据池中。这种灵活性允许用户优化存储策略,最大限度地提高性能。
三、 CephX 认证机制
CephX 是 Ceph 集群的认证和授权机制,负责控制客户端对 Ceph 集群的访问。通过 CephX,您可以为不同的客户端用户创建密钥,并根据需要授予不同的访问权限。
示例
- 为用户 a 创建 CephX 用户 client.a
ceph auth get-or-create client.a \
mon 'allow r' \
mds 'allow rw path=/A' \
osd 'allow rw pool=<data_pool_name>'
-
说明
mon 'allow r':允许只读访问 Monitor。
mds 'allow rw path=/A':允许对/A
目录的读写访问。
osd 'allow rw pool=<data_pool_name>':允许对指定数据池的读写访问。请将<data_pool_name>
替换为实际的数据池名称。 -
获取密钥
ceph auth get client.a -o /etc/ceph/ceph.client.a.keyring
四、创建 cephfs
1. 部署 mds 服务
部署完整 ceph 集群查看 ansible 部署 ceph
- 修改
/etc/ansible/hosts
添加[mdss]
其他内容不变
[mdss]
TEST-02
- 修改
group_vars/all.yml
可以不修改直接默认
ceph_conf_overrides:
global:
# 定义要使用的 msgr 协议版本。默认两个都是 true
ms_bind_msgr2: true
ms_bind_msgr1: true
- 执行安装
ansible-playbook site.yml
2. 创建 cephfs_data
和 cephfs_metadata
池
pg 值 32 根据 osd 确定。查看 ceph pg 状态和数量的计算方法
ceph osd pool create cephfs_data 32 32
ceph osd pool create cephfs_metadata 32 32
3. 创建 cephfs
- 创建
ceph fs new cephfs cephfs_metadata cephfs_data
4. 使用 ceph-fuse
挂在 cephfs
- 安装 Ceph 客户端工具
apt-get install ceph-fuse
- 挂载
ceph-fuse -n client.admin /mnt/cephfs --keyring=/etc/ceph/ceph.client.admin.keyring
- 查看
mount -l
ceph-fuse on /mnt/cephfs type fuse.ceph-fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
- 卸载
fusermount -u /mnt/cephfs
5. 内核 mount
命令挂载
:这的 ip 是 mon 服务的
:name 用户名 admin 不是 client.admin
mount -t ceph 192.168.100.6:6789:/ /mnt/cephfs -o name=admin,secretfile=/etc/ceph/ceph.client.admin.key
mount -l
然后报错
mount error 13 = Permission denied
查看权限
# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQAXE4ZmGlMtARAAOCojkBf1wGiLBA3+oHcjFQ==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
查看 mon 日志
2024-08-15T15:48:46.014+0800 7f0d48cf3700 0 --1- [v2:192.168.100.6:3300/0,v1:192.168.100.6:6789/0] >> conn(0x558398d70400 0x558398b46000 :6789 s=ACCEPTING pgs=0 cs=0 l=0).handle_client_banner accept peer addr is really - (socket is v1:192.168.100.6:40414/0)
2024-08-15T15:48:46.014+0800 7f0d44ceb700 0 cephx server client.client.admin: couldn't find entity name: client.client.admin
擦 - - 发现用户名错了 client.client.admin
6. cephfs 其他操作
- 查看 cephfs 使用的池
ceph fs ls
- cephfs 状态
ceph fs status cephfs
- 删除 cephfs
ceph fs rm cephfs --yes-i-really-mean-it
- 查看详细配置
ceph fs dump
五、一些关键配置
参数说明
参数 | 默认值 | 说明 | 配置建议 |
---|---|---|---|
mds_cache_mid |
0.7 | 设置缓存中的新项插入在缓存 LRU(最近最少使用)的哪个位置。调整这个值可以影响缓存命中的概率。 | 通过控制插入点,可以调优缓存管理策略,但通常这个参数无需频繁调整,除非你在做特定的性能调优。 |
mds_dir_max_commit_size |
10 | 控制目录更新的最大事务大小(以 MB 为单位),超过此大小时将拆分为更小的事务。 | 较大的目录更新事务会减少提交的频率,提高写入效率,但也可能增加事务处理的延迟。根据目录操作的频率和规模调整此值以优化性能。 |
mds_dir_max_entries |
0(不限制) | 目录最大条目数,超过这个限制将拒绝新条目并返回 ENOSPC 错误。 | 对于大规模目录,适当的限制可以防止性能下降,但需要根据具体应用需求设定。 |
mds_cache_memory_limit |
一般自动配置 | 限制 MDS 守护进程可以使用的最大内存量。 | 这是控制 MDS 性能的关键参数。设置较高的内存限制可以使 MDS 缓存更多的元数据,从而减少磁盘 I/O,提高访问速度。但设置过高可能会导致内存不足问题。 |
mds_decay_halflife |
5.0 | 目录温度计数器衰减速率,用于负载均衡。 | 影响目录负载平衡的动态性。较短的半衰期使温度衰减更快,有助于更快的负载平衡调整,但可能增加系统波动性。 |
mds_beacon_interval 和 mds_beacon_grace |
4.0 秒(间隔),15.0 秒(最大等待时间) | 控制 MDS 向 MON 发送心跳信号的间隔和最大等待时间。 | 这些参数控制 MDS 守护进程的失效检测速度。较短的间隔和较小的最大等待时间可以加快故障检测和恢复,但可能增加网络开销。 |
mds_reconnect_timeout |
45.0 秒 | MDS 在恢复过程中等待客户端重连的超时时间。 | 较短的超时设置可以加快 MDS 恢复过程,但可能导致某些客户端连接失败。适当的设置可以平衡恢复速度和客户端稳定性。 |
mds_log_max_events 和 mds_log_max_segments |
-1(事件数,不限制),128(最大段数) | 控制 MDS 日志中最大事件数量和最大段数。超过这个数量时,日志将被修剪。 | 较大的日志容量可以减少频繁修剪操作,从而提高写入性能,但可能会占用更多存储空间和内存。 |
mds_bal_split_size |
10000 | 目录达到此大小时,MDS 会将目录片段拆分为更小的部分。 | 大型目录的拆分可以平衡负载,提高并行处理能力,但可能增加元数据操作的复杂性。根据目录规模和访问模式调整此值。 |
mds_bal_fragment_interval |
5 秒 | 目录片段达到拆分或合并条件后,实际执行该操作的延迟。 | 较短的延迟可以加快负载调整,但可能会引起频繁的片段操作,影响系统稳定性。 |
mds_bal_mode |
0(混合模式) | 计算 MDS 负载的方法(混合模式、请求率和延迟、CPU 负载)。 | 不同的负载计算模式会影响 MDS 间的负载均衡策略。根据集群的具体负载类型选择合适的模式,可以优化整体性能。 |
修改方法
1. 修改单个 MDS 守护进程的配置
对于大多数场景,使用 ceph config set 是修改配置参数的最佳方法,它可以动态地、即时地应用更改,而无需重启守护进程
ceph config set mds.<mds_name> <parameter> <value>
示例:
ceph config set mds.TEST-02 mds_cache_mid 0.9
2. 修改所有 MDS
ceph config set mds mds_cache_mid 0.9
3. 编辑 ceph.conf
配置文件
在 MDS 节点上修改 /etc/ceph/ceph.conf
[mds]
mds_cache_size = 0.9
重启服务
systemctl restart ceph-mds@<mds_name>.service
4. 临时修改
ceph tell mds.<mds_name> injectargs --<parameter>=<value>
示例:
ceph tell mds.mds-1 injectargs --mds_cache_mid =0.9
网友评论