飞行的蜗牛

vuePress-theme-reco 极客学长    2013 - 2025
飞行的蜗牛 飞行的蜗牛

Choose mode

  • dark
  • auto
  • light
首页
分类
  • 技术杂谈
  • Database
  • Docker
  • PHP
  • 随笔杂谈
  • 前端开发
  • FunnyTools
  • Jekyll
  • 读书笔记
  • Java
  • SpringBoot
  • 区块链技术
  • IPFS
  • C/C++
  • Filecoin
  • Golang
  • Sharding-JDBC
  • 分布式存储
  • Lotus-源码系列
  • Lotus
  • 框架源码系列
  • Spring-源码系列
  • AI
  • ChatGPT
  • Stable Diffusion
  • DeepSeek-R1
  • DeepSeek-V3
标签
时间抽
关于作者
开源项目
GeekAI (opens new window)
author-avatar

极客学长

154

文章

151

标签

首页
分类
  • 技术杂谈
  • Database
  • Docker
  • PHP
  • 随笔杂谈
  • 前端开发
  • FunnyTools
  • Jekyll
  • 读书笔记
  • Java
  • SpringBoot
  • 区块链技术
  • IPFS
  • C/C++
  • Filecoin
  • Golang
  • Sharding-JDBC
  • 分布式存储
  • Lotus-源码系列
  • Lotus
  • 框架源码系列
  • Spring-源码系列
  • AI
  • ChatGPT
  • Stable Diffusion
  • DeepSeek-R1
  • DeepSeek-V3
