在Linux上安装并挂载Ceph构建和CephFS文件系统

首先

Ceph是一种分布式存储的开源软件,提供了以下三种接口。

※以下是筆者對每個項目的粗略認識,可能存在錯誤。

    • (1) RADOS(Reliable Autonomic Distributed Object Store)

オブジェクトストレージ。AWSでいうS3、AzureだとBlob Storageのようなもの

(2) RBD(RADOS Block Device)

デバイス。パソコンの内蔵ハードディスクや外付けハードディスクのようなもの(/dev/sdaとして認識されるような感じ)

(3) CephFS(Ceph File System)

ネットワーク経由で他のマシンと共有可能なファイルシステム。Samba(CIFS)、NFSのようなもの

Ceph是一款非常有趣的软件,它具备通过扩展存储容量、数据冗余来抵御故障等功能。

在本文章中,我们将介绍如何在Linux机器上构建以下Ceph环境。

    • Ceph本体の構築。Cephadmを利用

 

    • CephのファイルシステムCephFSの構築とマウント方法

最初にご紹介したインターフェイスの(3)相当

顺便提一下,使用RBD(RADOS块设备)的步骤在这篇文章中有详细介绍。

请确认环境是否适合动作。

構築Ceph的主要机器(MON,MNG,OSD等)

    • Raspberry Pi 4 Model B 4GB

 

    • OS : Ubuntu 22.04 LTS

 

    CPUアーキテクチャ : arm64
在实际运营中,应该推荐使用多台设备(比如3台),但这次我们只使用一台设备进行测试构建。

与OSD进行连接的磁盘(存储)

    • Seagate BarraCuda

 

    • 型名 : ST2000DM005

 

    容量 : 2TB

这个硬盘被识别为“构建Ceph的机器”的设备,并且还没有构建文件系统。

$ sudo parted -l
(出力省略)
Error: /dev/sda: unrecognised disk label
Model: Logitec  (scsi)
Disk /dev/sda: 2000GB
Sector size (logical/physical): 512B/4096B
Partition Table: unknown
Disk Flags:
(出力省略)

所有工具的版本

    • Ceph : 17.2.5

 

    Docker : 20.10.23

Ceph的设置

Cephadm的安装。

这个工具用于构建Ceph的整个环境。(官方网站)

$ sudo apt update
$ sudo apt -y install cephadm
根据REQUIREMENTS所述,需要进行设置,包括使用Python3、Docker(或Podman)、LVM2等。

安装Ceph

用于操作Ceph环境。

$ sudo apt -y install ceph
学会使用ceph命令。
尽管cephadm shell — ceph …也可以执行相同的操作,但是由于每次命令太长,使用ceph更加方便。

创建Ceph的新集群

根据官方网站的说明执行bootstrap命令。
请将待构建机器的IP地址填写在中。

$ sudo cephadm bootstrap --mon-ip *<mon-ip>*
建议在bootstrap的输出中保留“Ceph Dashboard的用户名/密码”和“集群的fsid”,请勿删除!

[参考]检查集群启动情况

我們將檢查使用Bootstrap啟動的容器和服務。
※這是一個可選的步驟,並不是必需的設置。

Ceph Dashboardへアクセス

URL : https://[mon-ip]:8443/
UsernameとPasswordはbootstrap時に出力されたものを入力
初回ログイン後はパスワードの変更が必要

コンテナの起動確認

