一、CephFS架构
Ceph 文件系统(CephFS
)是 Ceph 提供的分布式文件系统。它建立在 Ceph 的对象存储之上,利用 RADOS(Reliable Autonomic Distributed Object Store)
来实现文件数据和元数据的分布式存储与管理。
CephFS就是Ceph Filesystem
可以实现文件系统功能功能(符合POSIX
标准-可移植操作系统接口),以实现内核中的ceph客户端模块被应用程序调用,客户端通过ceph协议挂载并使用ceph集群作为数据存储服务器。
CephFS需要运行Meta Data Services(MDS)
服务,守护进程为ceph-mds
,ceph-mds
进程管理与CephFS上存储的文件相关的元数据
,并协调对ceph存储集群的访问。
在 linux 系统使用 ls 等操作查看某个目录下的文件的时候,会有保存在磁盘上的分区表记录
文件的名称
、创建日期
、大小
、inode及存储位置等元数据信息
,在 cephfs 由于数据是被打散为若干个离散的 object进行分布式存储,因此并没有统一保存文件的元数据,而且将文件的元数据保存到一个单独的存储池matedata pool
,但是客户端并不能直接访问matedata pool
中的元数据信息,而是在读写数的时候有由MDS(matadata server)
进行处理,读数据的时候由 MDS 从matedata pool
加载元数据然后缓存在内存
(用于后期快速响应其它客户端的请求)并返回给客户端,写数据的时候由 MDS 缓存在内存并同步到 matedatapool。
Cephfs的mds的数据结构类似于linux系统的根形目录结构及nginx中的缓存目录分层一样
nginx缓存目录:
[root@Cnpereading5-2 cache]# pwd
/var/cache/nginx/cache
[root@Cnpereading5-2 cache]# ll
total 64
drwx------ 239 root root 4096 Sep 3 11:42 0
drwx------ 233 root root 4096 Sep 3 12:50 1
drwx------ 237 root root 4096 Sep 3 11:41 2
drwx------ 239 root root 4096 Sep 3 12:24 3
drwx------ 236 root root 4096 Sep 3 11:39 4
drwx------ 242 root root 4096 Sep 3 12:23 5
drwx------ 240 root root 4096 Sep 3 11:43 6
drwx------ 233 root root 4096 Sep 3 10:53 7
drwx------ 239 root root 4096 Sep 3 12:34 8
drwx------ 231 root root 4096 Sep 3 11:24 9
drwx------ 234 root root 4096 Sep 3 12:50 a
drwx------ 241 root root 4096 Sep 3 12:50 b
drwx------ 239 root root 4096 Sep 3 12:40 c
drwx------ 242 root root 4096 Sep 3 12:23 d
drwx------ 237 root root 4096 Sep 3 12:50 e
drwx------ 242 root root 4096 Sep 3 12:48 f
[root@Cnpereading5-2 cache]# ll 0/ff
total 64
-rw------- 1 root root 16890 Sep 3 10:22 4fdb35100a5cbe2b065b1c382ad1fff0
-rw------- 1 root root 23236 Sep 2 17:24 63439860f8f25d1e37e1e17e21c2bff0
-rw------- 1 root root 19591 Sep 3 10:51 f36dd93588e69e3acc997b2cb0b9dff0
二、部署CepfFS服务
1、部署MDS服务
如果要使用cephFS,需要部署mds服务
root@ceph-node1:~# apt install ceph-mds
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
ceph-mds is already the newest version (18.2.4-1jammy).
0 upgraded, 0 newly installed, 0 to remove and 8 not upgraded.
cephadmin@ceph-deploy:~/ceph-cluster$ ceph-deploy mds create ceph-node1
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/cephadmin/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/local/bin/ceph-deploy mds create ceph-node1
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] subcommand : create
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x74edce589500>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] func : <function mds at 0x74edce5df1d0>
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] mds : [('ceph-node1', 'ceph-node1')]
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.mds][DEBUG ] Deploying mds, cluster ceph hosts ceph-node1:ceph-node1
[ceph-node1][DEBUG ] connection detected need for sudo
[ceph-node1][DEBUG ] connected to host: ceph-node1
[ceph-node1][DEBUG ] detect platform information from remote host
[ceph-node1][DEBUG ] detect machine type
[ceph_deploy.mds][INFO ] Distro info: debian bookworm/sid sid
[ceph_deploy.mds][DEBUG ] remote host will use systemd
[ceph_deploy.mds][DEBUG ] deploying mds bootstrap to ceph-node1
[ceph-node1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph-node1][WARNIN] mds keyring does not exist yet, creating one
[ceph-node1][DEBUG ] create a keyring file
[ceph-node1][DEBUG ] create path if it doesn't exist
[ceph-node1][INFO ] Running command: sudo ceph --cluster ceph --name client.bootstrap-mds --keyring /var/lib/ceph/bootstrap-mds/ceph.keyring auth get-or-create mds.ceph-node1 osd allow rwx mds allow mon allow profile mds -o /var/lib/ceph/mds/ceph-ceph-node1/keyring
[ceph-node1][INFO ] Running command: sudo systemctl enable ceph-mds@ceph-node1
[ceph-node1][WARNIN] Created symlink /etc/systemd/system/ceph-mds.target.wants/ceph-mds@ceph-node1.service → /lib/systemd/system/ceph-mds@.service.
[ceph-node1][INFO ] Running command: sudo systemctl start ceph-mds@ceph-node1
[ceph-node1][INFO ] Running command: sudo systemctl enable ceph.target
到node1上查看进程是否启动
root@ceph-node1:~# ps -ef| grep mds
ceph 34607 1 3 13:16 ? 00:00:00 /usr/bin/ceph-mds -f --cluster ceph --id ceph-node1 --setuser ceph --setgroup ceph
root 34669 34319 0 13:16 pts/2 00:00:00 grep --color=auto mds
2、创建CephFS metadata和data存储池
使用CephFS之前需要事先于集群中创建一个文件系统,并为他分别指定元数据和数据相关的存储池。下面创建一个名为cephfs的文件系统用于测试,它使用cephfs-metadata为
元数据存储池,使用cephfs-data
为数据存储池,我事先已经创建好了
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool create nginxFS-metadata 32 32
pool 'nginxFS-metadata' created
cephadmin@ceph-deploy:~/ceph-cluster$
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool create nginxFS-data 128 128
pool 'nginxFS-data' created
cephadmin@ceph-deploy:~/ceph-cluster$ ceph -s
cluster:
id: 74d6f368-8875-4340-857f-0daa3e96b5dc
health: HEALTH_WARN
1 pool(s) do not have an application enabled
services:
mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 2h)
mgr: ceph-mgr1(active, since 6d), standbys: ceph-mgr2
mds: 1/1 daemons up, 1 standby
osd: 16 osds: 16 up (since 3d), 16 in (since 4d)
rgw: 1 daemon active (1 hosts, 1 zones)
data:
volumes: 1/1 healthy
pools: 10 pools, 353 pgs
objects: 422 objects, 147 MiB
usage: 1.8 GiB used, 3.1 TiB / 3.1 TiB avail
pgs: 353 active+clean
3、创建cephFS并验证
nginxFS 为cephfs名称,nginxFS-metadata 元数据池,nginxFS-data 数据池,顺序不能乱
cephadmin@ceph-deploy:~/ceph-cluster$ ceph fs new nginxFS nginxFS-metadata nginxFS-data
Pool 'nginxFS-data' (id '16') has pg autoscale mode 'on' but is not marked as bulk.
Consider setting the flag by running
# ceph osd pool set nginxFS-data bulk true
new fs with metadata pool 15 and data pool 16
验证cephfs状态,状态为active则为正常
cephadmin@ceph-deploy:~/ceph-cluster$ ceph mds stat
mycephfs:1 nginxFS:1 {mycephfs:0=ceph-mgr1=up:active,nginxFS:0=ceph-node1=up:active}
4、创建客户端账户
# 创建用户
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth add client.lisi mon 'allow r' mds 'allow rw' osd 'allow rwx pool=nginxFS-data'
added key for client.lisi
#验证用户
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth get client.lisi
[client.lisi]
key = AQBZntZmXCzTNxAArxGewqOwNoYPvyyhdXmByA==
caps mds = "allow rw"
caps mon = "allow r"
caps osd = "allow rwx pool=nginxFS-data"
# 创建keyring文件
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth get client.lisi -o ceph.client.lisi.keyring
# 创建key文件
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth print-key client.lisi > lisi.key
cephadmin@ceph-deploy:~/ceph-cluster$
cephadmin@ceph-deploy:~/ceph-cluster$ cat ceph.client.lisi.keyring
[client.lisi]
key = AQBZntZmXCzTNxAArxGewqOwNoYPvyyhdXmByA==
caps mds = "allow rw"
caps mon = "allow r"
caps osd = "allow rwx pool=nginxFS-data"
5、安装ceph客户端并同步认证文件
在客户端执行
root@ceph-node1:/etc/ceph# vim ceph.client.lisi.keyring
root@ceph-node1:/etc/ceph#
root@ceph-node1:/etc/ceph# cat ceph.client.lisi.keyring
[client.lisi]
key = AQBZntZmXCzTNxAArxGewqOwNoYPvyyhdXmByA==
caps mds = "allow rw"
caps mon = "allow r"
caps osd = "allow rwx pool=nginxFS-data"
root@ceph-node1:/etc/ceph#
root@ceph-node1:/etc/ceph#
root@ceph-node1:/etc/ceph# ceph --id lisi -s
cluster:
id: 74d6f368-8875-4340-857f-0daa3e96b5dc
health: HEALTH_WARN
insufficient standby MDS daemons available
1 pool(s) do not have an application enabled
services:
mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 2h)
mgr: ceph-mgr1(active, since 6d), standbys: ceph-mgr2
mds: 2/2 daemons up
osd: 16 osds: 16 up (since 3d), 16 in (since 4d)
rgw: 1 daemon active (1 hosts, 1 zones)
data:
volumes: 2/2 healthy
pools: 12 pools, 428 pgs
objects: 444 objects, 147 MiB
usage: 1.9 GiB used, 3.1 TiB / 3.1 TiB avail
pgs: 428 active+clean
6、内核空间挂载ceph-fs
客户端挂载一般有几种方式:
内核客户端(Kernel Client)
:使用内置于 Linux 内核中的 Ceph 文件系统模块(ceph 模块)进行挂载。这种方式性能较高,适合需要高吞吐量和低延迟的应用场景。FUSE 客户端(Filesystem in Userspace)
:使用ceph-fuse
工具在用户空间挂载 CephFS。这种方式不需要特权操作,适合在不方便修改内核或没有内核支持的环境中使用。CIFS/SMB 方式挂载
:通过Samba
服务将CephFS
共享出来,然后使用CIFS/SMB
协议挂载。这种方式适合需要跨平台文件共享的场景。NFS 方式挂载
:通过 Ceph 提供的NFS-Ganesha
服务将CephFS 共享
出来,然后使用NFS 协议
挂载。这种方式适合需要跨平台文件共享
和传统 NFS 客户端的场景。
最常用的就是内核空间挂载。
6.1 客户端通过key文件挂载
root@ceph-node1:/etc/ceph# mkdir /data
# 6789是mon的端口,secret就是上面导出的lisi的key
# fs=xxx 挂载的时候指定挂载哪个mds(因为我这里创建了2个mds,如果只有1个则不用写)
root@ceph-node1:~# mount -t ceph 192.168.31.51:6789,192.168.31.52:6789,192.168.31.53:6789:/ /data -o name=lisi,secret=AQBZntZmXCzTNxAArxGewqOwNoYPvyyhdXmByA==,fs=nginxFS
root@ceph-node1:/etc/ceph# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.6G 2.0M 1.6G 1% /run
/dev/sda3 196G 13G 173G 7% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
/dev/sda2 512M 6.1M 506M 2% /boot/efi
tmpfs 1.6G 44K 1.6G 1% /run/user/1000
tmpfs 7.8G 76K 7.8G 1% /var/lib/ceph/osd/ceph-0
tmpfs 7.8G 76K 7.8G 1% /var/lib/ceph/osd/ceph-1
tmpfs 7.8G 76K 7.8G 1% /var/lib/ceph/osd/ceph-2
tmpfs 7.8G 76K 7.8G 1% /var/lib/ceph/osd/ceph-3
192.168.31.51:6789,192.168.31.52:6789,192.168.31.53:6789:/ 1013G 0 1013G 0% /data
# 验证写入数据
root@ceph-node1:/data# dd if=/dev/zero of=/data/testfile bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.913114 s, 115 MB/s
root@ceph-node1:/data#
root@ceph-node1:/data# ll /data/
total 102404
drwxr-xr-x 2 root root 2 9月 3 13:53 ./
drwxr-xr-x 21 root root 4096 8月 30 14:43 ../
-rw-r--r-- 1 root root 0 9月 3 13:49 232.txt
-rw-r--r-- 1 root root 104857600 9月 3 13:53 testfile
# 查看挂载点信息
root@ceph-node1:/data# stat -f /data
File: "/data"
ID: 5e084a4700000002 Namelen: 255 Type: ceph
Block size: 4194304 Fundamental block size: 4194304
Blocks: Total: 259199 Free: 259174 Available: 259174
Inodes: Total: 25 Free: -1
6.2 开机自动挂载
root@ceph-node1:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda3 during installation
UUID=150a8624-6c19-4017-b12b-ef299c2bbbde / ext4 errors=remount-ro 0 1
# /boot/efi was on /dev/sda2 during installation
UUID=18E6-2957 /boot/efi vfat umask=0077 0 1
/swapfile none swap sw 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0
192.168.31.51:6789,192.168.31.52:6789,192.168.31.53:6789:/ /data ceph defaults,name=lisi,secret=AQBZntZmXCzTNxAArxGewqOwNoYPvyyhdXmByA==,fs=nginxFS,_netdev 0 0
root@ceph-node1:~# mount -a
7、客户端模块挂载
客户端内核加载 ceph.ko 模块挂载 cephfs 文件系统
libcrc32c.ko 是 Linux 内核中提供的 CRC32C 算法的模块,其作用是为内核和其他模块提供CRC32C 校验功能。CRC32C 是一种循环冗余校验(CRC)算法,通常用于检测数据的完整性,特别适用于网络通信、存储系统等领域,可以在数据传输、存储过程中使用 CRC32C 校验来检测数据是否被篡改或损坏。
7.1 用户空间挂载ceph-fs
如果内核本较低而没有 ceph 模块,那么可以安装 ceph-fuse
挂载,但是推荐使用内核模块挂载。
7.1.1 安装ceph-fuse
root@ceph-node2:~# apt install ceph-fuse
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
ceph-fuse
0 upgraded, 1 newly installed, 0 to remove and 8 not upgraded.
Need to get 831 kB of archives.
After this operation, 2,451 kB of additional disk space will be used.
Get:1 https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-reef jammy/main amd64 ceph-fuse amd64 18.2.4-1jammy [831 kB]
Fetched 831 kB in 8s (103 kB/s)
Selecting previously unselected package ceph-fuse.
(Reading database ... 197408 files and directories currently installed.)
Preparing to unpack .../ceph-fuse_18.2.4-1jammy_amd64.deb ...
Unpacking ceph-fuse (18.2.4-1jammy) ...
Setting up ceph-fuse (18.2.4-1jammy) ...
Created symlink /etc/systemd/system/remote-fs.target.wants/ceph-fuse.target → /lib/systemd/system/ceph-fuse.target.
Created symlink /etc/systemd/system/ceph.target.wants/ceph-fuse.target → /lib/systemd/system/ceph-fuse.target.
Processing triggers for man-db (2.10.2-1) ...
root@ceph-node2:~# apt install ceph-common
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
ceph-common is already the newest version (18.2.4-1jammy).
0 upgraded, 0 newly installed, 0 to remove and 8 not upgraded.
7.2 ceph-fuse挂载
root@ceph-node2:/etc/ceph# ceph-fuse --name client.lisi -m 192.168.31.51:6789,192.168.31.52:6789,192.168.31.53:6789 /data
2024-09-03T14:25:26.454+0800 73c375c14580 -1 init, newargv = 0x6210954f5950 newargc=15
ceph-fuse[28611]: starting ceph client
ceph-fuse[28611]: starting fuse
root@ceph-node2:/etc/ceph#
root@ceph-node2:/etc/ceph# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.6G 1.9M 1.6G 1% /run
/dev/sda3 196G 13G 173G 7% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
/dev/sda2 512M 6.1M 506M 2% /boot/efi
tmpfs 1.6G 44K 1.6G 1% /run/user/1000
tmpfs 7.8G 76K 7.8G 1% /var/lib/ceph/osd/ceph-4
tmpfs 7.8G 76K 7.8G 1% /var/lib/ceph/osd/ceph-5
tmpfs 7.8G 76K 7.8G 1% /var/lib/ceph/osd/ceph-6
tmpfs 7.8G 76K 7.8G 1% /var/lib/ceph/osd/ceph-7
ceph-fuse 1013G 0 1013G 0% /data
root@ceph-node2:/etc/ceph#
root@ceph-node2:/etc/ceph# ll /data/
total 5
drwxr-xr-x 2 root root 0 9月 3 13:43 ./
drwxr-xr-x 21 root root 4096 9月 3 14:25 ../
-rw-r--r-- 1 root root 0 9月 3 13:43 issue
-rw-r----- 1 root root 0 9月 3 13:43 syslog
-rw-r--r-- 1 root root 0 9月 3 13:43 testfile
三、Ceph MDS高可用
1、高可用介绍
Ceph MDS 作为ceph的访问入口,需要实现高性能及数据备份,而MDS支持多MDS结构,甚至还能实现redis cluster的多主从结构,以实现MDS服务的高性能和高可用,假设启动4个MDS进程,设置最大max_mds为2,这时候有2个mds称为主节点,另外的两个mds作为备用节点。
设置每个主节点专用的备份MDS,也就是如果此主节点出现问题马上切换到另个MDS接管主MDS并继续对外提供元数据读写,设置备份MDS的常用选项如下:
mds_standby_replay
:值为 true 或 false,true 表示开启 replay 模式,这种模式下主 MDS缓存的元数据将实时与从 MDS 同步,如果主宕机,从可以快速的切换。如果为 false 只有宕机的时候才去同步数据,这样会有一段时间的中断。
mds_standby_for_name
:设置当前 MDS 进程只用于备份于指定名称的 MDS。
mds_standby_for_rank
:设置当前 MDS 进程只用于备份于哪个 Rank((上级节点),通常为Rank编号。另外在存在多个 CephFS 文件系中,还可以使用 mds_standby_for_fscid 参数来为指定不同的文件系统。
mds_standby_for_fscid
:指定 CephFS 文件系统 ID,需要联合 mds_standby_for_rank生效,如果设置 mds_standby_for_rank,那么就是用于指定文件系统的指定 Rank,如果没有设置,就是指定文件系统的所有Rank。
2、 查看当前mds
cephadmin@ceph-deploy:~/ceph-cluster$ ceph mds stat
mycephfs:1 nginxFS:1 {mycephfs:0=ceph-mgr1=up:active,nginxFS:0=ceph-node1=up:active}
添加MDS服务器
将 ceph-mon1
和 ceph-mon2
和 ceph-mon3
作为 mds 服务角色添加至 ceph 集群,最后实两主两备的 mds 高可用和高性能结构。
#mds 服务器安装 ceph-mds 服务
[root@ceph-mon1 ~]# apt install ceph-mds -y
[root@ceph-mon2 ~]# apt install ceph-mds -y
[root@ceph-mon3 ~]# apt install ceph-mds -y
#添加 mds 服务器
[cephadmin@ceph-deploy ceph-cluster]$ ceph-deploy mds create ceph-mon1
[cephadmin@ceph-deploy ceph-cluster]$ ceph-deploy mds create ceph-mon2
[cephadmin@ceph-deploy ceph-cluster]$ ceph-deploy mds create ceph-mon3
#验证 mds 服务器当前状态:
# 当前处于激活状态的 mds 服务器有两台,处于备份状态的 mds 服务器有三台。
cephadmin@ceph-deploy:~/ceph-cluster$ ceph fs status
mycephfs - 2 clients
========
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph-mgr1 Reqs: 0 /s 16 17 12 6
POOL TYPE USED AVAIL
cephfs-metadata metadata 267k 1012G
cephfs-data data 0 1012G
nginxFS - 1 clients
=======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph-node1 Reqs: 0 /s 12 15 12 3
POOL TYPE USED AVAIL
nginxFS-metadata metadata 177k 1012G
nginxFS-data data 300M 1012G
STANDBY MDS
ceph-mon2
ceph-mon1
ceph-mon3
MDS version: ceph version 18.2.4 (e7ad5345525c7aa95470c26863873b581076945d) reef (stable)
cephadmin@ceph-deploy:~/ceph-cluster$ ceph mds stat
mycephfs:1 nginxFS:1 {mycephfs:0=ceph-mgr1=up:active,nginxFS:0=ceph-node1=up:active} 3 up:standby
在 CephFS 文件系统中,DNS、INOS、DIRS 和 CAPS 分别代表以下内容:
Rank
:当前 MDS (Metadata Server)实例的唯一编号。
Activity
: 列会显示当前正在处理的请求数量和类型。
DNS
: 表示分布式命名空间(Distributed Namespace)的数量,即文件系统中的命名空间数量。
/myfiles/
├── file1.txt
├── dir1/
│ ├── file2.txt
│ └── file3.txt
└── dir2/
├── file4.txt
└── file5.txt
在上面的示例中,/myfiles 命名空间保存了所有文件和目录的信息,包括文件和目录的名称、大小、权限、创建和修改时间等元数据信息,此外,还包含了文件和目录之间的层次结构,即 dir1和 dir2 是/myfiles 下的两个子目录,而 file1.txt、dir1 和 dir2 位于 myfiles 下、file2.txt 和 file3.txt位于 dir1、file4.txt 和 file5.txt 位于 dir2、但是他们都位于 /myfiles 下。
INOS
: 代表当前文件系统中的 inode(index node)对象的数量。
DIRS
: 表示目录(directory)的数量
CAPS
: 代表文件系统中的 capability 的数量,这些 capability 用于控制对文件和目录的访问权
限。
3、 当前文件系统状态
cephadmin@ceph-deploy:~/ceph-cluster$ ceph fs get mycephfs
Filesystem 'mycephfs' (1)
fs_name mycephfs
epoch 4
flags 12 joinable allow_snaps allow_multimds_snaps
created 2024-08-30T14:07:50.936780+0800
modified 2024-08-30T14:07:51.943940+0800
tableserver 0
root 0
session_timeout 60
session_autoclose 300
max_file_size 1099511627776
max_xattr_size 65536
required_client_features {}
last_failure 0
last_failure_osd_epoch 0
compat compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,7=mds uses inline data,8=no anchor table,9=file layout v2,10=snaprealm v2}
max_mds 1
in 0
up {0=5850}
failed
damaged
stopped
data_pools [12]
metadata_pool 11
inline_data disabled
balancer
bal_rank_mask -1
standby_count_wanted 1
[mds.ceph-mgr1{0:5850} state up:active seq 18 addr [v2:192.168.31.54:6802/7355217,v1:192.168.31.54:6803/7355217] compat {c=[1],r=[1],i=[7ff]}]
4、 设置处理激活状态mds的数量
目前有五 mds 服务器,但是每个mds一个主三个备,可以优化一下部署架构,设置为每个nfs,两主两备。
cephadmin@ceph-deploy:~/ceph-cluster$ ceph fs set mycephfs max_mds 2
cephadmin@ceph-deploy:~/ceph-cluster$
cephadmin@ceph-deploy:~/ceph-cluster$
cephadmin@ceph-deploy:~/ceph-cluster$ ceph fs set nginxFS max_mds 2
cephadmin@ceph-deploy:~/ceph-cluster$
cephadmin@ceph-deploy:~/ceph-cluster$ ceph fs status
mycephfs - 2 clients
========
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph-mgr1 Reqs: 0 /s 16 17 12 6
1 active ceph-mon3 Reqs: 0 /s 10 13 11 0
POOL TYPE USED AVAIL
cephfs-metadata metadata 339k 1012G
cephfs-data data 0 1012G
nginxFS - 1 clients
=======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph-node1 Reqs: 0 /s 12 15 12 3
1 active ceph-mon1 Reqs: 0 /s 10 13 11 0
POOL TYPE USED AVAIL
nginxFS-metadata metadata 249k 1012G
nginxFS-data data 300M 1012G
STANDBY MDS
ceph-mon2
ceph-node3
MDS version: ceph version 18.2.4 (e7ad5345525c7aa95470c26863873b581076945d) reef (stable)
5、 MDS高可用优化
目前mycephfs的状态是 ceph-mgr1 和 ceph-mon3 分别是 active 状态,ceph-mon3 和 ceph-node3 分别处于 standby 状态,现在可以将 ceph-mon2 设置为 ceph-mgr1 的 standby,将 ceph-node3 设置为 ceph-mon3 的 standby,以实现每个主都有一个固定备份角色的结构,则修改配置文件如下:
cephadmin@ceph-deploy:~/ceph-cluster$ cat ceph.conf
[global]
fsid = 74d6f368-8875-4340-857f-0daa3e96b5dc
public_network = 192.168.31.0/24
cluster_network = 192.168.91.0/24
mon_initial_members = ceph-mon1,ceph-mon2,ceph-mon3
mon_host = 192.168.31.51,192.168.31.52,192.168.31.53
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
mon clock drift allowed = 2
mon clock drift warn backoff = 30
[mds.ceph-mon2]
mds_standby_for_fscid = mycephfs
mds_standby_for_name = ceph-mgr1
mds_standby_replay = true
[mds.ceph-mgr1]
mds_standby_for_fscid = mycephfs
mds_standby_for_name = ceph-mon2
mds_standby_replay = true
[mds.ceph-mon3]
mds_standby_for_fscid = mycephfs
mds_standby_for_name = ceph-node3
mds_standby_replay = true
[mds.ceph-node3]
mds_standby_for_fscid = mycephfs
mds_standby_for_name = ceph-mon3
mds_standby_replay = true
分发配置文件并重启mds服务
$ ceph-deploy --overwrite-conf config push ceph-mgr1
$ ceph-deploy --overwrite-conf config push ceph-mon2
$ ceph-deploy --overwrite-conf config push ceph-node3
$ ceph-deploy --overwrite-conf config push ceph-mon3
重启备份节点:
[root@ceph-mon2 ~]# systemctl restart ceph-mds@ceph-mon2.service
[root@ceph-mgr2 ~]# systemctl restart ceph-mds@ceph-node3.service
停止不分主节点测试主从切换及 cephfs 可用性:
[root@ceph-mon3 ~]# systemctl restart ceph-mds@ceph-mgr1.service
查看active和standby对应关系
cephadmin@ceph-deploy:~/ceph-cluster$ ceph fs get mycephfs
可以看到停止mgr1的mds之后,node3马上就提升为主,就算把mgr1重启之后他还是变成了standby
6、主从切换过程
1. 故障检测:
Ceph 集群持续监控所有 MDS 的状态。如果活跃 MDS 发生故障(例如崩溃或网络故障),监控系统会立即检测到。
2. 故障报告:
监控系统会将故障信息报告给 Ceph Monitor(MON)
节点。MON 节点负责协调和管理集群的状态信息。
3. 选举新的活跃 MDS:
Ceph Monitor
会从备用 MDS 列表中选出一个新的 MDS 接管故障的活跃 MDS 的角色。选举过程包括以下几个步骤:
- 检查备用 MDS 的健康状态。
- 确定最合适的备用 MDS(通常是
standby-replay
模式的 MDS,因为它们已经在接收和回放活跃 MDS 的日志,能够快速接管)。
4. 切换过程:
- 选出的备用 MDS 会通知其他集群组件(包括客户端和 OSD)它即将成为新的活跃 MDS。
- 备用 MDS 读取并应用故障 MDS 的最新日志(如果在 standby-replay 模式下,日志已经在同步,切换会更快)。
- 备用 MDS 宣布自己为新的活跃 MDS,并开始接收和处理客户端的请求。
5. 客户端重新连接:
- 客户端检测到当前连接的活跃 MDS 不可用,会根据 Monitors 提供的信息重新连接到新的活跃 MDS。
- 客户端恢复正常操作,文件系统继续工作。
四、通过ganesha将cephfs导出为NFS
通过 ganesha 将 cephfs 通过 NFS 协议共享使用。
https://www.server-world.info/en/note?os=Ubuntu_20.04&p=ceph15&f=8
4.1 服务端配置
如果在mgr节点配置,并提前准备号ceph.conf
和ceph.client.admin.keyring
认证文件
root@ceph-mgr1:/etc/ceph# ll ceph.client.admin.keyring ceph.conf
-rw------- 1 root root 151 8月 30 14:51 ceph.client.admin.keyring
-rw-r--r-- 1 root root 811 9月 3 15:07 ceph.conf
root@ceph-mgr1:/etc/ceph# apt install nfs-ganesha-ceph
root@ceph-mgr1:/etc/ceph# cd /etc/ganesha
root@ceph-mgr1:/etc/ganesha# cat ganesha.conf
NFS_CORE_PARAM {
# disable NLM
Enable_NLM = false;
# disable RQUOTA (not suported on CephFS)
Enable_RQUOTA = false;
# NFS protocol
Protocols = 4;
}
EXPORT_DEFAULTS {
# default access mode
Access_Type = RW;
}
EXPORT {
# uniq ID
Export_Id = 1;
# mount path of CephFS
Path = "/";
FSAL {
fs_name = "nginxFS";
user_id= "lisi";
name = CEPH;
# hostname or IP address of this Node
hostname="192.168.31.54";
}
# setting for root Squash
Squash="No_root_squash";
# NFSv4 Pseudo path
Pseudo="/nginx";
# allowed security options
SecType = "sys";
}
LOG {
# default log level
Default_Log_Level = WARN;
}
root@ceph-mgr1:/etc/ganesha# systemctl restart nfs-ganesha
root@ceph-mgr1:/etc/ganesha# systemctl status nfs-ganesha
root@ceph-mgr1:/etc/ganesha# tail -f /var/log/ganesha/ganesha.log
4.2 客户端挂载测试
root@ceph-mgr1:/etc/ganesha# mount -t nfs 192.168.31.54:/nginx /test
root@ceph-mgr1:/etc/ganesha# ll /test/
total 5
drwxr-xr-x 2 root root 0 9月 3 14:41 ./
drwxr-xr-x 22 root root 4096 9月 3 16:02 ../
-rw-r--r-- 1 root root 0 9月 3 13:43 issue
-rw-r--r-- 1 root root 0 9月 3 14:41 nima
-rw-r----- 1 root root 0 9月 3 13:43 syslog
-rw-r--r-- 1 root root 0 9月 3 13:43 testfile