标签
时间抽
关于作者
开源项目
GeekAI (opens new window)
  • Ceph-06 Ceph 文件系统

    • 最稳定的配置
      • 1. 内核挂载
        • 设置开机自动挂载
      • 2. fuse 挂载
        • 设置开机自动挂载

    Ceph-06 Ceph 文件系统

    vuePress-theme-reco 极客学长    2013 - 2025

    Ceph-06 Ceph 文件系统


    极客学长 2020-02-16 0 Ceph

    本文介绍如何搭建 Ceph 的文件系以及 CephFS 的相关操作。

    # CephFS 简介

    CephFS 简称 Ceph 集群文件系统。在介绍 Ceph 文件系统之前,首先我们了解一下什么是计算机的文件系统。

    计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了 硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上, 只需要记住这个文件的所属目录和文件名。

    简单的说,文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型。

    Linux 系统下的 ext3,ext4,xfs ,以及 windows 下的 ntfs,U 盘的 fat32 都是我们常见的文件系统。 通常我们在我们要使用硬盘/U盘存储数据之前要先格式化,其实就是在磁盘上初始化一个文件系统。 所以我们通常也把 ext4, ntfs 这些叫做磁盘做磁盘的格式。

    理解了文件系统的概念之后我们就可以解释什么是 CephFS 了。所谓 CephFS 就是 Ceph 集群自己实现的文件系统, 用来组织和管理集群的存储空间。是个 POSIX 兼容的文件系统,它使用 Ceph 存储集群来存储数据,本质上跟上面的 ext4, ntfs 没什么两样。 只不过这个文件系统能够依托 Ceph 集群的优势,方便扩展,并且能够提供优异的读写性能。 使用起来也非常方便,用户可以直接将Ceph集群的文件系统挂载到用户机上使用。

    # 启用 CephFS

    Ceph 文件系统至少需要两个 RADOS 池,一个用于数据,一个用于元数据。

    启用 MDS 服务,这里我们是用 ceph1 节点运行 MDS 服务:

    ceph-deploy mds create ceph1
    

    Note: Ceph 集群允许创建多个 MDS 服务,但是默认只允许启动一个 MDS,其他都都作为热备状态。

    root@client:~# ceph -s
      cluster:
        id:     66e9dcb5-9ee7-4055-9803-6d387f2d7f74
        health: HEALTH_WARN
     
      services:
        mon: 1 daemons, quorum ceph1
        mgr: ceph1(active)
        mds: cephfs-1/1/1 up  {0=ceph1=up:active}, 1 up:standby
        osd: 7 osds: 7 up, 7 in
     
      data:
        pools:   4 pools, 204 pgs
        objects: 367 objects, 1.14GiB
        usage:   9.42GiB used, 25.9GiB / 35.3GiB avail
        pgs:     5.882% pgs unknown
                 192 active+clean
    
    

    standby 状态的 MDS 节点都是座位热备服务。

    创建数据 Pool:

    ceph osd pool create cephfs_data 128
    

    创建元数据池:

    ceph osd pool create cephfs_metadata 128
    

    启用 cephfs:

    ceph fs new cephfs cephfs_metadata cephfs_data
    

    查看 cephfs:

    root@client:~# ceph fs ls
    name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
    

    # 最稳定的配置

    为了营造一个 "健康快乐" 的文件系统,要使用单个活跃 MDS 并且不要用快照功能,这两条都是默认的:

    • 快照默认是禁用的,除非管理员通过 allow_new_snaps 选项明确打开了。
    • Ceph 默认会使用单个活跃 MDS ,除非管理员明确设置了大于 1 的 max_mds 值。需要注意的是, 创建额外的 MDS 守护进程(比如用 ceph-deploy mds create 命令)完全没问题,因为它们默认处于热备状态。 启用 standby-replay 模式也是很安全的。

    # CephFS 挂载

    客户端挂载 cephfs 有两种方式,kernel driver 和 fuse

    • fuse 客户端最容易与服务器做到代码级的同步,但是内核客户端的性能通常更好。
    • 这两种客户端不一定会提供一样的功能,如 fuse 客户端可支持客户端强制配额,但内核客户端却不支持。
    • 遇到缺陷或性能问题时,最好试试另一个客户端,以甄别此缺陷是否特定于客户端

    # 1. 内核挂载

    默认 Ceph 是启用 cephx 认证功能的。所以我们需要先导出认证的 keyring:

    root@client:~# ceph auth export client.admin
    export auth(auid = 18446744073709551615 key=AQBMiTle2FjIFBAA3dQ7SssZS9Ged+o8yu2HgA== with 4 caps)
    [client.admin]
    	key = AQBMiTle2FjIFBAA3dQ7SssZS9Ged+o8yu2HgA==
    	caps mds = "allow *"
    	caps mgr = "allow *"
    	caps mon = "allow *"
    	caps osd = "allow *"
    

    拿到 keyring 之后就可以直接挂载了:

    root@client:~# mount -t ceph 192.168.2.201:6789:/ /mnt/cephfs  -o name=admin,secret=AQBMiTle2FjIFBAA3dQ7SssZS9Ged+o8yu2HgA==
    root@client:~# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    udev                  462M     0  462M   0% /dev
    tmpfs                  99M  980K   98M   1% /run
    /dev/sda2             9.8G  4.2G  5.1G  46% /
    tmpfs                 493M     0  493M   0% /dev/shm
    tmpfs                 5.0M     0  5.0M   0% /run/lock
    tmpfs                 493M     0  493M   0% /sys/fs/cgroup
    /dev/loop0             92M   92M     0 100% /snap/core/8592
    /dev/loop1             90M   90M     0 100% /snap/core/8268
    /dev/rbd0             3.9G  8.1M  3.7G   1% /mnt/rbd
    tmpfs                  99M     0   99M   0% /run/user/0
    192.168.2.201:6789:/   13G  1.0G   12G   9% /mnt/cephfs
    

    当然你也可以关闭认证,直接修改 /etc/ceph/ceph.conf 文件,将 cephx 改成 none:

    auth_cluster_required = none
    auth_service_required = none
    auth_client_required = none
    

    这时候就可以直接挂载了:

    mount -t ceph 192.168.2.201:6789:/ /mnt/cephfs
    

    这里的 192.168.2.201 是 MDS 服务运行的节点 IP,这里也可以直接换成 ceph1

    # 设置开机自动挂载

    先保存 keyring 到文件:

    echo AQBMiTle2FjIFBAA3dQ7SssZS9Ged+o8yu2HgA== > /etc/ceph/admin.key
    

    修改 /etc/fstab,追加:

    192.168.2.201:6789:/ /mnt/cephfs ceph name=admin,secretfile=/etc/ceph/admin.key,noatime,_netdev  0  0
    

    # 2. fuse 挂载

    先安装挂载工具:

    apt-get install ceph-fuse
    

    执行挂载:

    root@client:~# ceph-fuse -m ceph1:6789 /mnt/cephfs
    ceph-fuse[12687]: starting ceph client
    2020-02-17 05:54:51.594686 7f400fbb2500 -1 init, newargv = 0x557233ddc3a0 newargc=9
    ceph-fuse[12687]: starting fuse
    root@client:~# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    udev            462M     0  462M   0% /dev
    tmpfs            99M  980K   98M   1% /run
    /dev/sda2       9.8G  4.3G  5.1G  46% /
    tmpfs           493M     0  493M   0% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    tmpfs           493M     0  493M   0% /sys/fs/cgroup
    /dev/loop0       92M   92M     0 100% /snap/core/8592
    /dev/loop1       90M   90M     0 100% /snap/core/8268
    tmpfs            99M     0   99M   0% /run/user/0
    /dev/rbd0       3.9G  8.1M  3.7G   1% /mnt/rbd
    ceph-fuse        13G  1.0G   12G   9% /mnt/cephfs
    

    # 设置开机自动挂载

    同样需要将存储节点的 admin 秘钥拷贝到本地,参考上文。

    然后修改 /etc/fstab 文件,加入:

    id=admin /mnt/cephfs  fuse.ceph defaults 0 0
    

    例如:

    id=admin /mnt/cephfs  fuse.ceph defaults,_netdev 0 0
    
    id=myuser,conf=/etc/ceph/cluster.conf  /mnt/ceph2  fuse.ceph defaults 0 0
    

    # RBD VS CephFS

    你可能发现了,CephFS 是个 POSIX 兼容的文件系统,它在挂载后跟块设备(RBD) 的使用方式没有什么区别。 而且 RBD 的空间容量也是可大小,调整起来非常方便,同时也具有优秀的读写性能。 咋一看他们用起来差不多,貌似如果已经有了 RBD,Ceph 文件系统看起来没有什么必要了,有点多余。

    主要是因为应用场景的不同,Ceph的块设备具有优异的读写性能,但不能多处挂载同时读写, 目前主要用在OpenStack上作为虚拟磁盘,而 Ceph 的文件系统接口读写性能较块设备接口差,但具有优异的共享性。

    为什么 Ceph 的块设备接口不具有共享性,而 Ceph 的文件系统接口具有呢?

    对于 Ceph 的块设备接口,如下图所示:

    文件系统的结构状态是维护在各用户机内存中的,假设 Ceph 块设备同时挂载到了用户机1和用户机2, 当在用户机1上的文件系统中写入数据后,更新了用户机1的内存中文件系统状态,最终数据存储到了Ceph集群中。 但是此时用户机2内存中的文件系统并不能得知底层Ceph集群数据已经变化而维持数据结构不变, 因此用户无法从用户机2上读取用户机1上新写入的数据。

    对于 Ceph 的文件系统接口,如下图所示:

    文件系统的结构状态是维护在远端 Ceph 集群中的,Ceph 文件系统同时挂载到了用户机1和用户机2。 当往用户机1的挂载点写入数据后,远端 Ceph 集群中的文件系统状态结构随之更新, 当从用户机2的挂载点访问数据时会去远端 Ceph 集群取数据,由于远端 Ceph 集群已更新,所有用户机2能够获取最新的数据。

    # 参考文献

    • http://docs.ceph.org.cn/cephfs/early-adopters/ (opens new window)
    • https://www.jianshu.com/p/2246464306b2 (opens new window)

    本站博文如非注明转载则均属作者原创文章,引用或转载无需申请版权或者注明出处,如需联系作者请加微信: geekmaster01

    Ceph-05 Ceph 块存储之 RBD Filecoin 官方邀请 PB 级大矿工测试