$ sudo docker ps -a | grep -e ^CONTAINER -e ceph
CONTAINER ID   IMAGE                                     COMMAND                  CREATED         STATUS         PORTS   NAMES
2f579044e7bc   quay.io/prometheus/alertmanager:v0.23.0   "/bin/alertmanager -…"   3 minutes ago   Up 3 minutes           ceph-[fsid]-alertmanager-ubuntu
a49f3e57be32   quay.io/ceph/ceph-grafana:8.3.5           "/bin/sh -c 'grafana…"   3 minutes ago   Up 3 minutes           ceph-[fsid]-grafana-ubuntu
584bbdeb7bc1   quay.io/prometheus/prometheus:v2.33.4     "/bin/prometheus --c…"   3 minutes ago   Up 3 minutes           ceph-[fsid]-prometheus-ubuntu
e24e16294c20   quay.io/prometheus/node-exporter:v1.3.1   "/bin/node_exporter …"   4 minutes ago   Up 4 minutes           ceph-[fsid]-node-exporter-ubuntu
0724377abf29   quay.io/ceph/ceph                         "/usr/bin/ceph-crash…"   4 minutes ago   Up 4 minutes           ceph-[fsid]-crash-ubuntu
0734e3708aef   quay.io/ceph/ceph:v17                     "/usr/bin/ceph-mgr -…"   8 minutes ago   Up 8 minutes           ceph-[fsid]-mgr-ubuntu-wtdnix
05aaf49dc3ab   quay.io/ceph/ceph:v17                     "/usr/bin/ceph-mon -…"   8 minutes ago   Up 8 minutes           ceph-[fsid]-mon-ubuntu
    サービスの起動確認
$ sudo systemctl list-units --type=service | grep ceph
  ceph-[fsid]@alertmanager.ubuntu.service  loaded active running Ceph alertmanager.ubuntu for [fsid]
  ceph-[fsid]@crash.ubuntu.service         loaded active running Ceph crash.ubuntu for [fsid]
  ceph-[fsid]@grafana.ubuntu.service       loaded active running Ceph grafana.ubuntu for [fsid]
  ceph-[fsid]@mgr.ubuntu.wtdnix.service    loaded active running Ceph mgr.ubuntu.wtdnix for [fsid]
  ceph-[fsid]@mon.ubuntu.service           loaded active running Ceph mon.ubuntu for [fsid]
  ceph-[fsid]@node-exporter.ubuntu.service loaded active running Ceph node-exporter.ubuntu for [fsid]
  ceph-[fsid]@prometheus.ubuntu.service    loaded active running Ceph prometheus.ubuntu for [fsid]

似乎,Ceph的各个容器正在使用systemd服务进行监控。

添加OSD

我们会向Ceph主体添加存储空间。在增加存储空间时,我们会使用一个叫做OSD(对象存储设备守护进程)的工具。根据“DEPLOY OSDS”中的内容,我们会执行相应的命令。

让Ceph识别可用的存储设备

$ sudo ceph orch apply osd --all-available-devices
Scheduled osd.all-available-devices update...

當你確認後,你會看到以下可使用的儲存空間。

$ sudo ceph orch device ls --refresh
HOST        PATH      TYPE  DEVICE ID                  SIZE   AVAILABLE  REFRESHED  REJECT REASONS
[hostname]  /dev/sda  hdd   1Logitec_xxxxxxxxxxxxxxxx  2000G  Yes        2s ago

添加操作系统显示

请使用下列命令添加OSD。

$ sudo ceph orch daemon add osd --method raw [hostname]:/dev/sda
(出力結果)
Created osd(s) 0 on host '[hostname]'
    • 補足

[hostname]はceph orch device lsのHOSTに表示されたホスト名を入力

sudo ceph orch host lsでもCephが認識しているホスト名を確認可能

在我的环境中,如果不使用“method raw”选项,会出现错误。
猜测:默认情况下使用LVM,假设要添加到OSD的设备是“逻辑卷(LVM)”,但这次使用的是物理卷,所以失败了。例如,通过VirtualBox创建的卷应该是LVM(大概),所以应该不需要指定“method raw”选项。

确认已添加的OSD

可以通过以下命令来进行确认。

