Ceph 文件系统 (CephFS) 是符合 POSIX 标准的文件系统,它使用 Ceph 存储集群来存储其数据。CephFS 使用与 Ceph 块设备相同的集群系统:Ceph 对象存储及其 S3 和 Swift API 或本机绑定 (librados
)。
要使用 CephFS,需有一个正在运行的 Ceph 存储集群,并至少要有一台正在运行的 Ceph 元数据服务器。
借助 SUSE Enterprise Storage,SUSE 引入了对使用扩展和分布式组件 CephFS 的众多方案的正式支持。本节介绍硬性限制,并提供有关建议用例的指导。
支持的 CephFS 部署必须符合以下要求:
至少有一台元数据服务器。SUSE 建议部署多个具有 MDS 角色的节点。其中只有一个节点是“主动”节点,其余节点是“被动”节点。从客户端装入 CephFS 时,请记得在 mount
命令中指定所有 MDS 节点。
在此版本中,CephFS 快照默认未启用,不受支持。
客户端基于 SUSE Linux Enterprise Server 12 SP2 或 SP3,使用 cephfs
内核模块驱动程序。不支持 FUSE 模块。
SUSE Enterprise Storage 中不支持 CephFS 配额,因为仅在 FUSE 客户端中实施配额支持。
CephFS 支持 http://docs.ceph.com/docs/jewel/cephfs/file-layouts/ 中所述的文件布局更改。但是,尽管文件系统可由任何客户端装入,但无法将新数据池添加到现有的 CephFS 文件系统 (ceph mds add_data_pool
)。只能在文件系统已卸载时添加这些存储池。
Ceph 元数据服务器 (MDS) 存储 CephFS 的元数据。Ceph 块设备和 Ceph 对象存储不使用 MDS。POSIX 文件系统用户可通过 MDS 执行基本命令(例如 ls
或 find
),因而不会对 Ceph 存储集群施加巨大的负担。
您可以根据第 4.3 节 “集群部署”中所述,在初始集群部署过程中部署 MDS;或者根据第 1.1 节 “添加新的集群节点”中所述,将 MDS 添加到已部署的集群。
部署 MDS 后,请在部署 MDS 的服务器的防火墙设置中允许 Ceph OSD/MDS
服务:启动 yast
,导航到 › › ,然后在 下拉菜单中选择 。如果不允许在 Ceph MDS 节点中传送完整流量,则即使其他操作可以正常进行,装入文件系统也会失败。
可以通过在 ceph.conf
配置文件中插入相关的选项来微调 MDS 的行为。
mds cache memory limit
MDS 将针对其快速缓存实施软内存限制(以字节数为单位)。管理员应使用此项设置取代旧的 mds cache size
设置。默认大小为 1 GB。
mds cache reservation
MDS 快速缓存要维护的快速缓存预留(内存或 inode)。当 MDS 开始接近其预留大小时,会撤消客户端状态,直到其快速缓存大小收缩到可恢复预留为止。默认值为 0.05。
有关 MDS 相关配置选项的详细列表,请参见 http://docs.ceph.com/docs/master/cephfs/mds-config-ref/。
有关 MDS 日记程序配置选项的详细列表,请参见 http://docs.ceph.com/docs/master/cephfs/journaler/。
部署至少包含一台 Ceph 元数据服务器的正常 Ceph 存储集群后,可以创建并装入 Ceph 文件系统。请确保客户端可连接到网络,并具有正确的身份验证密钥环。
CephFS 至少需要两个 RADOS 存储池:一个用于存储数据,另一个用于存储元数据。配置这些存储池时,可以考虑:
对元数据池使用较高的复制级别,因为丢失此池中的任何数据都可能会导致整个文件系统不可访问。
对元数据池使用延迟较低的存储,例如 SSD,因为在客户端上执行文件系统操作时,这样可以改善用户可察觉到的延迟。
在 policy.cfg
中指定 role-mds
时,会自动创建所需的存储池。在设置元数据服务器之前,可以手动创建存储池 cephfs_data
和 cephfs_metadata
,以手动优化性能。如果这些存储池已存在,DeepSea 将不会创建它们。
有关管理存储池的详细信息,请参见第 7 章 “管理存储池”。
要使用默认设置创建两个需要用于 CephFS 的存储池(例如“cephfs_data”和“cephfs_metadata”),请运行以下命令:
root #
ceph osd pool create cephfs_data pg_numroot #
ceph osd pool create cephfs_metadata pg_num
可以使用 EC 存储池取代副本池。建议仅针对低性能要求和不经常发生的随机访问(例如冷存储、备份和存档)使用 EC 存储池。EC 存储池中的 CephFS 需要启用 BlueStore,并且必须为存储池设置 allow_ec_overwrite
选项。可以运行 ceph osd pool set ec_pool allow_ec_overwrites true
来设置此选项。
纠删码会明显增大文件系统操作的开销,尤其是执行小规模更新时。使用纠删码作为容错机制必然会产生这种开销。这种代价抵消了明显减小的存储空间开销。
创建存储池时,可以使用 ceph fs new
命令来启用文件系统:
root #
ceph fs new fs_name metadata_pool_name data_pool_name
例如:
root #
ceph fs new cephfs cephfs_metadata cephfs_data
可以通过列出所有可用的 CephFS 来检查是否已创建文件系统:
root #
ceph
fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data]
创建文件系统后,MDS 将能够进入主动状态。例如,在单个 MDS 系统中:
root #
ceph
mds stat
e5: 1/1/1 up
一个 CephFS 实例可由多个主动 MDS 守护进程提供支持。指定给 CephFS 实例的所有主动 MDS 守护进程将在彼此之间分发文件系统的目录树,以此来分散并行客户端的负载。要为 CephFS 实例添加主动 MDS 守护进程,需要一个备用待机守护进程。请启动其他守护进程或使用现有待机实例。
以下命令将显示当前主动和被动 MDS 守护进程的数量。
root #
ceph mds stat
以下命令将文件系统实例中的主动 MDS 的数量设置为两个。
root #
ceph fs set fs_name max_mds 2
要在更新前收缩 MDS 集群,需要执行以下两个步骤。首先设置 max_mds
,以只留一个实例:
root #
ceph fs set fs_name max_mds 1
然后明确停用其他主动 MDS 守护进程:
root #
ceph mds deactivate fs_name:rank
其中 rank 为文件系统实例的主动 MDS 守护进程的数量,范围介于 0 到 max_mds
-1 之间。有关其他信息,请参见 http://docs.ceph.com/docs/luminous/cephfs/multimds/。
在 Ceph 更新期间,文件系统实例上的功能标识可能会发生变化(通常在添加新功能时发生)。不兼容的守护进程(例如旧版本)无法与不兼容的功能集搭配使用,并将拒绝启动。这意味着更新并重启动一个守护进程可能会导致尚未更新的其他所有守护进程都将停止并拒绝启动。出于此原因,我们建议将主动 MDS 集群的大小缩为一个,并在更新 Ceph 之前停止所有待机守护进程。此更新过程的手动步骤如下所述:
使用 zypper
更新 Ceph 相关的包。
按上述说明将主动 MDS 集群缩小至 1 个实例,并使用其在所有其他节点上的 systemd
单元停止所有待机 MDS 守护进程:
root #
systemctl stop ceph-mds\*.service ceph-mds.target
然后才重启动其余一个 MDS 守护进程,以使其使用更新的二进制文件重启动。
root #
systemctl restart ceph-mds\*.service ceph-mds.target
重启动所有其他 MDS 守护进程并重设置所需的 max_mds
设置。
root #
systemctl start ceph-mds.target
如果您使用 DeepSea,则在阶段 0 和 4 更新 ceph 包时,它会遵循此过程。当客户端装入 CephFS 实例并且正在进行 I/O 操作时,可能会执行此过程。不过请注意,当主动 MDS 重启动时,会有一个短暂的 I/O 暂停。客户端将自动恢复。
最好在更新 MDS 集群之前尽可能减少 I/O 负载。如此空闲的 MDS 集群将能更快地完成此更新。反之,在一个负载较重具有多个 MDS 守护进程的集群上,必须提前减少负载以防止进行中的 I/O 超出单个 MDS 守护进程的负载能力。