Ceph 文件系统 (CephFS) 是符合 POSIX 标准的文件系统,它使用 Ceph 存储集群来存储其数据。CephFS 使用与 Ceph 块设备相同的集群系统:Ceph 对象存储及其 S3 和 Swift API 或本机绑定 (librados
)。
要使用 CephFS,需有一个正在运行的 Ceph 存储集群,并至少要有一台正在运行的 Ceph 元数据服务器。
借助 SUSE Enterprise Storage 6,SUSE 引入了对分布式扩展组件 CephFS 的众多使用场景的正式支持。本节介绍硬性限制,并提供有关建议用例的指导。
支持的 CephFS 部署必须符合以下要求:
至少有一台元数据服务器。SUSE 建议部署多个具有 MDS 角色的节点。其中只有一个节点是主动
节点,其余节点都是被动
节点。从客户端装入 CephFS 时,请记得在 mount
命令中指定所有 MON 节点。
客户端是使用 cephfs
内核扩展模块驱动程序的 SUSE Linux Enterprise Server 12 SP3(或更新版本)或 SUSE Linux Enterprise Server 15(或更新版本)。不支持 FUSE 扩展模块。
SUSE Enterprise Storage 6 中支持 CephFS 配额,且可对 Ceph 文件系统的任何子目录设置该配额。配额可限制目录层次结构中指定点下所存储的字节
或文件
数。有关详细信息,请参见 第 19.6 节 “设置 CephFS 配额”。
CephFS 支持 第 11.3.4 节 “文件布局” 中所述的文件布局更改。但是,尽管文件系统可由任何客户端装入,但无法将新数据池添加到现有的 CephFS 文件系统 (ceph mds add_data_pool
)。只能在文件系统已卸载时添加这些存储池。
至少有一台元数据服务器。SUSE 建议部署多个具有 MDS 角色的节点。默认情况下,其他 MDS 守护进程启动时处于待机
状态,充当主动 MDS 的后备。系统也支持多个主动 MDS 守护进程(请参见第 11.3.2 节 “MDS 集群大小”)。
Ceph 元数据服务器 (MDS) 存储 CephFS 的元数据。Ceph 块设备和 Ceph 对象存储不使用 MDS。POSIX 文件系统用户可通过 MDS 执行基本命令(例如 ls
或 find
),因而不会对 Ceph 存储集群施加巨大的负担。
您可以根据第 5.3 节 “集群部署”中所述,在初始集群部署过程中部署 MDS;或者根据第 2.1 节 “添加新的集群节点”中所述,将 MDS 添加到已部署的集群。
部署 MDS 后,请在部署 MDS 的服务器的防火墙设置中允许 Ceph OSD/MDS
服务:启动 yast
,导航到 › › ,然后在 下拉菜单中选择 。如果不允许在 Ceph MDS 节点中传送完整流量,则即使其他操作可以正常进行,装入文件系统也会失败。
可以通过在 ceph.conf
配置文件中插入相关的选项来微调 MDS 的行为。
如果设为“true”(默认值),Monitor 会将 standby-replay 模式强制设为 active 模式。在 [mon]
或 [global]
段落下设置。
mds cache memory limit
MDS 将针对其缓存实施软内存限制(以字节数为单位)。管理员应使用此项设置取代旧的 mds cache size
设置。默认设为 1 GB。
mds cache reservation
MDS 缓存要维护的缓存预留(内存或 inode)。当 MDS 开始接近其预留大小时,会撤消客户端状态,直到其缓存大小收缩到可恢复预留为止。默认值为 0.05。
要缓存的 Inode 数量。值为 0(默认值)表示数量不限。建议使用 mds cache memory limit
来限制 MDS 缓存使用的内存量。
新项目在缓存 LRU 中的插入点(从顶部插入)。默认值为 0.7.
触发 Ceph 使用完整更新而非部分更新提交的脏目录比例。默认值为 0.5。
触发 Ceph 将其分解为多个更小事务的目录更新的大小上限。默认设为 90 MB。
MDS 缓存温度的半衰期。默认值为 5。
向 Monitor 发送信标讯息的频率(以秒为单位)。默认值为 4.
从 Monitor 未收到信标到 Ceph 声明 MDS 延迟并可能替换它相隔的时间。默认值为 15.
在 OSD 索引中将故障 MDS 列入黑名单的持续时间。此设置可控制故障 MDS 守护进程保留在 OSD 索引黑名单中的时长,但无法控制管理员手动加入黑名单的项目的保留时长。例如,ceph osd blacklist add
命令仍将使用默认黑名单时间。默认值为 24*60。
MDS 重启动期间等待客户端重新连接的间隔(以秒为单位)。默认值为 45.
MDS 执行内部周期任务的频率。默认值为 5。
尝试避免在树中向上传播递归统计数据的最短间隔(以秒为单位)。默认值为 1。
dirstat 更改向上传播的速度。默认值为 5。
要为每个客户端会话预分配的 Inode 数量。默认值为 1000。
决定 MDS 是否应允许客户端在提交到日志前查看请求结果。默认值为“true”。
对目录更新使用普通索引。默认值为“true”。
用于跨目录分片对文件进行哈希处理的函数。默认设为 2(即“rjenkins”)。
决定在日志重播期间 MDS 是否应尝试跳过损坏的日志事件。默认值为“false”。
我们启动修整前日志中的事件数上限。设为 -1(默认值)表示禁用上限。
我们启动修整前日志中的段(对象)数上限。设为 -1 表示禁用上限。默认值为 30。
同时过期的段数上限。默认值为 20。
EOpen 事件中的 Inode 数上限。默认值为 100。
决定目录温度的取样频率(用于制定分片决策)。默认值为 3。
触发 Ceph 尝试将元数据复制到其他节点的温度上限。默认值为 8000。
触发 Ceph 停止将元数据复制到其他节点的温度下限。默认值为 0。
触发 MDS 将目录分片分割为更小的位的目录大小上限。默认值为 10000。
触发 Ceph 分割目录分片的目录读取温度上限。默认值为 25000。
触发 Ceph 分割目录分片的目录写入温度上限。默认值为 10000。
将目录分片分割成的位数。默认值为 3。
触发 Ceph 尝试合并相邻目录分片的目录大小下限。默认值为 50。
在 MDS 之间交换工作负载的频率(以秒为单位)。默认值为 10。
从分片可分割或合并到执行分片更改之间的延迟时间(以秒为单位)。默认值为 5。
分片超出分割大小的比例,达到该比例后将跳过分片间隔,立即执行分割。默认值为 1.5。
触发因 ENOSPC 错误而拒绝所有新条目的分片大小上限。默认值为 100000。
触发 Ceph 将子树迁移回其父项的温度下限。默认值为 0。
计算 MDS 负载的方法:
0 = 混合式。
1 = 请求率和延迟。
2 = CPU 负载。
默认值为 0。
触发 Ceph 迁移的子树温度下限。默认值为 0.1。
触发 Ceph 搜索子树的子树温度下限。默认值为 0.2。
可接受的目标子树大小比例下限。默认值为 0.8。
可接受的目标子树大小比例上限。默认值为 1.2。
Ceph 将迁移任何超过此目标子树大小比例的子树。默认值为 0.3。
Ceph 将忽略任何小于此目标子树大小比例的子树。默认值为 0.001。
触发 Ceph 从 MDS 索引中删除旧 MDS 目标的平衡器迭代数下限。默认值为 5。
触发 Ceph 从 MDS 索引中删除旧 MDS 目标的平衡器迭代数上限。默认值为 10。
处于 standby-replay 模式(“热待机”)时的日志巡回检测间隔。默认值为 1。
MDS 关闭期间巡回检测缓存的间隔。默认值为 0。
Ceph 会将目录随机分片或合并。默认值为 0。
Ceph 会将 MDS 缓存内容转储到每个 MDS 索引上的某个文件中。默认值为“false”。
恢复期间重新加入缓存后,Ceph 会将 MDS 缓存内容转储到文件中。默认值为“false”。
此设置中以名称指定的 MDS 守护进程将存在一个待机 MDS 守护进程。
具有此排位的 MDS 守护进程将存在一个待机 MDS 守护进程。默认值为 -1。
决定 Ceph MDS 守护进程是否应巡回检测并重播主动 MDS 的日志(“热待机”)。默认值为“false”。
设置一个客户端可具有的最小权限数。默认值为 100。
设置处于 MDS 缓存压力期间可重新调用的当前权限的最大比例。默认值为 0.8。
更新日志标题对象的频率。默认值为 15。
日志重播前读取的条带周期数。默认值为 10。
写入位置前置零的条带周期数。默认值为 10。
人为产生的最大额外延迟时间(以秒为单位)。默认值为 0.001。
一次延迟刷新的最大字节数。默认值为 0。
部署至少包含一台 Ceph 元数据服务器的正常 Ceph 存储集群后,可以创建并装入 Ceph 文件系统。请确保客户端可连接到网络,并具有正确的身份验证密钥环。
CephFS 至少需要两个 RADOS 存储池:一个用于存储数据,另一个用于存储元数据。配置这些存储池时,可以考虑:
对元数据池使用较高的复制级别,因为丢失此池中的任何数据都可能会导致整个文件系统不可访问。
对元数据池使用延迟较低的存储,例如 SSD,因为在客户端上执行文件系统操作时,这样可以改善用户可察觉到的延迟。
在 policy.cfg
中指定 role-mds
时,会自动创建所需的存储池。在设置元数据服务器之前,可以手动创建存储池 cephfs_data
和 cephfs_metadata
,以手动优化性能。如果这些存储池已存在,DeepSea 将不会创建它们。
有关管理存储池的详细信息,请参见第 11 章 “管理存储池”。
要使用默认设置创建两个需要用于 CephFS 的存储池(例如“cephfs_data”和“cephfs_metadata”),请运行以下命令:
cephadm@adm >
ceph osd pool create cephfs_data pg_numcephadm@adm >
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
命令来启用文件系统:
cephadm@adm >
ceph fs new fs_name metadata_pool_name data_pool_name
例如:
cephadm@adm >
ceph fs new cephfs cephfs_metadata cephfs_data
可以通过列出所有可用的 CephFS 来检查是否已创建文件系统:
cephadm@adm >
ceph
fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data]
创建文件系统后,MDS 将能够进入工作状态。例如,在单个 MDS 系统中:
cephadm@adm >
ceph
mds stat
e5: 1/1/1 up
一个 CephFS 实例可由多个工作 MDS 守护进程提供支持。指定给 CephFS 实例的所有工作 MDS 守护进程将在彼此之间分发文件系统的目录树,以此来分散并行客户端的负载。要为 CephFS 实例添加工作 MDS 守护进程,需要一个备用待机守护进程。请启动其他守护进程或使用现有待机实例。
以下命令将显示当前工作和被动 MDS 守护进程的数量。
cephadm@adm >
ceph mds stat
以下命令在文件系统实例中将主动 MDS 的数量设置为两个。
cephadm@adm >
ceph fs set fs_name max_mds 2
要在更新前收缩 MDS 集群,需要执行以下两个步骤。首先,将 max_mds
设置为只保留一个实例:
cephadm@adm >
ceph fs set fs_name max_mds 1
然后明确停用另一个主动 MDS 守护进程:
cephadm@adm >
ceph mds deactivate fs_name:rank
其中 rank 为文件系统实例的工作 MDS 守护进程的数量,范围介于 0 到 max_mds
-1 之间。
我们建议至少保留一个 MDS 作为待机守护进程。
在 Ceph 更新期间,文件系统实例上的功能标识可能会发生变化(通常在添加新功能时发生)。不兼容的守护进程(例如旧版本)无法与不兼容的功能集搭配使用,并将拒绝启动。这意味着更新并重启动一个守护进程可能会导致尚未更新的其他所有守护进程都将停止并拒绝启动。出于此原因,我们建议将主动 MDS 集群缩小为仅包含一个实例,并在更新 Ceph 之前停止所有待机守护进程。此更新过程的手动步骤如下所述:
使用 zypper
更新 Ceph 相关的包。
按上述说明将主动 MDS 集群缩小至一个实例,并在所有其他节点上使用所有待机 MDS 守护进程的 systemd
单元将它们停止:
cephadm@mds >
systemctl stop ceph-mds\*.service ceph-mds.target
然后才重启动其余一个 MDS 守护进程,以使其使用更新的二进制文件重启动。
cephadm@mds >
systemctl restart ceph-mds\*.service ceph-mds.target
重启动所有其他 MDS 守护进程,并重设置所需的 max_mds
设置。
cephadm@mds >
systemctl start ceph-mds.target
如果您使用 DeepSea,则在阶段 0 和 4 中更新 ceph 包时,它会遵循此过程。当客户端装入 CephFS 实例并且正在进行 I/O 操作时,可能会执行此过程。不过请注意,当工作 MDS 重启动时,会有一个短暂的 I/O 暂停。客户端将自动恢复。
最好在更新 MDS 集群之前尽可能减少 I/O 负载。如此空闲的 MDS 集群将能更快地完成此更新。反之,在一个负载较重具有多个 MDS 守护进程的集群上,必须提前减少负载以防止进行中的 I/O 超出单个 MDS 守护进程的负载能力。
文件的布局可控制其内容映射到 Ceph RADOS 对象的方式。您可以使用虚拟扩展属性或 xattrs 短暂读取和写入文件的布局。
布局 xattrs 的名称取决于文件是常规文件还是目录。常规文件的布局 xattrs 名为 ceph.file.layout
,而目录的布局 xattrs 名为 ceph.dir.layout
。示例中将使用 ceph.file.layout
名称,处理目录时则相应地替换 .dir.
部分。
系统可识别下列属性字段:
将在其中存储文件数据对象的 RADOS 存储池的 ID 或名称。
数据存储池内对象将写入其中的 RADOS 名称空间。默认为空,表示使用默认名称空间。
在文件的 RAID 0 分布中使用的数据块大小(以字节为单位)。文件的所有条带单元大小都相同。最后一个条带单元通常不完整,它代表文件末尾的数据,以及文件末尾至固定大小的条带单元末端未使用的“空间”。
构成文件数据的 RAID 0“条带”的连续条带单元的数量。
用于存储文件数据块的 RADOS 对象的大小(以字节为单位)。
RADOS 会强制施加一个可配置的对象大小上限。如果您将 CephFS 对象大小增加到超出该上限的值,则写入将失败。OSD 设置为 osd_max_object_size
,默认值为 128 MB。RADOS 对象太大可能会妨碍集群顺利运行,因此不建议将对象大小上限指定为超出默认值的数值。
getfattr
读取布局 #
使用 getfattr
命令可读取示例文件 file
的布局信息并将其输出为单个字符串:
root #
touch fileroot #
getfattr -n ceph.file.layout file # file: file ceph.file.layout="stripe_unit=4194304 stripe_count=1 object_size=419430
读取单个布局字段:
root #
getfattr -n ceph.file.layout.pool file # file: file ceph.file.layout.pool="cephfs_data"root #
getfattr -n ceph.file.layout.stripe_unit file # file: file ceph.file.layout.stripe_unit="4194304"
读取布局时,通常使用名称指示存储池。但在极少数情况下,当存储池刚刚创建时,可能会输出 ID 而非名称。
目录没有显式布局,除非对其进行了自定义。如果从未修改过布局,则尝试读取布局的操作将失败:这表示系统将使用具有显式布局的上一层目录的布局。
root #
mkdir dirroot #
getfattr -n ceph.dir.layout dir dir: ceph.dir.layout: No such attributeroot #
setfattr -n ceph.dir.layout.stripe_count -v 2 dirroot #
getfattr -n ceph.dir.layout dir # file: dir ceph.dir.layout="stripe_unit=4194304 stripe_count=2 object_size=4194304 pool=cephfs_data"
setfattr
写入布局 #
使用 setfattr
命令可修改示例文件 file
的布局字段:
cephadm@adm >
ceph osd lspools 0 rbd 1 cephfs_data 2 cephfs_metadataroot #
setfattr -n ceph.file.layout.stripe_unit -v 1048576 fileroot #
setfattr -n ceph.file.layout.stripe_count -v 8 file # Setting pool by ID:root #
setfattr -n ceph.file.layout.pool -v 1 file # Setting pool by name:root #
setfattr -n ceph.file.layout.pool -v cephfs_data file
使用 setfattr
修改文件的布局字段时,需要清空此文件,否则会发生错误。
如果您要从示例目录 mydir
中删除显式布局,并恢复为继承上一层目录的布局,请运行以下命令:
root #
setfattr -x ceph.dir.layout mydir
同样,如果您设置了“pool_namespace”属性,现在希望修改布局以转为使用默认名称空间,请运行以下命令:
# Create a directory and set a namespace on itroot #
mkdir mydirroot #
setfattr -n ceph.dir.layout.pool_namespace -v foons mydirroot #
getfattr -n ceph.dir.layout mydir ceph.dir.layout="stripe_unit=4194304 stripe_count=1 object_size=4194304 \ pool=cephfs_data_a pool_namespace=foons" # Clear the namespace from the directory's layoutroot #
setfattr -x ceph.dir.layout.pool_namespace mydirroot #
getfattr -n ceph.dir.layout mydir ceph.dir.layout="stripe_unit=4194304 stripe_count=1 object_size=4194304 \ pool=cephfs_data_a"
文件在创建时会继承其父目录的布局。但在此之后对父目录布局所做的更改不会影响其子项:
root #
getfattr -n ceph.dir.layout dir # file: dir ceph.dir.layout="stripe_unit=4194304 stripe_count=2 object_size=4194304 \ pool=cephfs_data" # file1 inherits its parent's layoutroot #
touch dir/file1root #
getfattr -n ceph.file.layout dir/file1 # file: dir/file1 ceph.file.layout="stripe_unit=4194304 stripe_count=2 object_size=4194304 \ pool=cephfs_data" # update the layout of the directory before creating a second fileroot #
setfattr -n ceph.dir.layout.stripe_count -v 4 dirroot #
touch dir/file2 # file1's layout is unchangedroot #
getfattr -n ceph.file.layout dir/file1 # file: dir/file1 ceph.file.layout="stripe_unit=4194304 stripe_count=2 object_size=4194304 \ pool=cephfs_data" # ...while file2 has the parent directory's new layoutroot #
getfattr -n ceph.file.layout dir/file2 # file: dir/file2 ceph.file.layout="stripe_unit=4194304 stripe_count=4 object_size=4194304 \ pool=cephfs_data"
如果中间目录未设置布局,则所创建的作为目录后代的文件也将继承目录的布局:
root #
getfattr -n ceph.dir.layout dir # file: dir ceph.dir.layout="stripe_unit=4194304 stripe_count=4 object_size=4194304 \ pool=cephfs_data"root #
mkdir dir/childdirroot #
getfattr -n ceph.dir.layout dir/childdir dir/childdir: ceph.dir.layout: No such attributeroot #
touch dir/childdir/grandchildroot #
getfattr -n ceph.file.layout dir/childdir/grandchild # file: dir/childdir/grandchild ceph.file.layout="stripe_unit=4194304 stripe_count=4 object_size=4194304 \ pool=cephfs_data"
要对 CephFS 使用存储池,需要先将存储池添加到元数据服务器:
cephadm@adm >
ceph fs add_data_pool cephfs cephfs_data_ssdcephadm@adm >
ceph fs ls # Pool should now show up .... data pools: [cephfs_data cephfs_data_ssd ]
请确保您的 cephx 密钥允许客户端访问此新存储池。
然后,您可以在 CephFS 中更新目录的布局,以使用所添加的存储池:
root #
mkdir /mnt/cephfs/myssddirroot #
setfattr -n ceph.dir.layout.pool -v cephfs_data_ssd /mnt/cephfs/myssddir
所有在该目录中创建的新文件现在都将继承该目录的布局,并会将其数据存放到新添加的存储池中。您可能会发现主数据存储池中的对象数量会持续增加,即使文件是在您新添加的存储池中创建的也是如此。这是正常现象:文件数据会存储到布局所指定的存储池中,但仍会在主数据存储池中为所有文件保存少量元数据。