$ sudo ceph osd stat
1 osds: 1 up (since 6m), 1 in (since 10m); epoch: e17
$ sudo ceph osd tree
ID  CLASS  WEIGHT   TYPE NAME        STATUS  REWEIGHT  PRI-AFF
-1         1.81940  root default
-3         1.81940      host [hostname]
 0    hdd  1.81940          osd.0        up   1.00000  1.00000

顺便说一下,我也可以确认已经创建了osd-0的容器。

$ sudo docker ps -a | grep ceph | grep osd
cc5db04e2dac   quay.io/ceph/ceph   "/usr/bin/ceph-osd -…"   14 minutes ago   Up 14 minutes   ceph-[fsid]-osd-0

構築CephFS

undefined
    • (1) RADOS poolの作成

 

    • (2) ファイルシステムの作成

 

    • (3) 作成したファイルシステムのMDS(=Metadata Server)をコンテナでデプロイ

 

    (4) マウントするユーザの作成

我們將按照以下順序進行解釋。

(1) 创建RADOS池

参考创建POOLS的方式,创建两个RADOS pool。

$ sudo ceph osd pool create cephfs_data
(出力結果)
pool 'cephfs_data' created
$ sudo ceph osd pool create cephfs_metadata
(出力結果)
pool 'cephfs_metadata' created

(2) 创建文件系统

参考 CREATING A FILE SYSTEM 进行命令执行。

$ sudo ceph fs new cephfs cephfs_metadata cephfs_data
(出力結果)
new fs with metadata pool 2 and data pool 1

确认已被创建

$ sudo ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
$ sudo ceph mds stat
cephfs:0

(3) 使用容器部署创建的文件系统的MDS。

使用下列命令在容器上部署在步骤(2)中创建的文件系统的MDS。
部署在容器中通过步骤(2)创建的文件系统的MDS,可使用以下指令完成。

$ sudo ceph orch apply mds cephfs --placement="1 [hostname]"
(出力結果)
Scheduled mds.cephfs update...
我在RedHat的网站上找到了这个过程,Ceph官方网站上没有找到。

通过以上操作,Ceph集群的状态应如下所示。

$ sudo ceph -s
  cluster:
    id:     xxxxxxxx-yyyy-zzzz-AAAA-BBBBBBBBBBBB
    health: HEALTH_WARN
            1 MDSs report slow metadata IOs
            3 pool(s) have no replicas configured
            OSD count 1 < osd_pool_default_size 3

  services:
    mon: 1 daemons, quorum [hostname] (age 2h)
    mgr: [hostname].wtdnix(active, since 2h)
    mds: 1/1 daemons up                              # 追加で起動!
    osd: 1 osds: 1 up (since 50m), 1 in (since 54m)  # 追加で起動!

  data:
    volumes: 1/1 healthy                             # 追加が反映!
    pools:   3 pools, 65 pgs                         # 追加が反映!
    objects: 24 objects, 451 KiB
    usage:   8.1 MiB used, 1.8 TiB / 1.8 TiB avail   # 追加が反映!
    pgs:     65 active+clean

  progress:
    Global Recovery Event (0s)
      [............................]

创建进行挂载的用户

根据挂载CephFS的”通用前提条件”,创建能够在CephFS上进行挂载的用户。

请根据需要自行更改,在以下命令中,用户名称被设定为user。
$ sudo ceph fs authorize cephfs client.user / rw \
  | sudo tee /etc/ceph/ceph.client.user.keyring
(出力結果)
[client.user]
	key = AQAOptVqae....

修改生成的密钥的权限。

$ sudo chmod 0600 /etc/ceph/ceph.client.user.keyring

您可以通过以下方式确认已添加到 Ceph 认证凭据的用户已经生效。

$ sudo ceph auth list
(出力省略)
client.user
	key = AQAOptVqae....
	caps: [mds] allow rw fsname=cephfs
	caps: [mon] allow r fsname=cephfs
	caps: [osd] allow rw tag cephfs data=cephfs
(出力省略)

挂载CephFS

