Ceph File System (CephFS) 是与 POSIX 标准兼容的文件系统, 能够提供对 Ceph 存储集群上的文件访问. Jewel 版本(10.2.0) 是第一个包含稳定 CephFS 的 Ceph 版本. CephFS 需要至少一个元数据服务器 (Metadata Server - MDS) daemon (ceph-mds) 运行, MDS daemon 管理着与存储在 CephFS 上的文件相关的元数据, 并且协调着对 Ceph 存储系统的访问.


Table of Contents

  1. Ceph 文件系统简介
    1. CephFS 架构
    2. CephFS 主要特性
    3. CephFS 的限制
  2. 配置 CephFS MDS
    1. ceph-deploy 部署 MDS
    2. 手动部署 MDS
    3. 移除一个 MDS
  3. 部署 Ceph 文件系统
    1. 创建一个 Ceph 文件系统
    2. 创建访问 CephFS 和客户端
    3. 以 kernel client 形式挂载 CephFS
      1. 手动挂载
      2. 自动挂载
    4. 以 FUSE client 形式挂载 CephFS
      1. 手动挂载
      2. 自动挂载
  4. 管理 Ceph 文件系统
  5. 卸载 Ceph 文件系统
    1. 卸载以 kernel clients 形式挂载的 CephFS
    2. 卸载以 FUSE client 形式挂载的 CephFS
  6. CephFS 管理命令
    1. 文件系统
    2. 设置
    3. 上线/下线 文件系统

Ceph 文件系统简介

CephFS 会在任何可能的情况下使用 POSIX 方法. 例如, CephFS 会在所有客户端之间保持缓存强一致性, 但在某些情况下, CephFS 会与严格的 POSIX 语义有些区别.

CephFS 架构

下图展示了 CephFS 的层次结构:

底层是核心集群所依赖的, 包括:

  • OSDs (ceph-osd): CephFS 的数据和元数据就存储在 OSDs 上
  • MDS (ceph-mds): Metadata Servers, 管理着 CephFS 的元数据
  • Mons (ceph-mon): Monitors 管理着集群 Map 的主副本

Ceph 存储集群的协议层是 Ceph 原生的 librados 库, 与核心集群交互.

CephFS 库层包括 CephFS 库 libcephfs, 工作在 librados 的顶层, 代表着 Ceph 文件系统.

最上层是能够访问 Ceph 文件系统的两类客户端.

CephFS 主要特性

CephFS 的限制

配置 CephFS MDS

要使用 CephFS, 至少就需要一个 metadata server 进程。可以手动创建一个 MDS, 也可以使用 ceph-deploy 或者 ceph-ansible 来部署 MDS。

ceph-deploy 部署 MDS

1
$ ceph-deploy mds create mds [mds2 ...]

手动部署 MDS

  1. 建立 MDS 元数据文件夹
1
$ sudo mkdir -p /var/lib/ceph/mds/ceph-{$id}

为提高性能, 可以将该文件夹挂载到 SSD 上。
2. 在 /etc/ceph/ceph.conf 中加入下面一节

1
2
[mds.{$id}]
host = {hostname}
  1. 创建认证密钥
1
$ sudo ceph auth get-or-create mds.{$id} mon 'profile mds' mgr 'profile mds' mds 'allow *' osd 'allow *' > /var/lib/ceph/mds/ceph-{$id}/keyring
  1. 启动 MDS 服务
1
$ sudo systemctl enable --now ceph-mds@{$id}
  1. 查看集群状态:
1
2
3
4
$ ceph -s
...
mds: cephfs_a-1/1/1 up {0=c=up:active}, 3 up:standby
...

移除一个 MDS

如果想要移除集群中的一个 MDS,可以通过如下步骤

  1. 先创建一个 MDS
  2. 停止旧的 MDS, 启用新的 MDS
1
$ ceph mds fail <mds name>
  1. 移除旧 MDS 的数据文件夹
1
$ sudo rm -rf /var/lib/ceph/mds/ceph-{$id}

部署 Ceph 文件系统

部署一个 CephFS, 步骤如下:

  1. 在一个 Mon 节点上创建 Ceph 文件系统.
  2. 若使用 CephX 认证, 需要创建一个访问 CephFS 的客户端
  3. 挂载 CephFS 到一个专用的节点.

创建一个 Ceph 文件系统

  1. CephFS 需要两个 Pools - cephfs-datacephfs-metadata, 分别存储文件数据和文件元数据:
1
2
$ ceph osd pool create cephfs-data 256 256
$ ceph osd pool create cephfs-metadata 64 64

一般 metadata pool 可以从相对较少的 PGs 启动, 之后可以根据需要增加 PGs. 因为 metadata pool 存储着 CephFS 文件的元数据, 为了保证安全, 最好有较多的副本数. 为了能有较低的延迟, 可以考虑将 metadata 存储在 SSDs 上.
2. 安装 ceph-common 包:

1
$ sudo yum install -y ceph-common
  1. 创建一个 CephFS, 名字为 cephfs:
1
$ ceph fs new cephfs cephfs-metadata cephfs-data
  1. 验证至少有一个 MDS 已经进入 Active 状态:
1
$ ceph fs status cephfs

创建访问 CephFS 和客户端

  1. 在 Monitor 上, 创建一个用户:
1
2
3
4
### usage:
$ ceph auth get-or-create client.<id> <capabilities>
### e.g.:
$ ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow rw' osd 'allow rw pool=cephfs-data, allow rw pool=cephfs-metadata'
  1. 验证生成的 key:
1
2
3
4
### usage:
$ ceph auth get client.<id>
### e.g.:
$ ceph auth get client.cephfs
  1. 将 client keyring 复制到 client 节点的 /etc/ceph 目录下,并修改权限:
1
2
$ sudo scp root@mon1:/etc/ceph/ceph.client.cephfs.keyring /etc/ceph/ceph.client.cephfs.keyring
$ sudo chmod 644 /etc/ceph/ceph.client.cephfs.keyring

以 kernel client 形式挂载 CephFS

可以手动用 mount 命令挂载 CephFS 或者通过 /etc/fstab 自动挂载 CephFS.

手动挂载

  1. 建立挂载点, 例如 /cephfs:
1
$ sudo mkdir -p /cephfs
  1. 挂载 CephFS. 列出多个 Monitors 的地址, 指定 CephX 所需的密钥文件和客户端名, 注意不是 keyring file:
1
$ sudo mount -t ceph mon1:6789,mon2:6789,mon3:6789/ /cephfs -o name=cephfs,secretfile=/etc/ceph/cephfs.secret
  1. 验证 CephFS 已经成功挂载:
1
$ stat -f /cephfs

自动挂载

  1. 创建挂载点:
1
$ sudo mkdir -p /cephfs
  1. 编辑 /etc/fstab 文件:
1
$ echo "mon1:6789,mon2:6789,mon3:6789:/ /cephfs ceph name=cephfs,secretfile=/etc/ceph/cephfs.key,_netdev,noatime 0 0" | sudo tee -a /etc/fstab
  1. 重启或者:
1
$ sudo mount -a

以 FUSE client 形式挂载 CephFS

同样地, 可以手动通过 ceph-fuse 挂载或者通过向 /etc/fstab 添加挂载项自动挂载.

  1. ceph.conf 从 Monitor 节点复制到客户端节点,
1
2
$ sudo scp root@mon1:/etc/ceph/ceph.conf /etc/ceph/ceph.conf
$ sudo chmod 644 /etc/ceph/ceph.conf
  1. 客户端上安装 ceph-fuse:
1
$ sudo yum install ceph-fuse -y

手动挂载

  1. 创建挂载点, 例如 /cephfs:
1
$ sudo mkdir -p /cephfs
  1. 使用 ceph-fuse 挂载 CephFS, 如果 对应的 keyring 不在 /etc/ceph 下, 则要显示指定:
1
$ sudo ceph-fuse -n client.cephfs [--keyring /etc/ceph/client.cephfs.keyring] /cephfs
  1. 验证 CephFS 已经成功挂载:
1
$ stat -f /cephfs

自动挂载

  1. 创建挂载点:
1
$ sudo mkdir -p /cephfs
  1. /etc/fstab 添加一项:
1
2
3
$ echo "none /cephfs fuse.ceph ceph.id=cephfs[,ceph.conf=/etc/ceph/ceph.conf],_netdev,defaults 0 0"| sudo tee -a /etc/fstab
### or
$ echo "id=cephfs,conf=/etc/ceph/ceph.conf /mnt/ceph2 fuse.ceph _netdev,defaults 0 0"| sudo tee -a /etc/fstab
  1. 挂载 CephFS:
1
2
3
$ sudo mount -a
## or
$ sudo reboot

管理 Ceph 文件系统

卸载 Ceph 文件系统

卸载以 kernel clients 形式挂载的 CephFS

跟卸载其他挂载的磁盘一样:

1
2
3
4
### usage:
$ sudo umount <mount-point>
### e.g.:
$ sudo umount /cephfs

卸载以 FUSE client 形式挂载的 CephFS

1
2
3
4
### usage:
$ fusermount -u <mount-point>
### e.g.:
$ sudo fusermount -u /cephfs

CephFS 管理命令

文件系统

  1. 创建一个 CephFS。
1
ceph fs new <file system name> <metadata pool name> <data pool name>
  1. Ceph 默认只能创建一个 CephFS,若要创建多个,需要设置可创建多个文件系统:
1
ceph fs flag set enable_multiple true
  1. 列出所有文件系统:
1
ceph fs ls
  1. 导出文件系统元数据。
1
ceph fs dump <epoch>
  1. 删除文件系统。
1
ceph fs rm <file system name> [--yes-i-really-mean-it]
  1. 获取文件系统设置。
1
ceph fs get <file system name>
  1. 更改文件系统设置。
1
ceph fs set <file system name> <var> <val>
  1. 增加/删除数据 Pool
1
2
3
4
## add data pool
ceph fs add_data_pool <file system name> <pool name/id>
## del data pool
ceph fs rm_data_pool <file system name> <pool name/id>

设置

  1. 更改最大文件大小限制:
1
ceph fs set <fs name> max_file_size <size in bytes>

如果大小设为0, 不意味着大小没有限制,而是只能创建大小为0的文件。最大文件大小过大

  1. 兼容性设置。设置客户端最小兼容版本
1
2
3
4
## usage
ceph fs set <fs name> min_compat_client <release>
## e.g.
ceph fs set cephfs min_compat_client naultilus

上线/下线 文件系统

  1. 下线 CephFS
1
ceph fs set <fs_name> down true
  1. 上线 CephFS
1
ceph fs set <fs_name> down false