终于准备好了安装要挂载的准备工作。虽然有多种挂载方法,但这次我们将使用“使用内核驱动程序挂载CEPHFS”的方法来进行挂载。
虽然官方网站上写了很多,但只需执行以下命令,应该就可以挂载成功了。

$ sudo mount -t ceph user@.cephfs=/ /path/to/mount
$ df -h
Filesystem   Size  Used Avail Use% Mounted on
...
[IP]:6789:/  1.8T     0  1.8T   0% /path/to/mount

说明

user@.cephfs=/のフォーマット

user : 手順(4)で作成したマウント用のユーザ名

cephfs : 手順(2)で作成したファイルシステム名

/ : マウント元のパス

/path/to/mount

マウント先のパス。mkdir等で事前に作成が必要

为了确认如何使用-v选项进行挂载,试着卸载一次,然后检查。

$ sudo umount /path/to/mount
$ sudo mount -t ceph user@.cephfs=/ /path/to/mount -v
(出力結果)
parsing options: rw,secret=AQAOptVqae....
mount.ceph: resolved to: "[IP]:3300"
mount.ceph: trying mount with new device syntax: user@[fsid].cephfs=/
mount.ceph: options "name=user,ms_mode=prefer-crc,key=user,mon_addr=[IP]:3300" will pass to kernel
mount.ceph: switching to using v1 address with old syntax
mount.ceph: resolved to: "[IP]:6789"
mount.ceph: trying mount with old device syntax: [IP]:6789:/
mount.ceph: options "name=user,key=user,mds_namespace=cephfs,fsid=[fsid]" will pass to kernel

从输出结果来看,我们可以发现mount.ceph命令可以找到在mount命令中没有指定的监视器IP、FSID和保密信息等。关于这方面的内容,可以参考《MOUNT.CEPH – MOUNT A CEPH FILE SYSTEM》等文档进行了解。

顺便提一下,您也可以通过参数来指定以下所有的信息。

$ sudo mount -t ceph \
  user@[fsid].cephfs=/ \
  /path/to/mount \
  -o mon_addr=[IP]:6789,secret=AQAOptVqae....

可能有用的安装设置

在/etc/fstab中的配置

我已经在网站上解释了,但是你可以在/etc/fstab中进行以下的追加,并成功挂载。

[IP]:6789:/ /path/to/mount ceph name=user 0 0

还有,可以省略(IP): 6789,在下面也可以。

:/ /path/to/mount ceph name=user 0 0

使用autofs进行配置

在autofs的情况下,在指定挂载路径的文件中追加以下内容,即可进行挂载。
与fstab不同,如果不填写[IP]:6789,则无法进行挂载。

some-path -fstype=ceph,name=user [IP]:6789:/

其他

更改OSD的内存使用量

在树莓派上构建Ceph并尝试进行文件复制等操作时,ceph-osd进程会立即耗尽内存,导致机器停止运行。因此,使用osd_memory_target命令更改OSD使用的内存大小可能是个好主意。文件中默认指定为4GB,经过确认果然是这样。

$ sudo ceph config get osd.0 osd_memory_target
4294967296

当我试图将容量调整到大约500MB时,却因“超过最低限度”而受到责备。

$ sudo ceph config set osd.0 osd_memory_target 500000000
Error EINVAL: error parsing value: Value '500000000' is below minimum 939524096

于是,将出现错误的数值(允许的最大值)进行更改后,通过了。

$ sudo ceph config set osd.0 osd_memory_target 939524096
要反映设置需要重新启动机器。
虽然未经确认,但可能通过docker容器重启[OSD容器名]来重新启动容器并进行反映。

重启OSD的脚本(2022年2月23日更新)

由于更改OSD的内存使用上限无法解决内存耗尽问题,因此我编写了一个用于重启OSD的Shell脚本,并存储在下面的GitHub中。

 

广告
将在 10 秒后关闭
bannerAds